Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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短路:为什么';这不是下面的工作吗?_Python_Python 3.x_Short Circuiting - Fatal编程技术网

任何/所有python短路:为什么';这不是下面的工作吗?

任何/所有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

根据我在其他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]: 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