any()是否延迟求值?

2024-05-18 08:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个脚本,在这个脚本中,我必须根据多种条件测试数字。如果满足任何一个条件,我想返回True,并且我想以最快的方式返回。在

我的第一个想法是使用any()代替嵌套的if语句或多个{}链接我的条件。因为如果有任何条件是True,那么我就可以从{}懒惰并尽快返回True中受益匪浅。在

基于下面的打印是立即发生的,而不是在10(=0+1+2+3+4)秒之后,我认为是这样。是这样还是我搞错了?在

import time

def some(sec):
    time.sleep(sec)
    return True

print(any(some(x) for x in range(5)))

Tags: import脚本trueiftime链接def方式
3条回答

正确地说,{cdm>使用的是什么呢。例如,以下代码将不会变懒:

print(any([slow_operation(x) for x in big_list]))

列表将被完全构造和计算,然后作为参数传递给any。在

另一方面,生成器是ITerable,可以根据需要计算每个项目。它们可以是expressionsfunctions,或者有时手动实现为lazy iterators。在

^{}和{a2}函数在iterable的第一个“true”元素上短路时,iterable本身可以以非惰性的方式构造。考虑这个例子:

>> any(x == 100 for x in range(10**8))
True

range(10**8)构造一个10**8元素的列表时,在python2中执行这个操作需要几秒钟的时间。同样的表达式在python3中立即运行,其中range()是lazy。在

是的,any()all()短路,一旦结果明确就中止:见docs

all(iterable)

Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

any(iterable)

Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

相关问题 更多 >