'for'循环和地图之间的区别

问题描述 投票:42回答:3

从标题来看,是的,有区别。现在适用于我的场景:让我们考虑一个类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映射到itemsD.attached仍然是空的。

map(D.attach_item, items)

它在做什么?

python python-3.x function
3个回答
53
投票

一个非常有趣的问题,有一个有趣的答案。

map函数返回一个可迭代的Map对象。 map正懒惰地执行计算,因此除非您迭代该对象,否则不会调用该函数。

所以,如果你这样做:

x = map(D.attach_item, items)
for i in x:
    continue

预期结果将显示出来。


16
投票

map只创建一个迭代器。您应该遍历它以将项目添加到D.attached中。像这样:

D = Dummy()
items = [1, 2, 3, 4]
list(map(D.attach_item, items))

是的,不要在你的代码中这样做:)但这个例子对于理解是有用的。


9
投票

引用documentation

返回一个迭代器,它将函数应用于每个iterable项,从而产生结果。

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

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]
© www.soinside.com 2019 - 2024. All rights reserved.