Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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_Iterator - Fatal编程技术网

Python中非生成器的正确术语是什么?

Python中非生成器的正确术语是什么?,python,iterator,Python,Iterator,迭代器是顶级类别,生成器是一种特殊的迭代器 对于像是迭代器而不是生成器的常用列表这样的东西,什么是正确的术语?列表是可编辑的。您可以通过调用iter(iterable)为它们生成迭代器 没有包含迭代器和排除生成器的特殊术语 有关精确定义,请参见和 例如,生成器条目包括: 返回迭代器的函数 使用生成器函数实现iterable的迭代器非常常见,方法是实现: 因此,SomeContainer实例是iterable(就像列表一样),iter(iterable)生成一个迭代器,它恰好是一个生成器对象。列表

迭代器是顶级类别,生成器是一种特殊的迭代器

对于像是迭代器而不是生成器的常用列表这样的东西,什么是正确的术语?

列表是可编辑的。您可以通过调用
iter(iterable)
为它们生成迭代器

没有包含迭代器和排除生成器的特殊术语

有关精确定义,请参见和

例如,生成器条目包括:

返回迭代器的函数

使用生成器函数实现iterable的迭代器非常常见,方法是实现:


因此,
SomeContainer
实例是iterable(就像列表一样),
iter(iterable)
生成一个迭代器,它恰好是一个生成器对象。

列表不是迭代器。列表是可重用的,当您调用
iter(somelist)
时,它会生成一个迭代器。生成什么样的迭代器取决于所讨论的Iterable,列表中的Iterable被恰当地命名为listiterator

任何生成器都是迭代器。
任何迭代器都是iter(尝试
iter(iter(somelist))

不是任何Iterable(例如列表)都是迭代器,但是当您调用
iter(someiterable)
someiterable时,任何Iterable都会返回迭代器

编辑:下面是一个简短的(Python 3)示例:

导入集合 >>>随机输入 >>> >>>类MyIterable: …定义(自我): …返回MyIterator() >>> >>>类MyIterator: …定义下一个(自我): …返回random.randint(-10,10) …定义(自我): …回归自我 ... >>>mable=MyIterable() >>>mitor=国际热核试验堆(mable) >>>iInstance(mable、collections.Iterable) 真的 >>>iInstance(mable、collections.Iterator) 假的 >>>iInstance(mitor,collections.Iterable) 真的 >>>isinstance(mitor、collections.Iterator) 真的 >>>下一个(米托) -7 >>>下一个(米托) -3 >>>下一个(米托) -3 >>>下一个(米托) 7. >>>下一个(梅布尔) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“MyIterable”对象不是迭代器
那么生成器对象也会是iterable吗,因为它有一个
\uuuuu iter\uuuu
函数并产生一个iterable?还是我弄错了?@Xiphias:每个迭代器都是iterable的,是的。我明白了。没有任何iterable是迭代器,因为生成器是iterable的,但不是迭代器?@Xiphias不完全是。生成器是一种特殊的迭代器,so任何生成器都是迭代器。不是任何Iterable都是迭代器,因为Iterable和迭代器是两个不同的东西。Iterable能够生成迭代器。迭代器是具有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法的对象。所有迭代器都是Iterable,因为它们可以生成迭代器(按照惯例,在迭代器上调用
iter
时,它们只返回自身)。
class SomeContainer(object):
    def __iter__(self):
        for elem in self._datastructure:
            if elem.visible:
                yield elem.value
>>> import collections
>>> import random
>>> 
>>> class MyIterable:
...     def __iter__(self):
...         return MyIterator()
>>>
>>> class MyIterator:
...     def __next__(self):
...         return random.randint(-10, 10)
...     def __iter__(self):
...         return self
... 
>>> mable = MyIterable()
>>> mitor = iter(mable)
>>> isinstance(mable, collections.Iterable)
True
>>> isinstance(mable, collections.Iterator)
False
>>> isinstance(mitor, collections.Iterable)
True
>>> isinstance(mitor, collections.Iterator)
True
>>> next(mitor)
-7
>>> next(mitor)
-3
>>> next(mitor)
-3
>>> next(mitor)
7
>>> next(mable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'MyIterable' object is not an iterator