鉴于以下内容:
(I)a =地图(功能,序列)
(II)a = [顺序x的函数(x)]
我什么时候需要使用(I)?为什么在后者可订阅且IMO更具可读性时选择列表上的地图对象?
此外,有人可以解释以下代码的第6行(Python 3):
>>>import math
>>>a = map(int,str(math.factorial(100)))
>>>sum(a)
648
>>>sum(a)
0
为什么地图对象的总和在变化?
答案 0 :(得分:2)
我是迭代器 - 它会创建一个值流然后消失。 II是列表 - 它会持续一段时间,并且具有很多功能,例如len(mylist)
和mylist[-3:]
。
sum
发生了变化,因为迭代器在使用后会消失。
使用列表和列表推导。如果处理大量数据,那么迭代器(以及生成器和生成器理解)非常棒,但它们可能会令人困惑。
或者,使用迭代器并转换为列表以进行进一步处理:
a = list( map(int,str(math.factorial(100))) )
答案 1 :(得分:1)
来自the docs:
将函数应用于iterable的每个项目并返回结果列表。如果传递了额外的可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项...
sum
更改为0,因为迭代器是迭代,因此它变为空。这与.read()
的概念相同(尝试调用x = open('myfile.txt')
,然后两次输入print x.read()
。)
为了保留可迭代,请使用list()
:
>>> import math
>>> a = map(int,str(math.factorial(100)))
>>> sum(a)
648
>>> sum(a)
0
>>> a = list(map(int,str(math.factorial(100))))
>>> sum(a)
648
>>> sum(a)
648
来自the docs的示例:
>>> seq = range(8)
>>> def add(x, y): return x+y
...
>>> map(add, seq, seq)
[0, 2, 4, 6, 8, 10, 12, 14]
答案 2 :(得分:1)
我什么时候需要使用(I)?为什么在后者可订阅且IMO更具可读性时选择列表上的地图对象?
map
是在Python 1.0中引入的,而列表理解直到Python 2.0才引入。
对于Python 2+,您从不需要使用其中一个。
仍然使用map
的原因可能包括:
map
在各种语言中非常常见。如果Python不是您的母语,那么#34; map"是你要查找的功能。 map
通常较短。比较map
和lambda f,l: [f(x) for x in l]
。