Map 函式
Jinku Hu
2020年6月25日
map
函式是 Python 函數語言程式設計的內建函式中最簡單的函式。map()
將指定的函式應用於可迭代序列中的每個元素:
names = ["Fred", "Wilma", "Barney"]
Python 3.x3.0
map(len, names) # map in Python 3.x is a class; its instances are iterable
# Out: <map object at 0x00000198B32E2CF8>
它的具體意思就是將 len()
函式應用在列表中的每個元素,但返回一個 map
物件例項,你可以用 __next__()
函式逐一將每個結果取出。
在 Python 2.x 中的 future_builtins
模組中引入了跟 Python3 相容的 map
函式
Python 2.x2.6
from future_builtins import map # contains a Python 3.x compatible map()
map(len, names) # see below
# Out: <itertools.imap instance at 0x3eb0a20>
或者,在 Python 2 中,可以使用 itertools
中的 imap
來獲取生成器
Python 2.x2.3
from itertools import imap
map(len, names) # map() returns a list
# Out: [4, 5, 6]
imap(len, names) # itertools.imap() returns a generator
# Out: <itertools.imap at 0x405ea20>
結果可以顯式轉換為一個列表以消除 Python 2 和 3 之間的差異:
list(map(len, names))
# Out: [4, 5, 6]
map()
可以用等效的列表推導式或生成器表示式來替換:
[len(item) for item in names] # equivalent to Python 2.x map()
# Out: [4, 5, 6]
(len(item) for item in names) # equivalent to Python 3.x map()
# Out: <generator object <genexpr> at 0x00000195888D5FC0>
map
函式具體例項
你可以獲取每個元素的絕對值:
list(map(abs, (1, -1, 2, -2, 3, -3))) # the call to `list` is unnecessary in 2.x
# Out: [1, 1, 2, 2, 3, 3]
map
也支援對列表的匿名函式操作,
map(lambda x: x * 2, [1, 2, 3, 4, 5])
# Out: [2, 4, 6, 8, 10]
我們也可以用自定義的函式,比如將十進位制值轉換為百分比:
def to_percent(num):
return num * 100
list(map(to_percent, [0.95, 0.75, 1.01, 0.1]))
# Out: [95.0, 75.0, 101.0, 10.0]
或將美元兌換成歐元(給定匯率):
from functools import partial
from operator import mul
rate = 0.9 # fictitious exchange rate, 1 dollar = 0.9 euros
dollars = {"hidden somewhere": 1000, "jeans": 45, "bank": 5000}
# Below it gives the values in Euro
sum(map(partial(mul, rate), dollars.values()))
# Out: 5440.5
functools.partial
是一種方便的方法來給出函式的引數,以便它們可以使用 map
而不是使用 lambda
或建立自定義函式。