作者:手机用户2602890681 | 来源:互联网 | 2022-12-21 16:16
你能告诉我为什么括号会影响传递给print语句的布尔值的输出吗?
例:
print(True and False) or (True or False)
# False or True
# Python 2.7 >>> True
# Python 3.6 >>> False
但是当我使用括号时:
print((True and False) or (True or False))
# False or True
# Python 2.7 >>> True
# Python 3.6 >>> True
Python 3中的解释器是否只看到第一部分(第一个括号内的部分)?如果是这样,为什么它不会为该行的其余部分抛出错误?
其他例子:
print(True and True) and (True and False)
# True and False
# Python 2.7 >>> False
# Python 3.6 >>> True
print((True and True) and (True and False))
# True and False
# Python 2.7 >>> False
# Python 3.6 >>> False
print(True and True) and not (False or True)
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> True
print((True and True) and not (False or True))
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> False
print(False or True) and not (True and True)
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> True
print((False or True) and not (True and True))
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> False
答案更新和评论:
我在BOLD的问题:
在Python3中,print是一个函数.
print(True and False)
是None
,和
print(True and False) or (True or False)
是相同的
None and (True or False)
其是False
,因为没有一个是假-γ在布尔上下文.
是不是要告诉口译员打印某些东西或评估其他东西?这怎么可能是一个有效的语法?
因为第一部分被评估None
然后第二次评估:
None and (True or False)
除非我在shell中运行它,否则不应该打印任何东西.
例如:None and (True or False)
如果运行在像SublimeText3这样的代码编辑器中运行,则运行不会将结果打印给用户(我没有在sublime中使用任何额外的插件或包,只有程序的构建函数,并且它不会打印任何东西除非它被传递给印刷声明.)
1> Thierry Lath..:
在Python3中,print
是一个函数.作为没有特定返回值的所有函数,它返回None
.
那么,执行时会发生print(True and False) or (True or False)
以下情况:
True and False
得到评估,给出False
.
print()
使用False
as参数调用该函数.此print(False)
第一打印"假"到终端,然后返回该值None
.
现在,
None or (True or False)
得到评估为真.
如果您将此作为脚本的一部分执行,则会打印"False",整个表达式将被评估为True
,并且由于您没有将其分配True
给任何内容,因此它将被丢弃.
如果在REPL中执行此操作,则会打印"False",整个表达式将被计算到False
,并且REPL会打印评估结果,因为如果您输入了2 + 2,它将打印4,因此您将获得
>>> print(True and False) or (True or False)
False # <-- from print
True # <-- from the REPL, result of the evaluation of the whole expression
如果执行会有一点不同print(True and False) and (True or False)
.这次,在打印之后,表达式是
None and (True or False)
与None
布尔上下文中的and
假法一样,Python知道结果将是假的(甚至不需要评估(True or False)
部分),并返回None
,因为它是第一个允许它决定表达式的真实性的值.
如果你像以前一样将它作为脚本的一部分执行,则会打印"False",对整个表达式进行求值None
,并且由于你没有将None
它赋给任何东西,它就会被丢弃.
如果在REPL中执行此操作,则会打印"False",整个表达式将被计算为None
.由于这是所有不返回任何函数的普通返回值,因此REPL不会打印它,除非您明确要求它:
>>> print(True and False) and (True or False)
False # <-- from print, None doesn't get printed
>>> print(print(True and False) and (True or False))
False # <-- from the inner print
None # <-- None gets printed by the outer print
>>>