2013-10-31 37 views
1

假设我有一个条件评估为布尔值,condition,我想将变量foo设置为取决于该条件的值。Python:大多数习惯用法有条件设置变量的方法?

我可以用几种不同的方式编写(为了简单起见,我们假设some_valuesome_other_value是常量而不是函数调用)。这里有一个办法:

foo = None 
if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

这种做法很好,因为foo在顶部明确宣布;但有点冗长。我们可以把它写更简单地称为:

if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

这节省了我们的任务,但一些程序员能找到的foo的范围不清楚确切性质。

另一种方式可以是:

foo = some_other_value 
if condition: 
    foo = some_value 

这是更简洁,节省了我们的一个分支;然而,对于快速阅读代码的人来说,这可能会产生误导。

是风格还是执行速度的首选方法之一? (尽管我怀疑这里的性能增益会很小,如果不是空的话) 或者是另一种编写此代码的推荐方式?

+3

使用'if' /'else'没有predeclaration ;人们应该知道你的意思。性能并不重要,但我想它也是最快的。 – Ryan

回答

3

foo = some_value if condition else some_other_value

+0

我认为三元运算符被认为是“unpythonic”? – bitgarden

+0

我没有看到这比OP的最后一个例子好。 – jramirez

+5

@bitgarden,如果他们是unpythonic,Guido不会添加它们;-)严重的是,简短易懂的ternarys是Pythonic。他们认为程序员过度迷恋“单线疾病”的时候就是这样。 –

0

Python有一个三元运算

foo = ifTrue if predicate else ifFalse 

谓词是任何布尔值表达式。例如,

def abs(x): 
    return x if x > 0 else -x 

它紧凑,经济,易于理解。如果谓词非常复杂,请小心使用谓词上的parens。

0

对于它的价值,我更喜欢三元运算符:

foo = baz if quux() else bar 

但有一个性能理由,更喜欢一个比其他?

In [15]: %timeit foo = 2 if random.randint(0,1) else 3 
100000 loops, best of 3: 1.69 µs per loop 

In [16]: %%timeit 
    ....: if random.randint(0,1): 
    ....:  foo = 2 
    ....: else: 
    ....:  foo = 3 
    ....: 
100000 loops, best of 3: 1.6 µs per loop 

In [17]: %%timeit foo = 0 
if random.randint(0,1): 
    foo = 2 
else: 
    foo = 3 
    ....: 
1000000 loops, best of 3: 1.59 µs per loop 
1

虽然这可以用三元运算符

foo = some_value if condition else some_other_value 

圭多从来没有像三元运算符来完成,所以很难被称为“Python化”

我认为这是首选并与每个版本的Python兼容

if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

区别是吐温说和

foo = some_other_value 
if condition: 
    foo = some_value 

在情况需要some_other_value被计算(通过函数说),你希望避免调用函数不必要