Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是否计算if';什么条件懒惰?_Python_Lazy Evaluation - Fatal编程技术网

Python是否计算if';什么条件懒惰?

Python是否计算if';什么条件懒惰?,python,lazy-evaluation,Python,Lazy Evaluation,例如,如果我有以下陈述: if( foo1 or foo2) ... ... 如果foo1为true,python会检查foo2的条件吗?是,python会延迟计算布尔条件 这个, 表达式x和y首先计算x;如果x为false,则其值为 返回;否则,将计算y,结果值为 返回 表达式x或y首先计算x;如果x为真,则其值为 返回;否则,将计算y,结果值为 返回 是的,Python的计算是惰性的,因此不会检查foo2 如果我不知道密钥是否存在,我会一直使用它从类似字典的对象中获取条目:

例如,如果我有以下陈述:

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

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

是,python会延迟计算布尔条件

这个,

表达式x和y首先计算x;如果x为false,则其值为 返回;否则,将计算y,结果值为 返回

表达式x或y首先计算x;如果x为真,则其值为 返回;否则,将计算y,结果值为 返回


是的,Python的计算是惰性的,因此不会检查
foo2

如果我不知道密钥是否存在,我会一直使用它从类似字典的对象中获取条目:

if 'key' in mydict and mydict['key'] == 'heyyo!':
    do_stuff()

请参阅@unutbu的答案以获得更全面的解释。

这不是技术上的懒惰评估,而是短路布尔表达式

懒惰评估有着不同的内涵。例如,真正的惰性评估可能允许这样做

def foo(arg) :
    print "Couldn't care less"

foo([][0])
但是Python没有

Python也很好,因为它“呼应”了它的布尔参数。例如,or条件返回其第一个“truthy”参数或最后一个参数(如果所有参数都是“false”)。and条件的作用正好相反

所以“回声参数”布尔的意思是

2及[]及1

计算结果为[],并且

[]或1或2


计算结果为1,实际上是
零件短路:

>>> 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
>>1或1/0#以及0和1/0
1.
>>>0或1/0#以及1和1/0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
0或1/0
ZeroDivisionError:整数除法或模零除法

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”。

是惰性的


&
|
并不懒惰

一个简短的演示将是比较

all(xrange(1,1000000000))


all()必须检查每个值,而any()可以在找到第一个True后放弃。因此,xrange作为一个生成器,也会在完成求值器后放弃生成内容。由于这个原因,all将消耗大量RAM并耗时,而any将只使用几个字节并立即返回。

请参阅。如果您像我一样懒得加载官方文档,我通常的关键字提示是:在解释器控制台键入
帮助(“或”)
。在本例中,请阅读第四段。Python在这里的行为与“
if
”无关,而与“
”有关,这可能就是您所寻找的。从技术上讲,Python会对布尔运算符的结果进行短路,然后对其进行双重求值,如果以后使用实际的布尔运算符。。。除非它直接在
if
语句中。。。它是特权的(多于或bool()),因此它会对它们进行一次计算。双重评估取决于操作的复杂性。这是违反直觉的,但这里有证据:对于这个用例,我认为
如果mydict.get(“key”)=“heyyo!”:
也可以工作--
。如果找不到键,get
将返回
None
(或指定的默认值)。正确,它会返回,因此我通常不会将它用于实际的词典,而是用于没有
.get
方法的类似词典的对象(通常来自外部模块)。@DSM实际上用于您的用例,如果mydict.get(“key”):
,我只需执行
,因为
将计算为
。?但这样你就失去了“嘿!”比较。惰性求值是一种包罗万象的术语,也可以指逻辑运算符的短路行为。如果你指的是按需呼叫,通常称为“按需呼叫”,因为懒惰的评估可能意味着这么多。我不同意。当人们说“短路评估”时,他们说“懒惰评估”是错误的“按需调用”是“惰性评估”的同义词。我同意它不太容易被误用。@PeteIsNeat如果你想成为一名技术规范主义者,“惰性评估”是实现按需调用语义的多种方法之一。它们不是同义词,也不是等价词。我是一个描写主义者,所以当人们谈论“懒惰行为”时,很明显,从上下文来看,他们谈论的是短路,我真的不介意。:)我是那个在对话中引入“懒惰评估”的人。我只是想添加一些附加的上下文。如果你说的是“短路评估”,那么说“懒惰评估”是误导,我想确保每个人都理解这一点。至于“惰性评估”是否等同于“按需呼叫”。。。wikipedia在我看来是正确的:“惰性评估是按需调用语义最常用的实现策略,但也存在变化——例如乐观评估。”OP sorta通过询问如何“惰性地评估事物”在对话中引入了惰性评估.我想指出的是,也可以进行位比较,这并不懒惰,如下所示。您也可以查看。
any(xrange(1,1000000000))