for循环与map的区别

时间:2018-08-03 10:58:59

标签: python python-3.x function

是的,标题是有区别的。现在应用于我的场景:让我们考虑一个类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)

它在做什么?

3 个答案:

答案 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)

引用documentation

  

返回一个迭代器,该迭代器将函数应用于所有可迭代项,并产生结果。

这意味着您必须收集迭代器,例如

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]