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会这样做,以及如何才能最好地利用此功能?
答案 0 :(得分:9)
or
”表达式在赋值时的作用:我们有时会在Python中看到这样的例子,作为带有三元赋值的条件表达式的替代,(事实上,it helped inspire the language to add conditional statements)。
x = a or b
如果bool(a)
返回False
,则会为x
分配值b
这是一个完成同样事情的条件表达式的例子,但可能有点神秘。
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
表达式基本情况x or y
如果x
评估x
则返回True
,否则评估y
,(see the docs for reference)。因此,一系列or
表达式具有返回评估True
的第一个项目或最后一个项目的效果。
例如
'' or [] or 'apple' or () or set(['banana'])
返回'apple'
,第一个评估为True
的项目和
'' or [] or ()
返回()
,即使它的评估结果为False
。
and
用法相比之下,如果x and y
评估为x
,则x
会返回False
,否则会返回y
。
当您考虑条件and
系列中的所有条件需要评估为and
以使控制流继续进行时,True
将以这种方式工作是有意义的路径,当你遇到False
时,继续评估这些项是没有意义的。
使用and
进行分配的效用并不像使用or
那样明显,但它在历史上用于三元分配。也就是说,在此之前,可以使用更清晰明了的构造:
a = x if condition else y
用布尔运算符形成的等价物是:
a = condition and x or z # don't do this!
虽然基于对Python语言的深入了解而衍生出来,但并不是那么简单,最好完全避免。
必须小心使用布尔表达式进行赋值。绝对不要使用and
进行赋值,这很容易让人容易出错。样式专家会发现or
用于不太可取的作业(比更详细的三元if
条件else
),但我发现它在专业的Python社区中如此常见它可以被认为是惯用的。
如果您选择使用它,请谨慎行事,并了解最终元素将始终返回,无论其评估如何,因此最终元素应该是 literal ,以便您知道你的变量有一个很好的默认回退。