我有以下代码(减去其他一些操作):
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块都有一些操作我已经遗漏了。
答案 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