假设我有条件将a评估为布尔值condition
,并且我想将变量foo
设置为取决于该条件的值。
我可以用几种不同的方式编写(为简单起见,我们假设some_value
和some_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) 或者是另一种建议编写此代码的第四种方式?
答案 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