我希望使用 Pythonall()
函数来帮助我计算一些东西,但是如果all()
它在达到False
. 我认为它可能是短路评估,但我只是想确定一下。另外,有没有办法在 Python 中告诉函数如何被评估?
问问题
2392 次
4 回答
17
是的,它会短路:
>>> def test():
... yield True
... print('one')
... yield False
... print('two')
... yield True
... print('three')
...
>>> all(test())
one
False
从文档:
如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。相当于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
因此,当它为return
False 时,该函数会立即中断。
于 2013-06-22T01:16:29.203 回答
4
是的,all
确实使用短路评估。例如:
all(1.0/x < 0.5 for x in [4, 8, 1, 0])
=> False
当条件变为假时,当列表中x
达到时,上述停止。1
如果all
没有短路,我们会在x
达到时除以零0
。
于 2013-06-22T01:22:40.950 回答
2
确保你不像我最初做的那样在调用它之前尝试使用短路来测试方法的存在:
>>> class MyClass(object):
... pass
...
>>> a=MyClass()
>>> all([hasattr(a,'b'), a.b()])
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'b'
但
>>> a=MyClass()
>>> hasattr(a,'b') and a.b() #doesn't evaluate a.b() as hasattr(a,'b') is false
False
在第一个代码片段中,Python 在将列表传递给 all() 之前对其进行评估,因此它仍然会引发异常。这与使用 list() 强制 all() 不使用晨星的答案中的短路评估基本相同
于 2014-05-11T14:04:46.980 回答
0
在回答您是否可以判断是否all
进行短路评估的问题时,默认情况下它是短路的,但如果您不希望它是短路的,您可以这样做:
result = all(list(iterable))
尽管这可能具有将整个列表加载到内存中的不良属性。除了使用与所有功能不同的功能外,我想不出您将如何避免这种情况。例如
result = reduce(lambda x,y: x and y, iterable)
result = min(iterable) # surprisingly similar to all; YMMV if iterable contains non-booleans
于 2013-06-22T01:33:46.410 回答