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

Python-“ if”语句中的逻辑评估顺序

都阳辉
2023-03-14
问题内容

在Python中,我们可以这样做:

if True or blah:
    print("it's ok") # will be executed

if blah or True: # will raise a NameError
    print("it's not ok")

class Blah:
    pass
blah = Blah()

if blah or blah.notexist:
    print("it's ok") # also will be executed
  • 有人可以指出我有关此功能的文档吗?
  • 它是语言的实现细节或功能吗?
  • 利用此功能是否很好?

问题答案:

orand 短路
,请参见布尔操作文档:

表达式x and y首先计算x; 如果x为假,则返回其值;否则,y将求值并返回结果值。

表达式x or y首先计算x; 如果x为true,则返回其值;否则,y将求值并返回结果值。

注意如何,对andy只有 当评估x计算为一个真正的价值。相反,for ory仅当x评估为False时才评估。

对于第一个表达式True or blah,这意味着blah永远不会对其进行求值,因为第一部分已经存在True

此外,您的自定义Blah类被视为True:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值将解释为false:False,,None所有类型的数字零以及空字符串和容器(包括字符串,元组,列表,字典,集合和Frozensets)。所有其他值均解释为true。(有关__nonzero__()更改方法,请参见特殊方法。)

由于您的类没有实现__nonzero__()方法(也没有实现__len__方法),因此就True布尔表达式而言,将其考虑在内。

因此,在表达式blah or blah.notexistblah为true,并且blah.notexist从不对其求值。

经验丰富的开发人员经常有效地使用此功能,通常用于指定默认值:

some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute

警惕将它们链接起来,并在适用的情况下使用条件表达式代替。



 类似资料:
  • 问题内容: 如果您有一个if语句,其中对多个变量或函数进行了评估,那么按什么顺序对其进行评估? 在这种特定情况下,是将foo相对于5评估,然后将6相对于吧(从左至右)进行评估,还是将其从右至左进行评估?我假设a和以相同顺序求值。 问题答案: 如果第一个是,则将首先评估left子句,然后评估第一个。 这就是为什么您可以执行以下操作的原因: 没有破坏。 相反,对于子句,只有第一个为:时,将评估righ

  • 这段代码给出的答案不是很直观: 0 1 我明白为什么会发生这种情况-赋值的左侧返回对底层值的引用,同时创建上述值,然后才使用新计算的对右侧进行评估映射。 这种行为在C标准中是否有表述?还是求值顺序没有定义? 使用g 5.2.1获得结果。

  • 我有以下python代码: 这里发生了什么?我无法理解这一点,因为不是布尔值。

  • 问题内容: 这是我的代码: 我在 IF 条件语句中遇到错误。 我究竟做错了什么? 问题答案: 您可能想要而不是。

  • 本文向大家介绍Python用exec评估语句,包括了Python用exec评估语句的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 当可以设置为None时,使用以下格式是否不好? 问题是,如果my_var为None ,将引发TypeError。 还是我应该使用: 要么 换一个问题,以上哪一项是Python最佳实践(如果有)? 欢迎其他选择! 问题答案: 依赖条件语句的顺序是安全的(此处是Python参考),特别是由于您指出的问题-能够缩短可能导致一系列条件语句出现问题的评估是非常有用的。 大多数语言会弹出这种代码: