是的,标题是有区别的。现在应用于我的场景:让我们考虑一个类Dummy
:
class Dummy:
def __init__(self):
self.attached = []
def attach_item(self, item):
self.attached.append(item)
如果我使用这个:
D = Dummy()
items = [1, 2, 3, 4]
for item in items:
D.attach_item(item)
我确实得到了D.attached = [1, 2, 3, 4]
。但是,如果我将函数attach_item
映射到items
,则D.attached
仍然为空。
map(D.attach_item, items)
它在做什么?
答案 0 :(得分:53)
一个非常有趣的问题,答案很有趣。
map
函数返回一个可迭代的Map对象。 map
正在懒惰地执行其计算,因此除非您迭代该对象,否则不会调用该函数。
因此,如果您这样做:
x = map(D.attach_item, items)
for i in x:
continue
将显示预期结果。
答案 1 :(得分:16)
map
仅创建一个迭代器。您应该遍历它,以将项目添加到D.attached
中。像这样:
D = Dummy()
items = [1, 2, 3, 4]
list(map(D.attach_item, items))
是的,不要在您的代码中这样做:)但是该示例仅对理解有用。
答案 2 :(得分:9)
返回一个迭代器,该迭代器将函数应用于所有可迭代项,并产生结果。
这意味着您必须收集迭代器,例如
list(map(D.attach_item, items))
> [None, None, None, None]
嗯,很奇怪。为什么没有,没有,...
是的,您可以在map语句中转换任何循环,但这并不总是有用的。 Map接受参数并对其执行某些操作(在大多数情况下)并返回该参数,而没有副作用!这是一个示例:
def add(a):
return a + 3
list(map(add, items))
> [4, 5, 6, 7]
当您将其与filter
等其他功能结合使用时,真正的力量就来了
def add(a):
return a + 3
def odd(a):
return a % 2 == 1
list(map(add, filter(odd, items)))
> [4, 6]