从这里开始: https://docs.python.org/3/library/itertools.html#itertools-recipes
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
我理解zip_longest
调用。但我不明白:
如果稍后要将iterable传递到izip_longest
中,何必再费心将iterable包装成iter()
?我不能这样做:
args = [iterable] * n
但似乎没有iter()
,它只会重复相同的迭代器n次。但是把这个放在iter()
中会如何改变它的行为呢?在
这个分组利用了迭代器的单次传递特性(而不仅仅是iterable,它可能会多次迭代,并且在非iterator iterable上使用
iter
应该返回一个新的独立迭代器。相反,对迭代器调用iter
将返回迭代器本身。在因此,下面是一个只接受两个参数的zip函数的简单实现:
这就是内置的
^{pr2}$zip
的工作原理。现在,如果我们用一个列表作为iterable来执行上面的操作呢?在但是,如果
iterable
是一个迭代器:最后,请注意,序列上的repition从不复制序列的元素,因此
[iter(x)]*n
将返回一个列表,其中包含对同一迭代器的n个引用,因此:注意,它们是相同的
list_iterator
对象。。。在相关问题 更多 >
编程相关推荐