我知道iterator
是iterable
,但只有1次通过。
例如,itertools
中的许多函数都将iterable
作为参数,例如islice
。如果我看到api说iterator
,我可以随时传递iterable
吗?
正如@delnan指出:
虽然每个
iterator
都是iterable
,但有些人(在{。}}之外 核心团队)当他们的意思是“可以做的事情时”说“可迭代” 用相同的结果迭代几次“。。中的一些代码 野蛮声称可以使用iterables
,但实际上无效iterators
。
这是我的担忧。那些支持多通道的iterable
是否有名称?和C#中的IEnumerable
一样?
如果我要构建一个声称支持iterable
的函数,那么最佳实践是支持iterator
吗?
答案 0 :(得分:5)
是的,itertools中的函数设计用于迭代器。函数签名说iterable
的原因是因为它们也适用于列表,元组和其他不是迭代器的迭代。
A sequence是一个可迭代的,它通过__getitem__()
特殊方法使用整数索引支持有效的元素访问,并定义了一个返回序列长度的len()
方法。
此定义与不是迭代器的所有迭代集的集合略有不同。 (您可以定义一个(残缺的)自定义类,它具有__getitem__
方法但不是__len__
。它将是一个迭代,它不是迭代器 - 但它也不是{{1 }}。)
然而sequence
非常接近您所寻找的,因为所有序列都是可迭代的迭代,可以多次迭代。
内置于Python中的sequence types示例包括sequences
,str
,unicode
,list
,tuple
,bytearray
和buffer
。
以下是从glossary:
中挑选出来的一些定义xrange
答案 1 :(得分:2)
是的,因为每个迭代器也是可迭代的。
如果对象定义__iter__()
方法,则该对象是可迭代的。每个迭代器都有这个方法,它返回迭代器本身。
答案 2 :(得分:2)
您应该查看the collections
module中定义的抽象基类。出于您的目的,Container
或Sized
可能最有用,因为它们分别需要__contains__
和__len__
,而这又需要一组明确定义的值,反复重复。