8

我希望使用 Pythonall()函数来帮助我计算一些东西,但是如果all()它在达到False. 我认为它可能是短路评估,但我只是想确定一下。另外,有没有办法在 Python 中告诉函数如何被评估?

4

4 回答 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

因此,当它为returnFalse 时,该函数会立即中断。

于 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 回答