Python 3.x内置函数现在返回类型

时间:2014-09-22 22:26:36

标签: python python-3.x return-type built-in

当我离开时,Python(3.4)内置函数发生了一些奇怪的事情。像mapzip这样的函数现在返回对象(不是列表或元组)。

In [34]: map(lambda x:1, [1,2,3])
Out[34]: <map at 0x7fe27a15dac8>
  1. 这些是什么时候添加到Python?
  2. 为什么要添加?
  3. 而且,最重要的是,这会破坏我的任何代码吗?

1 个答案:

答案 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

您可以定义一个能够计算每个元素的序列,并且仍然可以对第一个nk - ......执行算术运算,而不必存储所有这些值本身明确列出的值。