ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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/)函数。 * * * * * *