任何/所有python短路:为什么';这不是下面的工作吗?
根据我在其他stackoverflow页面上看到的内容:任何/所有python短路:为什么';这不是下面的工作吗?,python,python-3.x,short-circuiting,Python,Python 3.x,Short Circuiting,根据我在其他stackoverflow页面上看到的内容: 以下代码应短路: any(True, 2+2, False, 2/0) all(True, 2+2, False, 2/0) any([True, 2+2, False, 2/0]) all([True, 2+2, False, 2/0]) 但对于每一个,我都会得到一个zerodivision错误:被零除 我错过什么了吗?为什么会出错?是的,python中会出现短循环 In [23]: False and 3/0 Out[23
any(True, 2+2, False, 2/0)
all(True, 2+2, False, 2/0)
any([True, 2+2, False, 2/0])
all([True, 2+2, False, 2/0])
但对于每一个,我都会得到一个zerodivision错误:被零除
我错过什么了吗?为什么会出错?是的,python中会出现短循环
In [23]: False and 3/0
Out[23]: False
In [24]: True and 3/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-24-a08823d6496a> in <module>
----> 1 True and 3/0
ZeroDivisionError: division by zero
查看函数调用时,BINARY\u TRUE\u DIVIDE
在any
或all
之前求值,因为表达式在任何函数调用之前首先求值您的代码错误,因为必须求值表达式才能传递到函数中
在这种情况下,短路实际上意味着一旦找到不同的值,它们就会返回,而不必检查其余的值。这与和
和或
所做的短路不同,它们实际上可以避免计算表达式
为了举例说明,让我们使用一个迭代器,它将被使用:
>>> a = iter([1, 0, 2, 3])
>>> all(a) # Search until a falsy value
False
>>> list(a) # Show what's left in the iterator
[2, 3]
您可以看到它使用了1
和0
,返回0
,因为它是falsy
现在,如果您确实想对any
和all
进行惰性求值,可以在生成器表达式中调用lambdas:
>>> any(e() for e in [lambda: 1, lambda: 0, lambda: 2/0])
True
>>> all(e() for e in [lambda: 1, lambda: 0, lambda: 2/0])
False
(感谢您激发了这一点。)False和2/0
和True和2/0
短路评估发生
>>> any(e() for e in [lambda: 1, lambda: 0, lambda: 2/0])
True
>>> all(e() for e in [lambda: 1, lambda: 0, lambda: 2/0])
False