[英]Python3.6 map object
以下兩個代碼段之間有什么區別:
a1 = map(int,'222211112211')
和
a2 = int('222211112211')
為什么我可以遍歷類型為int
a1
?
例如:我可以用a1
做這樣的事情:
for i in a1:
print(i)
但是不是用a2
嗎?
在a1
,您正在遍歷一個string
並將其每個字符轉換為一個int
,結果是一個int
的迭代器,請查看map
的文檔:
list(a1) # use `list()` to consume the iterator
=> [2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1]
在a2
,您正在將string
轉換為int
,結果是int
。 他們是完全不同的東西!
a2
=> 222211112211
這就是為什么您可以遍歷a1
的原因,因為它是一個迭代器,而不是int
。 這就是為什么您不能遍歷a2
的原因,它只是一個int
。
我認為在這種情況下最好的做法是檢查REPL中的實際值。
>>> a1 = map(int, '2212')
>>> a1
<map object at 0x7f0036c2a4a8>
>>> list(a1)
[2, 2, 1, 2]
>>> a2 = int('2212')
>>> a2
2212
因此a1
是一個特殊的映射對象,事實證明它是可迭代的。 它存儲每個字符'2212'
,分別轉換為整數。 同時, a2
只是將整個字符串轉換為簡單的整數。 對a2
進行迭代將是一個錯誤,但是對a1
進行整數算術也將是一個錯誤。
在python 3.6中,map函數返回一個generator,
注意:這些未整體加載到內存中
這是python3中map的實現
def map(func, iterable):
for i in iterable:
yield func(i)
當您以iterable
的方式調用地圖時,該值是在現場生成的,而不是加載整個對象,這在某些情況下可能導致內存崩潰。
list(map())
所做的是將整個列表加載到內存中,這就是python2版本的map所做的工作
`a=int('2212')`
給出a
整數值,表示它不是可迭代的
a=map(int,'2212')
返回一個可迭代的生成器對象
<map object at 0x7f97e30d7f98>
這是一個可迭代的過程,它將字符串中的每個字符轉換為int並逐一產生結果
所以
a=map(int ,'2212')
for i in a:
print(i)
for i in a:
print(i)
會打印
2
2
1
2
第二次調用存儲的map
對象不會產生任何結果,因為該函數在第一次運行中的值用完了
如果要在第二次運行中獲取值,請將其轉換為一個列表,使其駐留在主內存list(a)
或者如果確實很長,則將map對象的結果存儲在單獨的文件中,然后從中讀取
在Python 3中, map
返回可在for循環中使用的迭代器。
map
至少需要兩個參數,一個函數和一個可迭代的參數。 這里的int
是函數,字符串'222211112211'
是可迭代的對象。 map
將函數應用於每個iterable的值。 在這里, int
將分別應用於“ 2”,“ 2”,“ 2”,...“ 2”,“ 1”,“ 1”,並使它們全部為整數。 map
將返回一個迭代器,該迭代器允許您遍歷上一步產生的結果:(2,2,2,...,1,1)
對於a2
,您要從int
函數中創建一個整數,並且該整數不可迭代。 因此,您無法循環播放。
以下是從Python 3文檔引用的map
說明。
map(function,iterable,...):返回一個將函數應用於iterable的每個項目的迭代器,並產生結果。 如果傳遞了其他可迭代參數,則函數必須采用那么多參數,並且並行地將其應用於所有可迭代對象的項。 對於多個可迭代對象,迭代器在最短可迭代對象耗盡時停止。 對於函數輸入已經安排在參數元組中的情況,請參見itertools.starmap()。
值得注意的是,在Python 2中, map
返回的是列表而不是迭代器。 在Python 3中,必須顯式地使其成為類似list(map(int, "222"))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.