我在使用map
函数时遇到了问题。当我想打印创建的列表时,解释器会显示指针:
>>> squares = map(lambda x: x**2, range(10))
>>> print(squares)
<map object at 0x0000000002A086A0>
什么是问题?
我在使用map
函数时遇到了问题。当我想打印创建的列表时,解释器会显示指针:
>>> squares = map(lambda x: x**2, range(10))
>>> print(squares)
<map object at 0x0000000002A086A0>
map
返回一种特定类型的迭代器,而不是列表(可以看到是“映射对象”)。您可以尝试:print(list(squares))
或者只需使用列表推导式直接获取列表(在这种情况下似乎更好):
squares = [x**2 for x in range(10)]
map
返回一个列表。Python 3中的变化在文档的这个部分中有所描述:
map()
和filter()
现在返回迭代器。如果您确实需要一个列表,一个快速的解决方法是使用list(map(...))
,但更好的解决方法通常是使用列表推导式(特别是当原始代码使用lambda
时),或者重写代码以完全不需要列表。特别棘手的是为了函数的副作用而调用map()
;正确的转换是使用普通的for
循环(因为创建一个列表只会是浪费)。map
返回一个迭代器,也就是说,一旦需要,它可以用来循环遍历。要获取实际的列表,请执行print(list(squares))
。或者
for a in squares:
print(a)
一开始看起来可能有些奇怪,但请想象一下你有100万个数字。如果它立即创建一个列表,你需要为100万个元素分配内存,即使你可能只想一次查看一个元素。使用迭代器,只有在必要时才会将所有元素的完整列表保存在内存中。
map()
在 Python 2 和 3 中有所不同。在 Python 2 中,map
会将一个函数应用于可迭代对象的值并返回一个列表。而在 Python 3 中,map
返回一个迭代器,在循环中遍历时对迭代的值应用该函数。
Python 2:
>>> print map(lambda x: x**2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
python3 - map返回一个迭代器对象:
>>> print(map(lambda x: x**2, range(10)))
<map object at 0x7fb4b7c82250>
这可以被任何消费迭代器的东西使用,比如list
>>> print(list(map(lambda x: x**2, range(10))))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
你可以使用解包操作,像这样:
>>> [*map(lambda x: x**2, range(10))]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
list(map(lambda x: x**2, range(10)))
可能比较难读懂,但实际上应该使用列表推导式来代替:[x**2 for x in range(10)]
。 - wjandrea