Python 在 if block 中定义函数,反之亦然

标签 python

我有一个功能,我想根据模式采用不同的形式。我应该将定义包含在 if 语句中还是应该将 if 放在定义中?

# Case 1
if mode == 1:
    def f(x):
        return x + 5
else:
    def f(x):
        return x - 5

# Case 2
def f(x):
    if mode == 1:
        return x + 5
    else:
        return x - 5

我过去都做过,我的静态代码分析工具似乎没有提示。所以我想知道是否有 Pythonic 推荐?

编辑:从目前的评论来看,这两种情况似乎都可以接受。这取决于用例。如果模式旨在保持不变,则首选情况 1。如果不是,则情况 2。

EDIT2:这个问题实际上是在我编写函数时出现的。它接受模式作为输入,并根据模式执行类似的操作,除了它使用单独在这些操作的函数中定义的不同子函数。由于子函数在函数运行期间保持不变,情况 1 似乎更合适。

EDIT3:更正:过去,我认为 PyLint 对案例 1 不满意。这些天,我使用 PyCharm 并且似乎没有标记案例 1 的任何问题。

最佳答案

取决于你想用它做什么。它们都可以以有用的方式使用。比较两个例子:

1.

    Mode = 1
    Number = 0
    def f(x):
        global Mode
        if Mode == 1:
            Mode = 0
            return x + 5
        else:
            Mode = 1
            return x - 5

    for i in range(0,5):
        Number += f(i)

相对:

2.
    Mode = 1
    Number = 0
    if Mode == 1:
        def f(x):
            return x + 5
    else:
        def f(x):
            return x - 5
    for i in range(0,5):
        number += f(i)

当您想在代码运行时在模式之间切换时,这些示例中的第一个是最好的。如果你只想要一个或另一个,第二个是最好的。第一个函数总是会给你答案 15,因为模式在它运行时会改变。但是,第二个函数将为您提供 35 或 -15 的输出,具体取决于您首先将模式设置为什么。

关于Python 在 if block 中定义函数,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109185/

相关文章:

python - 如果尚未导入,则 Vim 函数插入 Python 导入

python - 如何在python中测试数据库连通性?

python - boost::python 保护的析构函数问题

python - pytorch:获取给定 ImageFolder 数据集的类数

python - 如何在 Python 中使用 OpenCV Stitcher 类?

python - 为什么 Python 将列表作为元组进行匹配?

python - 如何根据列表中的元素从 Python 字典中删除元素?

python - 将 docker 容器重置/恢复到其原始图像状态的最佳方法

python - 正则表达式来匹配某些字符

python - 安排在 ${sometime} 执行代码而无需重新输入的干净方法,怎么样?