2014-09-22 50 views
2

當我離開時,Python(3.4)內置函數發生了一些奇怪的事情。像mapzip這樣的函數現在返回對象(不是列表或元組)。Python 3.x內置函數現在返回類型

In [34]: map(lambda x:1, [1,2,3]) 
Out[34]: <map at 0x7fe27a15dac8> 
  1. 當這些被添加到Python?
  2. 他們爲什麼加入?
  3. 而且,最重要的是,這會破壞我的任何代碼嗎?
+2

早在2008年3.x版本開始的時候就已經出現這種情況了。你一定已經離開了一段時間。 – user2357112 2014-09-22 22:50:20

+0

相關:http://stackoverflow.com/questions/22147757/iterators-in-python-3 – user2357112 2014-09-22 23:15:17

+0

這主要是交互式使用的一個問題。大多數2.x代碼可以無縫工作,並且您只能在交互式解釋器中注意到。 – dawg 2014-09-22 23:20:26

回答

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 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,第210個,...而不必將所有這些值明確地存儲在列表本身中。

+1

'map'不是一個函數。實際上,'輸入(map)== map'不是'builtin_function_or_method'。 – PythonNut 2014-09-22 22:35:17

+1

@PythonNut:那麼爲什麼它在Python內建函數中列出? https://docs.python.org/3.2/library/functions.html#map – 2014-09-22 22:36:12

+0

因爲這是Python 3.2的文檔?我不知道;它在[3.4文檔](https://docs.python.org/3.4/library/functions.html#map)中被列爲功能。但這顯然不是一種功能......除非我是啞巴,類型現在是功能。 – PythonNut 2014-09-22 22:39:09