使用map()vs是否有价值?

rod*_*der 10 python for-loop map-function

map()是否像"for"一样遍历列表?使用map vs是否有价值?

如果是这样,现在我的代码如下所示:

for item in items:
    item.my_func()
Run Code Online (Sandbox Code Playgroud)

如果它有意义,我想使它map().那可能吗?什么样的例子?

Ste*_*202 23

您可以使用map而不是显示的for循环,但由于您似乎没有使用结果item.my_func(),因此不建议这样做.map如果要将没有副作用的函数应用于列表的所有元素,则应使用此选项.在所有其他情况下,使用显式的for循环.

此外,从Python 3.0开始map返回一个生成器,因此在这种情况下map将不会表现相同(除非您显式评估生成器返回的所有元素,例如通过调用list它).


编辑:kibibu在评论中询问澄清为什么map第一个参数不应该是具有副作用的函数.我会回答这个问题:

map意味着f 在数学意义上传递一个函数.在这种情况下f,对第二个参数的元素应用哪个顺序无关紧要(当然,只要它们以原始顺序返回).更重要的是,在这些情况下,在map(g, map(f, l))语义上等同于map(lambda x: g(f(x)), l),无论其各自的输入的顺序fg适用.

例如,map返回和迭代器或一次完整列表无关紧要.但是,如果f和/或g引起副作用,那么只有当语义map(g, map(f, l))在任何阶段g应用于前面返回的前n个元素时才能保证这种等价,这适用于(n + 1) st元素.(这意味着必须执行最懒的迭代 - 它在Python 3中执行,但在Python 2中没有!)map(f, l)map(f, l)flmap

更进一步:即使我们假设Python 3的实现map,如果输出map(f, l)例如itertools.tee在提供给外部map调用之前通过,则语义等价可能很容易被破坏.

上述讨论似乎具有理论性质,但随着程序变得越来越复杂,它们变得更难以推理,因此更难以调试.确保某些东西是不变的可以在某种程度上缓解这个问题,并且实际上可以防止一类错误.

最后,map提醒许多人在各种(纯粹)功能语言中真正的功能对应.将它传递给具有副作用的"功能"将使这些人感到困惑.因此,作为替代方案(即,使用显式循环)并不比调用更难实现map,强烈建议限制使用map要应用的函数不会导致副作用的情况.


Kiv*_*Kiv 5

你可以使用这样的地图写这个:

map(cls.my_func, items)
Run Code Online (Sandbox Code Playgroud)

用您正在迭代的项的类替换cls.

如Stephan202所述,在这种情况下不建议这样做.

通常,如果要通过将某些功能应用于列表中的每个项目来创建新列表,请使用map.这具有隐含的意义,即函数没有副作用,因此您可以(可能)并行运行映射.

如果您不想创建新列表,或者该函数有副作用,请使用for循环.在您的示例中就是这种情况.