如果我有以下情况:
if a(my_var) and b(my_var):
do something
我可以假设只有在isb()
时才评估?还是可以先做?a()
True
b()
询问是因为在is时评估b()
会导致异常。a()
False
如果我有以下情况:
if a(my_var) and b(my_var):
do something
我可以假设只有在isb()
时才评估?还是可以先做?a()
True
b()
询问是因为在is时评估b()
会导致异常。a()
False
b()
a(my_var)
仅在is时才会被评估True
,是的。如果是假的,and
则运算符短路a(my_var)
。
从布尔运算符文档中:
表达式
x and y
首先计算x
; 如果x
为假,则返回其值;否则,y
评估并返回结果值。
您可以使用在调用时打印某些内容的函数自己进行测试:
>>> def noisy(retval):
... print "Called, returning {!r}".format(retval)
... return retval
...
>>> noisy(True) and noisy('whatever')
Called, returning True
Called, returning 'whatever'
'whatever'
>>> noisy(False) and noisy('whatever')
Called, returning False
False
Python 将空容器和数字 0 值视为 false:
>>> noisy(0) and noisy('whatever')
Called, returning 0
0
>>> noisy('') and noisy('whatever')
Called, returning ''
''
>>> noisy({}) and noisy('whatever')
Called, returning {}
{}
自定义类可以实现一个__nonzero__
钩子来为同一测试返回一个布尔标志,或者如果它们是容器类型,则实现一个__len__
钩子;返回0
意味着容器是空的,被认为是假的。
在一个密切相关的注释中,or
操作员做同样的事情,但相反。如果第一个表达式的计算结果为 true,则不会计算第二个表达式:
>>> noisy('Non-empty string is true') or noisy('whatever')
Called, returning 'Non-empty string is true'
'Non-empty string is true'
>>> noisy('') or noisy('But an empty string is false')
Called, returning ''
Called, returning 'But an empty string is false'
'But an empty string is false'
是的,这样做是安全的。如果条件被延迟评估,则为 Python。
在help()
(哈哈)的帮助下:
>>> help('and')
Boolean operations
******************
or_test ::= and_test | or_test "or" and_test
and_test ::= not_test | and_test "and" not_test
not_test ::= comparison | "not" not_test
...
The expression ``x and y`` first evaluates *x*; if *x* is false, its
value is returned; otherwise, *y* is evaluated and the resulting value
is returned.
...
所以是的,如果a(my_var)
返回 False,则b
不会调用该函数。
编译器总是从上到下从左到右读取。因此If False and True
,编译器首先遇到 False 并退出 if 条件。这对我知道的所有软件都有效。