为什么我们在or
中看到Python赋值
例如:
def my_function(arg_1=None, arg_2=0):
determination = arg_1 or arg_2 or 'no arguments given!'
print(determination)
return determination
在不带参数的情况下调用时,上述函数将打印并返回'no arguments given!'
Python为什么要这样做,如何才能最好地利用这一功能?
发布于 2014-02-05 08:00:23
"or
“表达式在赋值时的作用:
我们有时会在Python语言中看到这样的例子,用来代替具有三元赋值的条件表达式(实际上是it helped inspire the language to add conditional statements)。
x = a or b
如果bool(a)
返回False
,则将b
的值赋给x
条件表达式的相同用例(即三元赋值)
这是一个这样的条件表达式的例子,它完成了同样的事情,但可能没有那么神秘。
def my_function(arg_1=None, arg_2=0):
determination = arg_1 if arg_1 else arg_2 if arg_2 else 'no arguments given!'
print(determination)
return determination
过多地重复这种语法被认为是不好的风格,否则it's OK for one-liners.的缺点是它有点重复。
or
表达式
基本情况是,如果bool(x)
计算的结果是True
,则x or y
返回x
,否则返回y
(see the docs for reference)。因此,一系列or
表达式的效果是返回计算True
的第一项或最后一项。
例如
'' or [] or 'apple' or () or set(['banana'])
返回第一项计算结果为True
的'apple'
,以及
'' or [] or ()
返回()
,即使它的计算结果为False
。
扩展的and
用法
相比之下,如果bool(x)
的计算结果为False
,则x and y
返回x
,否则返回y
。
当您考虑到条件and
系列中的所有条件都需要求值为True
,控制流才能沿着该路径继续运行,并且当您遇到一个为False
的项时,继续计算这些项是没有意义的,这就说明了and
是以这种方式工作的。
使用and
进行赋值的效用不像使用or
那样明显,但它在历史上曾用于三元赋值。也就是说,在这个更清晰、更直接的构造出现之前:
a = x if condition else y
使用布尔运算符形成的等效运算符是:
a = condition and x or z # don't do this!
虽然它的含义是基于对Python and
和or
计算的充分理解而派生出来的,但它的可读性远不如三元条件,最好完全避免。
结论
使用布尔表达式进行赋值的必须小心,绝对不会使用and
进行赋值,这是非常容易出错的。风格专家会发现使用or
进行赋值并不那么可取(比更冗长的三叉树if
condition else
更好),但我发现它在专业Python社区中非常普遍,可以认为是惯用的。
如果您选择使用它,请谨慎使用,但要知道,如果到达最终元素,则无论其计算结果如何,都将始终返回,因此最终元素可能应该是文字,这样您就知道您的变量有一个很好的默认回退。
https://stackoverflow.com/questions/21566106
复制相似问题