Python:有条件地设置变量的最惯用方法?

Python:有条件地设置变量的最惯用方法?,python,coding-style,Python,Coding Style,假设我有一个将a计算为布尔值的条件,condition,我想根据该条件将变量foo设置为一个值 我可以用几种不同的方式编写(为了简单起见,让我们假设some\u value和some\u other\u value是常量,而不是函数调用)。这里有一个方法: foo = None if condition: foo = some_value else: foo = some_other_value 这种方法很好,因为foo在顶部明确声明;不过,这有点冗长。我们可以更简单地写为: if c

假设我有一个将a计算为布尔值的条件,
condition
,我想根据该条件将变量
foo
设置为一个值

我可以用几种不同的方式编写(为了简单起见,让我们假设
some\u value
some\u other\u 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
这更简洁,为我们节省了一个分支;然而,对于快速阅读代码的人来说,这可能会产生误导

对于风格或执行速度来说,这些方法中有一种更受欢迎吗?(尽管我怀疑这里的性能增益是最小的,如果不是空的话)
还是建议使用第四种编写此代码的方法?

foo=some\u value if condition else some\u other\u value
foo=some\u value if condition else some\u other\u value

foo = ifTrue if predicate else ifFalse
foo = some_value if condition else some_other_value
谓词是任何布尔值表达式。比如说

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

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

Python有一个三元运算符

foo = ifTrue if predicate else ifFalse
foo = some_value if condition else some_other_value
谓词是任何布尔值表达式。比如说

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

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

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

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

就其价值而言,我更喜欢三元运算符:

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

虽然这可以通过三元运算符实现

foo = ifTrue if predicate else ifFalse
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

在这种情况下,
某个其他值
需要计算(比如通过一个函数),并且您希望避免不必要地调用该函数

,尽管这可以通过三元运算符完成

foo = ifTrue if predicate else ifFalse
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

在这种情况下,
某个其他值
需要计算(比如通过一个函数),并且您希望避免不必要地调用该函数

使用
if
/
else
,无需预先声明;人们应该知道你的意思。性能并不重要,但我想它也是最快的。使用
if
/
else
时,不需要预先声明;人们应该知道你的意思。性能并不重要,但我想它也是最快的。我以为三元运算符被认为是“非音速的”?我不认为这比OP的上一个示例更好。@bitgarden,如果它们是非音速的,Guido就不会添加它们;-)说真的,简短易懂的三元音是非常类似蟒蛇的。当程序员被“1-liner疾病”过度迷住时,三元运算符肯定不是“不和谐的”。如果条件很简单,并且生成的行是可读的,那么这可能比复合语句更可读。此外,这些表达式可以在其他人无法理解的生成器/列表/dict理解中使用,这使得它们非常“pythonic”。我认为一些长期的Python程序员(包括我自己)在使用2.4或更早版本时对三元结构产生了下意识的不良反应,而这是不受支持的。我看到很多丑陋的黑客使用
,它们肯定是不和谐的。现在它是完全合法的,至少只要代码是可读的,但我仍然从未想过要使用它。我以为三元运算符被认为是“非音速的”?我不认为这比OP的上一个示例更好。@bitgarden,如果它们是非音速的,Guido就不会添加它们;-)说真的,简短易懂的三元音是非常类似蟒蛇的。当程序员被“1-liner疾病”过度迷住时,三元运算符肯定不是“不和谐的”。如果条件很简单,并且生成的行是可读的,那么这可能比复合语句更可读。此外,这些表达式可以在其他人无法理解的生成器/列表/dict理解中使用,这使得它们非常“pythonic”。我认为一些长期的Python程序员(包括我自己)在使用2.4或更早版本时对三元结构产生了下意识的不良反应,而这是不受支持的。我看到很多丑陋的黑客使用
,它们肯定是不和谐的。现在它是完全合法的,至少只要代码是可读的,但我仍然没有想过使用它。