首页 \ 问答 \ Python:和/或运算符奇怪的行为(Python: and/or operators strange behavior)

Python:和/或运算符奇怪的行为(Python: and/or operators strange behavior)

我知道AND运算符优先于OR运算符。 我也相信,就像在C / CPP中一样,这些算子的相关性是从左到右(尽管对我的问题似乎并不重要)。

我在Python 2.7.1中运行以下代码:

情况1:

我有三个功能:

def f(): print 3; return True

def g(): print 4; return False

def h(): print 5; return False

当我运行以下命令时

f() and g() or h()

我明白了

3
4
5
False

这很好(我的预期)。

案例2:

如果我将功能更改为:

def f(): print 3

def g(): print 4

def h(): print 5

我得到同样的命令:

3
5

案例3:

如果我将命令更改为

 f() and (g() or h())

我只得到:

 3

我知道在最后两个例子中,函数实际上并没有返回布尔值,但是 - 我不明白这种行为。 看起来不一致:

我们将函数f(),h(),g()称为True还是False或其他什么(什么?)?

为什么在第二种情况下,h()运行而不是g()?

为什么在最后一种情况下(g和h)都没有运行?


I know that the AND operator has precedence over the OR operator. I also believe that like in C/CPP the associativity of these operators is from left to right (although it doesn't seem to be crucial for my question).

I run the following code in Python 2.7.1:

Case 1:

I have three functions:

def f(): print 3; return True

def g(): print 4; return False

def h(): print 5; return False

When I run the following command

f() and g() or h()

I get

3
4
5
False

This is fine (what I expected).

Case 2:

If I change the functions to:

def f(): print 3

def g(): print 4

def h(): print 5

I get for the same command:

3
5

Case 3:

If I change the command to

 f() and (g() or h())

I get only:

 3

I know that in the last two examples, the functions do not actually return boolean value, but yet - I don't understand this behavior. it seems inconsistent:

Do we refer the functions f(),h(),g() as True or as False or something alse (what?)?

Why in the second case, h() runs and not g()?

Why in the last case none of them (g and h) run?


原文:https://stackoverflow.com/questions/20798171
更新时间:2020-10-17 18:10

最满意答案

在Python中,没有显式返回任何内容的函数返回None 。 在布尔上下文中, None被视为false。

在第二个例子中, g不运行,因为and运算符短路f的结果是假的,所以g()不需要被评估,因为它的结果不会改变整个and表达式的结果。

类似地,在第三个示例中,由于f()为false,因此不需要对其右侧进行求值,因此gh不会运行。


In Python, a function that doesn't explicitly return anything returns None. None is considered false in a boolean context.

In the second example, g doesn't run because the and operator short-circuits. f's result was false, so g() doesn't need to be evaluated, as its result won't change the result of the whole and expression.

Similarly, in the third example, since f() was false, the right side of the and doesn't need to be evaluated, so g and h don't run.

2013-12-27

相关问答

更多

PHP null coalesce +三元运算符奇怪的行为(PHP null coalesce + ternary operators strange behavior)

你的空格不反映php评估表达式的方式。 注意?? 优先级高于三元表达式。 你得到的结果是: ($b ?? false) ? $a : $b; 只要$b不为null或计算结果为false , $b 。 Your spaces do not reflect the way php evaluates the expression. Note that the ?? has a higher precedence than the ternary expression. You get the res ...

在Android上使用Java三元运算符的奇怪行为(Strange behavior using Java ternary operator on Android)

原因在于三元经营者的工作方式。 它总是将两个对象都转换为与这两个对象通用的最接近的超类型。 在你的情况下,它是BaseInterpolator ,因为你的targetSDK版本设置为23 。 但是,由于您的minSDK为14 ,因此演员阵容无法在所有设备上运行。 因此错误。 为了解决这个问题,你可以为这两个对象添加一个TimeInterpolator的显式类型。 The reason is because of the way ternary operators work. It always c ...

为什么Python中没有++和 - 运算符?(Why are there no ++ and -- operators in Python?)

这不是因为没有意义 将“x ++”定义为“x + = 1,评估x的先前绑定”是非常有意义的。 如果你想知道原来的原因,你将不得不通过旧的Python邮件列表或者询问那些在那里的人(例如Guido),但是事实证明是很容易的: 与其他语言一样,不需要简单的递增和递减。 你不要经常在Python中编写for(int i = 0; i < 10; ++i) ; 相反,你做的事情像for i in range(0, 10) 。 由于不需要像往常一样,所以有更少的理由给它自己的特殊语法; 当你需要增加时, + ...

Python中增量和减量运算符的行为(Behaviour of increment and decrement operators in Python)

++不是运算符。 它是两个+运算符。 +运算符是身份运算符,不执行任何操作。 (澄清: +和-一元运算符只适用于数字,但我认为你不会指望一个假设的++运算符来处理字符串。) ++count 解析为 +(+count) 哪个翻译成 count 你必须使用稍长的+=运算符来做你想做的事情: count += 1 我怀疑++和--运算符被排除一致和简单。 我不知道Guido van Rossum给出的确切参数,但我可以想象几个论点: 更简单的解析。 在技术上,解析++count是不明确的,因为它 ...

&和|的奇怪行为(Strange behavior with & and | operators)

我觉得你很困惑&和&& 。 请注意,在Python中, &&是关键字and (据我所知, &&和||在Python中不存在)。 | 和&是二元AND和OR运算符,它们and and和or真的不同。 您的第二个代码被翻译为: 0 != 1 & (1 == (1 | 2) == 2) # 1 | 2 is 3 ↓↓ 0 != 1 & (1 == 3 == 2) ↓↓ 0 != 1 & int(False) ↓↓ 0 != 1 & 0 # 1 & 0 is ...

<<运算符的奇怪行为(Strange behavior with << operator)

负数是两个补码,所以-1 == 0xFFFFFFFF和0xFFFFFFFF & 31 == 31 , -2 == 0xFFFFFFFE和0xFFFFFFFE & 31 == 30等等。 -10 == 0xFFFFFFF6, and 0xFFFFFFF6 & 31 == 22, in fact: (0x10 << 22) == 04000000 一些代码显示: const int num = 0x10; int maxShift = 31; for (int i = 5; i >= -10; ...

Python:使用模运算符的奇怪行为(Python: Odd behavior with modulo operator)

这是一个“陷阱”情况:您在迭代列表时从列表中删除项目,从而更改列表,导致迭代行为异常。 尝试这个: ... # But for some strange reason I can't figure out how to remove the odd numbers from the list for i in all[:]: if i % 2 != 0: all.remove(i) ... 这就是所谓的“切片”表示法,并使您迭代列表的一次性副本,以 ...

Python中的逻辑运算符(Logical operators in Python [duplicate])

这是有据可查的 : x or y if x is false, then y, else x x and y if x is false, then x, else y 两者都短路(例如or如果x是真的,则不会评估y )。 文档还说明了什么被认为是 False ( False , 0 , None ,空序列/映射,......) - 其他一切都被认为是真实的 。 几个例子: 7 and 'a' # -> 'a' [] or None ...

将“奇怪”三元运算符从java-script转换为python(Convert “strange” ternary operator from java-script to python)

你误解了代码的意图。 Δλ只能在[-pi,pi]之外进行修改,然后根据符号在不同的方向上移动。 翻译JavaScript代码给出 if np.abs(delta_lon) > np.pi: delta_lon = -(2*np.pi - delta_lon) if delta_lon > 0 else 2*np.pi + delta_lon 或者你可以做 if delta_lon > np.pi: delta_lon = -(2*np.pi - delta_lon) elif d ...

Python:和/或运算符奇怪的行为(Python: and/or operators strange behavior)

在Python中,没有显式返回任何内容的函数返回None 。 在布尔上下文中, None被视为false。 在第二个例子中, g不运行,因为and运算符短路 。 f的结果是假的,所以g()不需要被评估,因为它的结果不会改变整个and表达式的结果。 类似地,在第三个示例中,由于f()为false,因此不需要对其右侧进行求值,因此g和h不会运行。 In Python, a function that doesn't explicitly return anything returns None. No ...

相关文章

更多

最新问答

更多
  • 如何在CSS中进行自定义文本编辑并在学校项目中获取错误(How to do custom text editing in CSS and getting a error in a school project)
  • 获取列表中最长的元素(Get the longest element of a list)
  • Files.copy(Path,Path)是否创建目录?(Does Files.copy(Path,Path) create directories?)
  • 如何在ajax请求完成后1秒递归调用函数?(How to recursively call a function 1 second after an ajax request is done?)
  • 如何统计销售量,城市,商品使用情况的客户oracle(How to statistics sales, city, customer of goods use oracle)
  • 无法从命令行覆盖pom maven-surefire-plugin(Cannot overwrite pom maven-surefire-plugin from command line)
  • 根据Select2 4.0中的值应用css类(Applying css class according to value in Select2 4.0)
  • 使用Jackson(Polymorphic)进行反序列化时缺少字段(Missing field when deserializing using Jackson (Polymorphic))
  • 使用PHP的即时警报通知功能(Instant Alert notification feature using PHP)
  • 与以前的密码相比(Comparing with previous passwords)
  • 从现金流中获取特定行(Getting specific line from Cash Flow)
  • Citrix:无法使用MDKToolkit包装apk(Citrix: can't wrap apk using MDKToolkit)
  • 流星角色包的灵活性如何?(How flexible is meteor-roles package?)
  • 带有多个按钮的Google扩展程序(Google Extension with more than one button in the toolbar)
  • php setTimezone同时出现不同的结果(php setTimezone different result for the same time)
  • 搜索不使用jQuery调用json(Search not working using jQuery with call to json)
  • 如何打印文件的内容?(How do I print out the contents of a file? C++ File Stream)
  • Django自定义包含标签(Django Custom Inclusion Tags)
  • Java Jtree mouseEvent如果没有选择任何内容(Java Jtree mouseEvent if nothing is selected)
  • 通过哈希对象循环获取次数(Get number of times in loop over Hash object)
  • Python转义序列复杂输出(Python escape sequence complex output)
  • 将列表对象中的字符串转换为逗号分隔(Convert string in list objects to comma separated)
  • 如何限制特定字符在laravel 5.4中的字符串?(How to limit string in laravel 5.4 from specific char?)
  • 如何从浏览器调用appengine servlet(how to call appengine servlet from browser)
  • Excel条件格式更改整个行颜色(Excel conditional formatting to change entire row color)
  • 在JTable中显示数据库中的数据(Displaying data from database in JTable)
  • 在android中附加文件的问题(Issue on appending a file in android)
  • 在数组中输入值(Make in input value as in array)
  • Haml + ActionMailer - Rails?(Haml + ActionMailer - Rails?)
  • 在tomcat上部署的grails war没有连接到数据库(grails war deployed on tomcat is not connecting to database)