Python:避免条件?

时间:2010-03-11 06:00:17

标签: python variable-assignment conditional-statements

哪个更好?

if not var:
    var = get_var()
(或)

  

var = var或get_var()

另外,我怎么知道两者中哪一个更好?
编辑:
另一个来自史蒂夫的选项,

var = var if var else get_var()

9 个答案:

答案 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