Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python a';对于';循环和映射_Python_Python 3.x_Function - Fatal编程技术网

Python a';对于';循环和映射

Python a';对于';循环和映射,python,python-3.x,function,Python,Python 3.x,Function,从标题上看,是的,有区别。现在应用到我的场景:让我们考虑一个类虚构< /代码>: 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_i

从标题上看,是的,有区别。现在应用到我的场景:让我们考虑一个类<代码>虚构< /代码>:

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)

它在做什么?

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

D = Dummy()
items = [1, 2, 3, 4]
list(map(D.attach_item, items))
是的,不要在代码中这样做:),但是这个例子只是对理解有用。

引用

返回一个迭代器,该迭代器将函数应用于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]
当你把它和其他功能结合起来,比如


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

map
函数返回一个可编辑的map对象
map
正在惰性地执行其计算,因此除非迭代该对象,否则不会调用该函数

因此,如果你这样做:

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

预期的结果会出现。

应该读一下文档x')我以为我知道地图在做什么,结果证明我错了。。。谢谢如果你把(x)@joaquin列出来也一样,那就是我被骗的地方。在我看来,当你做
list(x)
时,你想把
x
转换成一个列表。@Mathieu你可以。结果将是一个没有的列表。但作为一个副作用,该函数将修改虚拟对象的内部状态,这正是您想要的。一般来说,当您对副作用比实际情况更感兴趣时,惰性评估不是很直观result@Ant出于这个原因,我认为使用
map
作为副作用是糟糕的编程风格。这是一种令人困惑的方法,OP的问题显示了这种困惑。当我以前使用map时,它总是在需要捕获函数返回的场景中(例如,您的示例)。因此,我正在应用
list()
。我没有注意到map只是返回一个迭代器的事实:/See。另一个重复项的可能重复项和相关项
x = map(D.attach_item, items)
for i in x:
    continue