当前位置: 首页 > 面试题库 >

Python中的“ x = y或z”分配有什么作用?

聂和宜
2023-03-14
问题内容

例如:

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为什么要这样做?如何最好地利用这一功能?


问题答案:

or”表达式对赋值的作用:

我们有时会在Python中看到这样的示例,以三元赋值代替条件表达式(实际上,这有助于启发该语言添加条件语句)。

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

过多重复此语法被认为是不好的样式,否则单行就可以了。缺点是,它
一个有点重复。

or 表达方式

基本情况,x or y返回x如果bool(x)求值True,否则它计算y,(见供参考的文档)。因此,一系列or表达式具有返回计算的第一个项目True或最后一个项目的效果。

例如

'' or [] or 'apple' or () or set(['banana'])

返回'apple',第一个评估为的项目True,以及

'' or [] or ()

返回(),即使它的值为False

扩展and使用

为了便于比较,x and y回报率x,如果bool(x)计算结果为False,否则返回y

and当您考虑到条件and序列中的所有条件都需要评估True以使控制流沿着该路径前进时,以这种方式工作是有意义的,并且当您遇到一个条件序列时,继续评估那些项目是没有意义的那就是False

and用于分配的实用程序并不像using那样明显or,但在历史上曾被用于三元分配。也就是说,在此更清晰直接的构造可用之前:

a = x if condition else y

与布尔运算符形成的等效项是:

a = condition and x or z                      # don't do this!

尽管其含义是基于对Pythonandor评估的全面理解而得出的,但其可读性不及三元条件,因此最好完全避免。

结论

必须谨慎使用布尔表达式进行赋值。
绝对不要将其and用于分配,这很容易引起错误,很容易混淆。样式专家会发现orfor赋值的使用不太可取(比更冗长的三元if条件else),但是我发现它在专业的Python社区中是如此普遍,以至于它是惯用的。

如果您选择使用它,请谨慎行事,要理解到final元素(无论达到什么值)将始终返回而不管其评估如何,因此,final元素可能应该是一个 文字
,这样您就知道您拥有一个很好的默认后备为您的变量



 类似资料:
  • 我正在编写一个安全系统,拒绝未经授权的用户访问。 它按预期授予授权用户访问权限,但也允许未经授权的用户进入! 为什么会发生这种情况?我已经明确声明,只有当等于Kevin、Jon或Inbar时,才允许访问。我也尝试过相反的逻辑,,但结果是一样的。 注意:这个问题旨在作为这个非常常见的问题的规范重复目标。还有另一个热门问题如何针对单个值测试多个变量?这有同样的基本问题,但比较目标是相反的。这个问题不应

  • 我有以下功能: 此代码给出了

  • 这部分是学术性的,就我的目的而言,我只需要四舍五入到小数点后两位;但我很想知道发生了什么会产生两种略有不同的结果。 这是我编写的测试,将其缩小到最简单的实现: 但它失败了,输出如下: 有谁能详细解释一下是什么原因导致 我在一个答案中寻找的一些要点是:精度损失在哪里?哪种方法是首选的,为什么?哪一个实际上是正确的?(在纯数学中,不可能两者都是对的。也许两者都是错的?)对于这些算术运算,有没有更好的解

  • 问题内容: Python文档明确指出了调用。但是似乎在许多情况下,情况恰恰相反。它何时何地发生的原因在哪里记录,如何确定我的对象或方法将被调用。 编辑:只是为了澄清,我知道在优选中调用,但是我不清楚为什么优先于调用,而后者是文档状态将发生的原因。 编辑:从马克·迪金森的答案和评论中,它看起来像是: 丰富的比较替代 是它自己的,以它的(以及类似的,等等) 如果左对象是内置类或新样式类,而右对象是其子

  • 问题内容: 我将如何在SELECT查询中反转此路径: 为了 其中/是定界符,并且在一行中可以有许多定界符 问题答案: 最简单的方法可能是编写一个存储的pl / sql函数,但是可以单独使用SQL(Oracle)来完成。 这将分解子路径中的路径: 然后,我们使用来重构反向路径:

  • 问题内容: 做这个: 意思是这样的: 如果是这样,我对Dive Into Python中的示例5.14 完全感到困惑。密钥如何既等于“名称”又等于项目?另一方面,“和项目”是否只是问项目是否作为变量存在? 问题答案: 意味着。 请记住,这有几种可能。例如将评估为。