Python在块内定义函数,反之亦然

时间:2017-07-14 18:03:09

标签: 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的任何问题。

3 个答案:

答案 0 :(得分:0)

取决于您想要使用它的内容。它们都可以以有用的方式使用。比较两个例子:

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,具体取决于您首先设置模式的内容。

答案 1 :(得分:0)

您的功能行为不应该依赖于外部值,因此我建议使用第一个示例:

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

答案 2 :(得分:0)

1 in 2:

def f(x):
    try:
        f.static_mode
    except AttributeError as ae:
        f.static_mode = mode
    if f.static_mode == 1:
        return x + 5
    else:
        return x - 5

2 in 1 :(无意义)