簡體   English   中英

Python3.6地圖對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM