哪个更好?
if not var:
var = get_var()
(或)
var = var或get_var()
另外,我怎么知道两者中哪一个更好?
编辑:
另一个来自史蒂夫的选项,
var = var if var else get_var()
答案 0 :(得分:7)
你更喜欢的那个越好。我会使用if
的第一个版本,但这非常个人化。
答案 1 :(得分:7)
当两种风格变化风格如此接近时,我使用timeit
作为打破平局:更快必须意味着更接近Python的主流,即更好。嘿,这比无休止的辩论更好,是吗? - )所以:
$ python -mtimeit -s'var=0; getvar=lambda:0' 'var = var or getvar()'
1000000 loops, best of 3: 0.359 usec per loop
$ python -mtimeit -s'var=0; getvar=lambda:0' 'if not var: var = getvar()'
1000000 loops, best of 3: 0.361 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'var = var or getvar()'
10000000 loops, best of 3: 0.123 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'if not var: var = getvar()'
10000000 loops, best of 3: 0.0899 usec per loop
if
拥有它 - 等同于var
为假,更快true
。
答案 2 :(得分:4)
实际上,如果您尝试使用对get_var的调用来确定之前是否已设置var,那么我认为 这两种形式都是错误的 。 Python将一些完全普通的值视为对布尔值'false'的评估:0,None,[],(,),set()和{}。所以让我们说var将是一个整数,并且get_var()恰好返回0.现在,无论你使用哪种形式,get_var()都会一次又一次地被调用,即使我们已经知道var是0! / p>
有几种方法可以检测变量是否已定义:
查看globals()或locals()返回的dict
将语句var = var
包装在try / except块中,捕获NameError
使用像None这样的sentinel值,并将var初始化为此值;然后你可以测试if var is None: var = get_var()
(使用'是',而不是'==')。如果你运气不好,并且None是从get_var()返回的潜在值,那么你需要使用NOT_DEFINED = object()
之类的东西定义你自己的特殊的尚未定义的值,用它初始化var,然后你可以测试if var is NOT_DEFINED
。
答案 3 :(得分:2)
第一个版本对我来说更直观。但话又说回来,这完全取决于你自己的品味。
答案 4 :(得分:2)
对我而言,第一个使用显式if的成语更可取,因为更明确。
然而,我已经看到或构造被引用为首选/更多pythonic。
所以,一方面,Explicit is better than implicit
(禅宗引用),另一方面,短表达可以被视为pythonic(虽然在所有情况下短的不等于pythonic!)
一个密切相关的SO问题是most idiomatic way to convert None to empty string,if和the或者成语都列在那里。
答案 5 :(得分:1)
第二个是pythonic,我通常使用它。
答案 6 :(得分:1)
两者都不对。
前者对于阅读代码的人来说更清楚。
问问自己,当你在思考你想要解决的问题时,想到的概念是否更接近“如果这个,那么那个”或“两个逻辑或几乎,但不完全,布尔”变量“。
答案 7 :(得分:1)
两者最终都会编译成相同的代码,因为它或者是一个短路运算符(如果左手是真的,它不会评估右手参数)。
我更喜欢第一个,因为它更清楚地表达了你的意图。第二个可能更紧凑。
答案 8 :(得分:1)
解释器可能会同时执行它们。关于代码可读性存在权衡。哪种陈述更容易识别它的作用?当然,第一个更清楚。对我来说,阅读这篇文章,我不得不考虑更多关于第二个。我会使用第一个,因为增加了可读性,即使第二个语句稍微“性感”。
希望这会有所帮助。
-tjw