代码之家  ›  专栏  ›  技术社区  ›  Mathieu

“for”循环和map之间的区别

  •  42
  • Mathieu  · 技术社区  · 6 年前

    从标题上看,是有区别的。现在应用到我的场景:让我们考虑一个类 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 回复  |  直到 6 年前
        1
  •  53
  •   Peter Mortensen icecrime    6 年前

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

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

    如果你这么做了:

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

    预期的结果将会出现。

        2
  •  16
  •   Lev Zakharov Riss    6 年前

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

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

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

        3
  •  9
  •   hellow Adolfo Casari    6 年前

    引用 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]