當我離開時,Python(3.4)內置函數發生了一些奇怪的事情。像map
和zip
這樣的函數現在返回對象(不是列表或元組)。Python 3.x內置函數現在返回類型
In [34]: map(lambda x:1, [1,2,3])
Out[34]: <map at 0x7fe27a15dac8>
- 當這些被添加到Python?
- 他們爲什麼加入?
- 而且,最重要的是,這會破壞我的任何代碼嗎?
當我離開時,Python(3.4)內置函數發生了一些奇怪的事情。像map
和zip
這樣的函數現在返回對象(不是列表或元組)。Python 3.x內置函數現在返回類型
In [34]: map(lambda x:1, [1,2,3])
Out[34]: <map at 0x7fe27a15dac8>
簡短回答這些是可迭代的,用於防止分配整個列表,如果只需要有限數量的元素。由於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個,...而不必將所有這些值明確地存儲在列表本身中。
'map'不是一個函數。實際上,'輸入(map)== map'不是'builtin_function_or_method'。 – PythonNut 2014-09-22 22:35:17
@PythonNut:那麼爲什麼它在Python內建函數中列出? https://docs.python.org/3.2/library/functions.html#map – 2014-09-22 22:36:12
因爲這是Python 3.2的文檔?我不知道;它在[3.4文檔](https://docs.python.org/3.4/library/functions.html#map)中被列爲功能。但這顯然不是一種功能......除非我是啞巴,類型現在是功能。 – PythonNut 2014-09-22 22:39:09
早在2008年3.x版本開始的時候就已經出現這種情況了。你一定已經離開了一段時間。 – user2357112 2014-09-22 22:50:20
相關:http://stackoverflow.com/questions/22147757/iterators-in-python-3 – user2357112 2014-09-22 23:15:17
這主要是交互式使用的一個問題。大多數2.x代碼可以無縫工作,並且您只能在交互式解釋器中注意到。 – dawg 2014-09-22 23:20:26