什么是';x=y或z';你用Python做什么? 为什么我们看到Python赋值带有或?

什么是';x=y或z';你用Python做什么? 为什么我们看到Python赋值带有或?,python,boolean,variable-assignment,Python,Boolean,Variable Assignment,例如: def my_function(arg_1=None, arg_2=0): determination = arg_1 or arg_2 or 'no arguments given!' print(determination) return determination 当在没有参数的情况下调用时,上述函数将打印并返回“没有给定参数!” Python为什么要这样做,如何才能最好地利用这一功能?赋值时“或”表达式的作用: 我们有时会在Python中看到这样的例子,

例如:

def my_function(arg_1=None, arg_2=0):
    determination = arg_1 or arg_2 or 'no arguments given!'
    print(determination)
    return determination
当在没有参数的情况下调用时,上述函数将打印并返回
“没有给定参数!”

Python为什么要这样做,如何才能最好地利用这一功能?

赋值时“
”表达式的作用: 我们有时会在Python中看到这样的例子,用三元赋值代替条件表达式(事实上)

如果
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
过多地重复这种语法被认为是不好的风格,否则缺点是它有点重复

表达式 基本情况下,
x或y
返回
x
如果
bool(x)
计算
True
,否则它计算
y
,()。因此,一系列
表达式的作用是返回计算结果为
True
的第一项或最后一项

比如说

'' or [] or 'apple' or () or set(['banana'])
返回
'apple'
,第一个计算结果为
True的项,以及

'' or [] or ()
返回
()
,即使其计算结果为
False

扩展的
用法
作为对比,
x和y
如果
bool(x)
的计算结果为
False
,则返回
x
,否则返回
y

<> P> >代码>和在考虑到条件<代码>和系列中的所有条件都需要评估为<代码>真/ <代码>时,控制流从该路径继续下去,这是有意义的。当你遇到一个
False
时,继续评估这些项目是没有意义的

使用
进行赋值的效用并不像使用
那样明显,但它在历史上曾用于三元赋值。也就是说,在这一更清晰、更直接的构造出现之前:

a = x if condition else y
使用布尔运算符形成的等效值为:

a = condition and x or z                      # don't do this!
虽然在充分理解Python
以及
求值的基础上,其含义是可推导的,但其可读性不如三元条件,最好完全避免

结论 必须小心使用布尔表达式进行赋值。绝对不要使用
进行赋值,因为这会造成混淆,很容易出错。风格专家会发现在赋值时使用
不如使用更详细的三元(
if
condition
else
),但我发现它在专业Python社区中非常常见,可以认为是惯用的


如果您选择使用它,请谨慎使用,并理解如果到达最终元素,无论其计算结果如何,都将始终返回该元素,因此最终元素可能应该是一个文本,这样您就知道您的变量有一个很好的默认回退。

回答得很好!我想说的是,你不应该说某个东西的计算结果是
真的
还是
假的
,而是如果它是真的
b=1或2
表示
b==1
,但
都不是真的
。也许我只是有点迂腐,甚至困惑?显然,我还不够清楚。:)
b=1或2
表示它首先计算
之前的项,如果计算结果为
True
(在布尔上下文中),则返回该项。我会尽快在课文中澄清。同时,请查看相关文档:查找以“表达式x或y首先计算x;如果x为真,则返回其值;否则,”…哦,是的,我知道所有这些。我只是在挑剔类型。
a = condition and x or z                      # don't do this!