是否有一种统一的方法来知道迭代是否会消耗可迭代对象?
假设你有一个特定的函数crunch
它要求一个可迭代对象作为参数,并多次使用它。就像是:
def crunch (vals):
for v in vals:
chomp(v)
for v in vals:
yum(v)
(注:将两者合并在一起for
循环不是一个选项)。
如果使用不是列表的可迭代对象调用函数,就会出现问题。在下面的调用中yum
函数永远不会被执行:
crunch(iter(range(4))
原则上我们可以通过重新定义来解决这个问题crunch
函数如下:
def crunch (vals):
vals = list(vals)
for v in vals:
chomp(v)
for v in vals:
yum(v)
但这会导致使用两倍的内存,如果调用crunch
is:
hugeList = list(longDataStream)
crunch(hugeList)
我们可以通过定义来解决这个问题crunch
像这样:
def crunch (vals):
if type(vals) is not list:
vals = list(vals)
for v in vals:
chomp(v)
for v in vals:
yum(v)
但仍然可能存在调用代码将数据存储在以下位置的情况:
例如:
from collections import deque
hugeDeque = deque(longDataStream)
crunch(hugeDeque)
如果有一个isconsumable
谓词,以便我们可以定义crunch
像这样:
def crunch (vals):
if isconsumable(vals):
vals = list(vals)
for v in vals:
chomp(v)
for v in vals:
yum(v)
这个问题有解决办法吗?