Python是否懒惰地评估条件是否存在?

时间:2012-12-19 20:31:12

标签: python lazy-evaluation

例如,如果我有以下声明:

if( foo1 or foo2)
    ...
    ...

如果foo1为true,python会检查foo2的条件吗?

7 个答案:

答案 0 :(得分:71)

是的,Python懒洋洋地评估布尔条件。

docs say

  

表达式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将只使用几个字节并立即返回。