Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 以iterable为参数的函数是否总是接受迭代器?_Python_Iterator - Fatal编程技术网

Python 以iterable为参数的函数是否总是接受迭代器?

Python 以iterable为参数的函数是否总是接受迭代器?,python,iterator,Python,Iterator,我知道,iterator是iterable,但只有一次通过 例如,itertools中的许多函数将iterable作为参数,例如islice。如果我看到api上写着“iterable”,我是否可以始终传入迭代器 正如@delnan指出的那样: 虽然每个迭代器都是一个iterable,但有些人(在 核心团队)当他们的意思是“可以”时,说“iterable” 重复多次,结果相同”。中的一些代码 wild声称可以在iterables上工作,但实际上不能与 迭代器 这正是我所关心的。那些支持多路径的it

我知道,
iterator
iterable
,但只有一次通过

例如,
itertools
中的许多函数将
iterable
作为参数,例如
islice
。如果我看到api上写着“iterable”,我是否可以始终传入迭代器

正如@delnan指出的那样:

虽然每个
迭代器
都是一个
iterable
,但有些人(在 核心团队)当他们的意思是“可以”时,说“iterable” 重复多次,结果相同”。中的一些代码 wild声称可以在iterables上工作,但实际上不能与
迭代器

这正是我所关心的。那些支持多路径的
iterable
有名字吗?像C中的
IEnumerable


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

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


是一个iterable,它支持通过
\uuu getitem\uuu()
特殊方法使用整数索引进行有效的元素访问,并定义了一个
len()
方法来返回序列的长度

这个定义与所有不是迭代器的iterable的集合稍有不同。(您可以定义一个(残废的)自定义类,它有一个
\uuuu getitem\uuuuuuuuuuu
,方法,但不是
\uuuuuuu len\uuuuuuuuuuu
。它将是一个iterable,它不是迭代器,但也不是
序列

然而,
sequences
与您要查找的非常接近,因为所有序列都是可多次迭代的可重用序列

内置Python的示例包括
str
unicode
list
tuple
bytearray
buffer
xrange


以下是从中挑选出来的一些定义:


是的,因为每个迭代器也是一个iterable


如果一个对象定义了
\uuuu iter\uuuu()
方法,则该对象是可编辑的。每个迭代器都有这个方法,它返回迭代器本身。

您应该查看中定义的抽象基类。出于您的目的,
容器
大小
可能是最有用的,因为它们需要
\uuuuu分别包含
\uu len\uuuu
,这反过来又需要一组定义良好的值,可以重复迭代。

尽管每个迭代器都是可迭代的,但一些人(核心团队之外)说“iterable”是指“可以用相同的结果多次迭代的东西”。有些代码声称可以使用iterables,但实际上不能使用迭代器和其他一次性iterables(例如文件)@delnan这正是我所关心的。那些支持多路径的
iterable
有名字吗?比如C#中的
IEnumerable
。我相信
iterable
这个词有两个不同的含义:一个是技术性的,另一个是一般性的。混淆产生于两者的混合。一般来说
iterable
是一个对象可用于
for
循环周期的ct。从技术意义上讲,
iterable
是定义
\uuuuuuu iter\uuuuu
方法的对象。
iterable
s从技术意义上讲,不保证多次迭代。如果要进行多次迭代,则需要一个序列,或者可以转换
iterable
转换成一个序列来执行多次迭代,或者你可以使用
itertools.tee
。我想如果你需要测试一个不是迭代器的iter,你可以做
iter(iterable)不是iterable
,因为迭代器需要从
\uuuiter\uuuuu
返回自己。
container
    Has a __contains__ method

generator
    A function which returns an iterator.

iterable
    An object with an __iter__() or __getitem__() method. Examples of
    iterables include all sequence types (such as list, str, and
    tuple) and some non-sequence types like dict and file. When an
    iterable object is passed as an argument to the builtin function
    iter(), it returns an iterator for the object. This iterator is
    good for one pass over the set of values.

iterator
    An iterable which has a next() method.  Iterators are required to
    have an __iter__() method that returns the iterator object
    itself. An iterator is good for one pass over the set of values.

sequence
    An iterable which supports efficient element access using integer
    indices via the __getitem__() special method and defines a len()
    method that returns the length of the sequence. Note that dict
    also supports __getitem__() and __len__(), but is considered a
    mapping rather than a sequence because the lookups use arbitrary
    immutable keys rather than integers.  sequences are orderable
    iterables.

    deque is a sequence, but collections.Sequence does not recognize
    deque as a sequence.
    >>> isinstance(collections.deque(), collections.Sequence)
    False