如何检查迭代器是否实际上是迭代器容器? [英] How do I check if an iterator is actually an iterator container?
问题描述
下面我有一个迭代器容器的虚拟示例(实际的容器读取的文件太大而无法容纳在内存中):
I have a dummy example of an iterator container below (the real one reads a file too large to fit in memory):
class DummyIterator:
def __init__(self, max_value):
self.max_value = max_value
def __iter__(self):
for i in range(self.max_value):
yield i
def regular_dummy_iterator(max_value):
for i in range(max_value):
yield i
这使我可以多次遍历值 ,以便我可以执行以下操作:
This allows me to iterate over the value more than once so that I can implement something like this:
def normalise(data):
total = sum(i for i in data)
for val in data:
yield val / total
# this works when I call next()
normalise(DummyIterator(100))
# this doesn't work when I call next()
normalise(regular_dummy_iterator(100))
如何检查是否通过传递迭代器容器而不是普通生成器的normalize函数?
How do I check in the normalise function that I am being passed an iterator container rather than a normal generator?
推荐答案
首先:没有 iterator容器这样的东西.您有一个可迭代.
First of all: There is no such thing as a iterator container. You have an iterable.
一个Iterable产生一个迭代器.任何迭代器也是可迭代的,但是会生成自身作为迭代器:
An iterable produces an iterator. Any iterator is also an iterable, but produces itself as the iterator:
>>> list_iter = iter([])
>>> iter(list_iter) is list_iter
True
如果iter(ob) is ob
测试为假,则没有迭代器.
You don't have an iterator if the iter(ob) is ob
test is false.
这篇关于如何检查迭代器是否实际上是迭代器容器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!