Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 - Fatal编程技术网

Python 如何在一行程序中有效地耗尽迭代器?

Python 如何在一行程序中有效地耗尽迭代器?,python,Python,如果我有一个迭代器它,并且想要耗尽它,我可以写: for x in it: pass 是否有一个内置的或标准的库调用允许我在一行程序中完成它?我当然可以做到: list(it) 它将从迭代器生成一个列表,然后丢弃它。但我认为这是因为清单建设效率低。当然,为自己编写一个执行空for循环的helper函数并不重要,但我很好奇是否还缺少其他东西 来自: 您可以使用sum: sum(0 for _ in it) 或者类似地,使用reduce: reduce(lambda x, y: y,

如果我有一个迭代器
,并且想要耗尽它,我可以写:

for x in it:
    pass
是否有一个内置的或标准的库调用允许我在一行程序中完成它?我当然可以做到:

list(it)
它将从迭代器生成一个列表,然后丢弃它。但我认为这是因为清单建设效率低。当然,为自己编写一个执行空for循环的helper函数并不重要,但我很好奇是否还缺少其他东西

来自:


您可以使用
sum

sum(0 for _ in it)
或者类似地,使用
reduce

reduce(lambda x, y: y, it)
object()在其中

如果您知道迭代器永远不会生成某种对象,也可以使用它,例如,迭代器中的
None
()中的
。新创建的
object()
几乎是通用的,因为它的测试永远不会等同于其他任何东西(除非是恶作剧)

我不是在提倡这个成语;问题中的
for
循环在许多方面都是最佳解决方案。但是,如果您正在寻找一个令人毛骨悚然的“优雅”答案,即它在尽可能少的边计算的同时仍然是一个非常简洁的单行程序(与例如
any(False for uu in it)
)相反),那么可能就是它。

内置函数应该非常便宜和简单:

all(对于其中的uu为真)

编辑:修正,谢谢@hemflit

请注意,您的建议也可以表述为一行:

for _ in it: pass
我刚才说:

def exhaust(it):
    for _ in it:
        pass

它不如
deque
解决方案快(在我的笔记本电脑上慢10%),但我觉得它更干净。

我不确定你想要什么,但是
[在它里面没有]
工作(或类似的变体)?假设你这样做不是为了副作用,与丢弃迭代器相比,耗尽迭代器有什么好处?纯粹出于好奇-为什么?这确实是副作用。任何建立列表的解决方案都比下面的解决方案
collections.deque(it,maxlen=0)
效率更低。这里也简要解释了一下:谢谢——我尝试过google和stackoverflow搜索,但没有找到解决方案。现在应该更容易发现:)和
集合。detain_iterator
itertools。detain_iterator
会更好而且更明显。不,这将停止对第一个falsy元素的迭代
all(对于uit为True)
也可以。
def exhaust(it):
    for _ in it:
        pass