如何检查迭代器是否实际上是迭代器容器? [英] How do I check if an iterator is actually an iterator container?

查看:64
本文介绍了如何检查迭代器是否实际上是迭代器容器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面我有一个迭代器容器的虚拟示例(实际的容器读取的文件太大而无法容纳在内存中):

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆