当我离开时,Python(3.4)内置函数发生了一些奇怪的事情。像map
和zip
这样的函数现在返回对象(不是列表或元组)。
In [34]: map(lambda x:1, [1,2,3])
Out[34]: <map at 0x7fe27a15dac8>
答案 0 :(得分:3)
简短回答:这些是可迭代的,如果只需要有限数量的元素,则用于防止分配整个列表。自3.0起
我猜这些是懒函数调用(或协程)。
延迟函数调用返回一个仅在需要时才计算对象的对象。
例如,假设您有一个1M
项列表,但您只需要地图的第一个3
。然后迭代器只计算前三个。
这也可用于在无限列表上执行操作。假设您有一个所有素数的列表。这是一个迭代器。当然,您永远不能存储所有素数。如果真的有必要,你只计算下一个。
基于documentation,我会说3.0?
为了发出迭代器中的所有项目并将它们转换为列表,您可以使用list
函数:
>>> list(map(lambda x:1, [1,2,3]))
[1, 1, 1]
示例无限列表。
假设您使用旧列表[1,2,3]
,但现在您需要一个重复给定列表的列表,使得总长度为k
而不是自己完成所有微积分(例如确定最后一个元素将是,你可以执行):
>>> from itertools import *
>>> list(islice(cycle([1,2,3]),20))
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2]
换句话说,您可以对无限迭代器[1,2,3,1,2,3,...]执行操作。 不要对这些迭代器执行list
,它们会导致内存不足异常。
如documentation所示,您还可以使用n
元素:
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(islice(iterable, n, None), default)
因此例如确定无限斐波纳契数列的元素1337
是否是偶数:
def fibbonacci():
i = 0
j = 1
while True :
yield j
k = j
j = i+j
i = k
nth(fibbonacci(),1337)
1887894200332450578485872635131438888682034332759626203734370221207918536632734791920258721345445695603925109666619483005485820744328669636758022665585261815175601673908370933079008727762461226800205778071936133115682958306317629552911384353679816770236462076654822205794785629944
您可以定义一个能够计算每个元素的序列,并且仍然可以对第一个n
,k
- ......执行算术运算,而不必存储所有这些值本身明确列出的值。