Python:最有条理的方式来有条件地设置变量?

时间:2013-10-31 00:08:38

标签: python coding-style

假设我有条件将a评估为布尔值condition,并且我想将变量foo设置为取决于该条件的值。

我可以用几种不同的方式编写(为简单起见,我们假设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

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

对于样式或执行速度,这些方式之一是首选吗? (虽然我怀疑这里的性能提升很小,如果不是null) 或者是另一种建议编写此代码的第四种方式?

4 个答案:

答案 0 :(得分:3)

foo = some_value if condition else some_other_value

答案 1 :(得分:1)

虽然可以使用三元运算符

完成
foo = some_value if condition else some_other_value

Guido从来没有像三元运算符那样,因此很难称之为“Pythonic”

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

if condition:
  foo = some_value
else:
  foo = some_other_value

之间的区别
foo = some_other_value
if condition:
  foo = some_value

是需要计算some_other_value的情况(通过函数说)并且你希望避免不必要地调用函数

答案 2 :(得分:0)

Python有一个三元运算符

foo = ifTrue if predicate else ifFalse

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

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

紧凑,经济,易于理解。如果谓词完全复杂,请小心在谓词上使用parens。

答案 3 :(得分: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