例如,如果我有以下声明:
if( foo1 or foo2)
...
...
如果foo1为true,python会检查foo2的条件吗?
答案 0 :(得分:71)
是的,Python懒洋洋地评估布尔条件。
表达式x和y首先计算x;如果x为假,则其值为 回;否则,评估y并得到结果值 返回。
表达式x或y首先计算x;如果x为真,则其值为 回;否则,评估y并得到结果值 返回。
答案 1 :(得分:19)
and
or
是懒惰的
&
|
不是懒惰的
答案 2 :(得分:11)
Python的懒惰可以通过以下代码证明:
def foo():
print('foo')
return False
def bar():
print('bar')
return False
foo() and bar() #Only 'foo' is printed
另一方面,
foo() or bar()
会导致两个' foo'和' bar'打印。
答案 3 :(得分:6)
这不是技术上懒惰的评估,它是短路布尔表达式。
懒惰的评价有一些不同的含义。例如,真正的懒惰评估可能会允许这个
def foo(arg) :
print "Couldn't care less"
foo([][0])
但Python没有。
Python也很好,因为它“回声”它是布尔参数。例如,一个或条件返回它的第一个“truthy”参数或最后一个参数(如果所有参数都是“falsey”)。和条件相反。
所以“回声论证”布尔意味着
2和[]以及1
评估为[]和
[]或1或2
评估为1
答案 4 :(得分:2)
是的,Python会懒惰地评估,因此不会检查foo2
。
如果我不知道密钥是否存在,我会一直使用这个来抓取类字典对象中的项目:
if 'key' in mydict and mydict['key'] == 'heyyo!':
do_stuff()
请参阅@ unutbu的答案以获得更全面的解释。
答案 5 :(得分:2)
实际上是or
部分被短路:
>>> 1 or 1/0 #also 0 and 1/0
1
>>> 0 or 1/0 #also 1 and 1/0
Traceback (most recent call last):
File "<pyshell#1240>", line 1, in <module>
0 or 1/0
ZeroDivisionError: integer division or modulo by zero
答案 6 :(得分:1)
简短的演示是比较
之间的时差all(xrange(1,1000000000))
和
any(xrange(1,1000000000))
all()必须检查每个值,而any()可以在找到第一个True后放弃。因此,作为生成器的xrange在评估器完成后也会放弃生成事物。由于这个原因,所有将消耗大量的RAM并花费很长时间,而any将只使用几个字节并立即返回。