Python:有条件地设置变量的最惯用方法?
假设我有一个将a计算为布尔值的条件,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
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或更早版本时对三元结构产生了下意识的不良反应,而这是不受支持的。我看到很多丑陋的黑客使用和
和或
,它们肯定是不和谐的。现在它是完全合法的,至少只要代码是可读的,但我仍然没有想过使用它。