建议在if块中初始化变量的方法

时间:2012-01-19 20:56:18

标签: python

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

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

msg变量有以下更好的做法吗?

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

我知道我可以将上述函数简化为三元表达式,但是每个if-else块都有一些操作我已经遗漏了。

7 个答案:

答案 0 :(得分:6)

要么应该没事,但我可能会这样做:

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

答案 1 :(得分:4)

为了完整起见,以下是if / else块的一些替代方法:

msg = 'foo' if foo else 'bar'
msg = foo and 'foo' or 'bar'
msg = ('bar', 'foo')[bool(foo)]

第一个肯定是最清楚的,如果你不喜欢单行,我会建议使用你的第二种方法或thagorn的答案。如果bool()不是bool(或0/1),则foo调用仅在最后一次调用中是必需的。

显然,在你的示例函数中,你可以立即返回它,甚至不使用msg变量:

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

答案 2 :(得分:3)

在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.

答案 3 :(得分:2)

我意识到有一些事情遗漏了,但如果你实际上不需要操纵 msg,我想你可以只返回预期的内容,而不需要变量; return 'foo'

答案 4 :(得分:1)

我肯定会说后者更好。没有建议Python初始化变量。因此,如果它没有像代码回退值那样为代码添加某些有价值的内容,或者使代码更易于阅读,则应该避免这种情况,在这种情况下它不会。

编辑:通过后备值我的意思与thagorn和mikebabcock建议的相同。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果这是整个逻辑,为什么不这样做:

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