我的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
在 Python 3 中返回一种特定类型的迭代器,它不是一个列表(而是一个“映射对象”,如您所见)。你可以试试
print(list(squares))
或者只是首先使用列表推导来获取列表(无论如何,这似乎在这里工作得更好):
squares = [x**2 for x in range(10)]
map
用于在 Python 2.x 中返回列表,并且在 Python 3 中所做的更改在文档的本节中描述:
map()
并filter()
返回迭代器。如果你真的需要一个列表,一个快速的解决方法是 eglist(map(...))
,但更好的解决方法通常是使用列表推导(特别是当原始代码使用 时lambda
),或者重写代码使其根本不需要列表。map()
对于函数的副作用调用特别棘手;正确的转换是使用常规for
循环(因为创建列表只是浪费)。
map
返回一个迭代器,即这是可以在需要时循环使用的东西。要获取实际列表,请执行print(list(squares))
. 或者
for a in squares:
print(a)
起初这看起来很奇怪,但想象一下你有 1mio 号码。如果它会立即创建一个列表,那么您需要为 1mio 元素分配内存,即使您可能一次只想查看一个。使用迭代器,只有在必要时才会将完整的元素列表保存在内存中。
map()
在 Python 2 和 3 之间发生了变化。在 Python 2 中,map
会将函数应用于可迭代对象的值并返回一个列表。在 Python 3 中,map
返回一个迭代器,该迭代器在您循环时将函数应用于迭代值。
蟒蛇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]