Python 在if块中初始化变量的推荐方法

Python 在if块中初始化变量的推荐方法,python,Python,我有以下代码(减去一些其他操作): 对于msg变量,以下做法是否更好 def foobar(): if foo: msg='foo' else: msg='bar' return msg 我知道我可以将上面的函数简化为三元表达式,但是在我遗漏的每个if-else块中都有操作。如果您所展示的是msg所涉及的全部内容,那么初始化它对您没有任何帮助,第二种解决方案更好。在Python中,像第一个示例中那样在条件之前初始化没有什么好处。您只需要确保变

我有以下代码(减去一些其他操作):

对于
msg
变量,以下做法是否更好

def foobar():
    if foo:
       msg='foo'
    else:
       msg='bar'
    return msg

我知道我可以将上面的函数简化为三元表达式,但是在我遗漏的每个if-else块中都有操作。

如果您所展示的是msg所涉及的全部内容,那么初始化它对您没有任何帮助,第二种解决方案更好。

在Python中,像第一个示例中那样在条件之前初始化没有什么好处。您只需要确保变量在返回之前已初始化。这假设(基于您的示例)您正在使用“单一退出点”范式。在某些情况下,在Python中这是合适的,但在其他情况下,如果可能的话,您可以通过提前退出来获得更干净的代码

def earlyReturn(mycheck):
  if not mycheck:
    return 'You forgot something.'

  # code here if the test passes without needing an extra level of indentation.

我肯定会说越晚越好。Python不建议初始化变量。因此,如果它没有向代码添加一些有价值的东西,比如回退值,或者使代码更易于阅读,那么就应该避免这种情况,而在这种情况下,它不会这样做


编辑:我所说的回退值与thagorn和mikebabcock所建议的相同。

如果这就是全部逻辑,为什么不:

def foobar():
    msg='bar'
    if foo:
        msg='foo'
    return msg

两者都可以,但我可能会:

def foobar():
    msg='bar'
    if foo:
        msg='foo'
    return msg

我意识到有些东西被遗漏了,但是如果你实际上不需要操作msg,我想你可以直接返回想要的内容,而不需要变量<代码>返回“foo”

为了完整起见,这里有一些if/else块的单行替代方法:

msg = 'foo' if foo else 'bar'
msg = foo and 'foo' or 'bar'
msg = ('bar', 'foo')[bool(foo)]
第一条肯定是最清楚的,如果你不喜欢这一行,我建议你使用第二种方法或塔冈的答案。只有在
foo
不是bool(或0/1)时,才需要在最后一个调用中调用
bool()

显然,在您的示例函数中,您可以直接返回此值,而无需使用
msg
变量:

def foobar():
    return 'foo' if foo else 'bar'

总体而言,这是一个很好且全面的建议,但他们指出,条件块中的处理比这多。对代码的性能影响很小,如果foo
case,则为
赋值两次
msg
。在正常实践中,使用不应该是任何问题,但是构建任何性能关键的东西—此解决方案可能不是最好的。
def foobar():
    return 'foo' if foo else 'bar'