当我不在的时候,Python (3.4)内置函数发生了一些奇怪的事情。像map
和zip
这样的函数现在返回对象(不是列表或元组)。
In [34]: map(lambda x:1, [1,2,3])
Out[34]: <map at 0x7fe27a15dac8>
发布于 2014-09-22 22:30:37
简短答案:这些是可迭代的,用于防止在只需要有限数量的元素时分配整个列表。自3.0以来
我猜这些都是惰性函数调用(或coroutines)。
惰性函数调用返回一个仅在需要时才计算对象的对象。
例如,假设您有一个1M
项列表,但是您只需要映射的第一个3
。然后迭代器,只计算前三个。
这也可以用于对无限列表执行操作。假设你有一个所有素数的列表。这是一个迭代器。当然,您永远不能存储所有的素数。如果真的有必要的话,你只能计算下一个。
基于文档,我可以说是3.0?
为了发出迭代器中的所有项并将它们转换为列表,可以使用list
函数:
>>> list(map(lambda x:1, [1,2,3]))
[1, 1, 1]
示例无限列表。
假设您使用了旧的list [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
,它们会导致内存不足的异常.
如文档所示,您还可以接受n
th元素:
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
-th,……执行算术运算。而不必将所有这些值显式地存储在列表本身中。
https://stackoverflow.com/questions/25984025
复制相似问题