1

假设我有一个将 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

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

其中一种方式是风格还是执行速度的首选?(虽然我怀疑这里的性能提升会很小,如果不是空的话)或者是否推荐另一种编写此代码的方法?

4

4 回答 4

3

foo = some_value if condition else some_other_value

于 2013-10-31T00:10:28.220 回答
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需要计算(通过函数说)并且您希望避免不必要地调用函数的情况下

于 2013-10-31T00:23:41.023 回答
0

Python有一个三元运算符

foo = ifTrue if predicate else ifFalse

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

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

它结构紧凑、经济且易于理解。如果谓词很复杂,请小心在谓词上使用括号。

于 2013-10-31T00:12:37.867 回答
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
于 2013-10-31T00:16:14.400 回答