# Python `map()`函數
> 原文: [https://thepythonguru.com/python-builtin-functions/map/](https://thepythonguru.com/python-builtin-functions/map/)
* * *
于 2020 年 1 月 7 日更新
* * *
將`map()`內置函數應用于序列中的每個項目后,它會返回一個迭代器。 其語法如下:
**語法**: `map(function, sequence[, sequence, ...]) -> map object`
**Python 3**
```py
>>>
>>> map(ord, ['a', 'b', 'c', 'd'])
<map object at 0x7f36fac76dd8>
>>>
>>> list(map(ord, ['a', 'b', 'c', 'd']))
>>> [97, 98, 99, 100]
>>>
```
```py
map_obj = map(ord, ['a', 'b', 'c', 'd'])
print(map_obj)
print(list(map_obj))
```
在此,列表中的項目一次被傳遞到`ord()`內置函數。
由于`map()`返回一個迭代器,因此我們使用了`list()`函數立即生成結果。
上面的代碼在功能上等同于以下代碼:
**Python 3**
```py
>>>
>>> ascii = []
>>>
>>> for i in ['a', 'b', 'c', 'd']:
... ascii.append(ord(i))
...
>>>
>>> ascii
[97, 98, 99, 100]
>>>
```
```py
ascii = []
for i in ['a', 'b', 'c', 'd']:
ascii.append(ord(i))
print(ascii)
```
但是,使用`map()`會導致代碼縮短,并且通常運行速度更快。
在 Python 2 中,`map()`函數返回一個列表,而不是一個迭代器(就內存消耗而言,這不是很有效),因此我們無需在`list()`調用中包裝`map()`。
**Python 2**
```py
>>>
>>> map(ord, ['a', 'b', 'c', 'd']) # in Python 2
[97, 98, 99, 100]
>>>
```
## 傳遞用戶定義的函數
* * *
在下面的清單中,我們將用戶定義的函數傳遞給`map()`函數。
**Python 3**
```py
>>>
>>> def twice(x):
... return x*2
...
>>>
>>> list(map(twice, [11,22,33,44,55]))
[22, 44, 66, 88, 110]
>>>
```
```py
def twice(x):
return x*2
print(list(map(twice, [11,22,33,44,55])))
```
在此,該函數將列表中的每個項目乘以 2。
## 傳遞多個參數
* * *
如果我們將`n`序列傳遞給`map()`,則該函數必須采用`n`個參數,并且并行使用序列中的項,直到用盡最短的序列。 但是在 Python 2 中,當最長的序列被用盡時,`map()`函數停止,而當較短的序列被用盡時,`None`的值用作填充。
**Python 3**
```py
>>>
>>> def calc_sum(x1, x2):
... return x1+x2
...
>>>
>>> list(map(calc_sum, [1, 2, 3, 4, 5], [10, 20, 30]))
[11, 22, 33]
>>>
```
```py
def calc_sum(x1, x2):
return x1+x2
map_obj = list(map(calc_sum, [1, 2, 3, 4, 5], [10, 20, 30]))
print(map_obj)
```
**Python 2**
```py
>>>
>>> def foo(x1, x2):
... if x2 is None:
... return x1
... else:
... return x1+x2
...
>>>
>>> list(map(foo, [1, 2, 3, 4, 5], [10, 20, 30]))
[11, 22, 33, 4, 5]
>>>
```
## 傳遞 Lambda
* * *
如果您的函數不打算被重用,則可以傳遞 lambda(內聯匿名函數)而不是函數。
**Python 3**
```py
>>>
>>> list(map(lambda x1:x1*5, [1, 2, 3]))
[5, 10, 15]
>>>
```
```py
map_obj = map(lambda x1:x1*5, [1, 2, 3])
print(list(map_obj))
```
在此,該函數將列表中的每個項目乘以 5。
## 配對項目(僅在 Python 2 中)
* * *
最后,您可以通過傳遞`None`代替函數來配對多個序列中的項目:
**Python 2**
```py
>>>
>>> map(None, "hello", "pi")
[('h', 'p'), ('e', 'i'), ('l', None), ('l', None), ('o', None)]
>>>
```
請注意,當較短的序列用盡時,將使用`None`填充結果。
這種形式的`map()`在 Python 3 中無效。
```py
>>>
>>> list(map(None, "hello", "pi"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>>>
```
```py
print(list(map(None, "hello", "pi")))
```
如果要配對多個序列中的項目,請使用[`zip()`](/python-zip-function/)函數。
* * *
* * *
- 初級 Python
- python 入門
- 安裝 Python3
- 運行 python 程序
- 數據類型和變量
- Python 數字
- Python 字符串
- Python 列表
- Python 字典
- Python 元組
- 數據類型轉換
- Python 控制語句
- Python 函數
- Python 循環
- Python 數學函數
- Python 生成隨機數
- Python 文件處理
- Python 對象和類
- Python 運算符重載
- Python 繼承與多態
- Python 異常處理
- Python 模塊
- 高級 Python
- Python *args和**kwargs
- Python 生成器
- Python 正則表達式
- 使用 PIP 在 python 中安裝包
- Python virtualenv指南
- Python 遞歸函數
- __name__ == "__main__"是什么?
- Python Lambda 函數
- Python 字符串格式化
- Python 內置函數和方法
- Python abs()函數
- Python bin()函數
- Python id()函數
- Python map()函數
- Python zip()函數
- Python filter()函數
- Python reduce()函數
- Python sorted()函數
- Python enumerate()函數
- Python reversed()函數
- Python range()函數
- Python sum()函數
- Python max()函數
- Python min()函數
- Python eval()函數
- Python len()函數
- Python ord()函數
- Python chr()函數
- Python any()函數
- Python all()函數
- Python globals()函數
- Python locals()函數
- 數據庫訪問
- 安裝 Python MySQLdb
- 連接到數據庫
- MySQLdb 獲取結果
- 插入行
- 處理錯誤
- 使用fetchone()和fetchmany()獲取記錄
- 常見做法
- Python:如何讀取和寫入文件
- Python:如何讀取和寫入 CSV 文件
- 用 Python 讀寫 JSON
- 用 Python 轉儲對象