将iterable作为参数的函数是否总是接受迭代器?

时间:2013-10-28 19:52:30

标签: python iterator

我知道iteratoriterable,但只有1次通过。

例如,itertools中的许多函数都将iterable作为参数,例如islice。如果我看到api说iterator,我可以随时传递iterable吗?

正如@delnan指出:

  

虽然每个iterator都是iterable,但有些人(在{。}}之外   核心团队)当他们的意思是“可以做的事情时”说“可迭代”   用相同的结果迭代几次“。。中的一些代码   野蛮声称可以使用iterables,但实际上无效   iterators

这是我的担忧。那些支持多通道的iterable是否有名称?和C#中的IEnumerable一样?

如果我要构建一个声称支持iterable的函数,那么最佳实践是支持iterator吗?

3 个答案:

答案 0 :(得分:5)

是的,itertools中的函数设计用于迭代器。函数签名说iterable的原因是因为它们也适用于列表,元组和其他不是迭代器的迭代。


A sequence是一个可迭代的,它通过__getitem__()特殊方法使用整数索引支持有效的元素访问,并定义了一个返回序列长度的len()方法。

此定义与不是迭代器的所有迭代集的集合略有不同。 (您可以定义一个(残缺的)自定义类,它具有__getitem__方法但不是__len__。它将是一个迭代,它不是迭代器 - 但它也不是{{1 }}。)

然而sequence非常接近您所寻找的,因为所有序列都是可迭代的迭代,可以多次迭代。

内置于Python中的sequence types示例包括sequencesstrunicodelisttuplebytearraybuffer


以下是从glossary

中挑选出来的一些定义
xrange

答案 1 :(得分:2)

是的,因为每个迭代器也是可迭代的。

如果对象定义__iter__()方法,则该对象是可迭代的。每个迭代器都有这个方法,它返回迭代器本身。

答案 2 :(得分:2)

您应该查看the collections module中定义的抽象基类。出于您的目的,ContainerSized可能最有用,因为它们分别需要__contains____len__,而这又需要一组明确定义的值,反复重复。