我遇到map
功能问题。当我想打印创建的列表时,解释器显示指针:
>>> squares = map(lambda x: x**2, range(10))
>>> print(squares)
<map object at 0x0000000002A086A0>
有什么问题?
答案 0 :(得分:4)
问题是没有创建列表。 {3}}在Python 3中返回一个特定类型的生成器,它不是一个列表(而是一个'map object',如你所见)。你可以尝试
print(list(squares))
或者只是使用列表推导来获取列表(这似乎在这里似乎更好):
squares = [x**2 for x in range(10)]
map
用于返回Python 2.x中的列表,并且在文档的map
部分中描述了在Python 3中所做的更改:
map()
和filter()
返回迭代器。 如果您确实需要列表,可以快速修复list(map(...))
,但更好的解决方法通常是使用列表解析(特别是当原始代码使用lambda
)时,或者重写代码以便根本不需要列表。特别棘手的是map()
为函数的副作用调用;正确的转换是使用常规for
循环(因为创建列表只会浪费)。
答案 1 :(得分:1)
map
会返回一个generator,也就是说,这可以用来在需要时循环。要获取实际列表,请执行print(list(squares))
。或者
for a in squares:
print a
更新:这看起来很奇怪,但想象你有1个数字。如果它会立即创建一个列表,你需要为1mio元素分配内存,即使你可能只想一次查看一个。使用生成器,只有在必要时才会将完整的元素列表保存在内存中。
答案 2 :(得分:1)
map()在python 2和3之间发生了变化。在python 2中,map会将函数应用于iterable并返回一个列表。在python 3中,map返回一个生成器,当你循环它时,它将函数应用于迭代器。
python2:
>>> print map(lambda x: x**2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
python3:
>>> print(map(lambda x: x**2, range(10)))
<map object at 0x7fb4b7c82250>
>>> print([x for x in map(lambda x: x**2, range(10))])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
答案 3 :(得分:0)
您可以像这样使用拆包:
>>> [*map(lambda x: x**2, range(10))]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]