对于不返回值的函数使用map()

2023-12-07

我有一个快速的问题:

如果我有一个函数:

a = [1,2,3,4,5,6,7]
def f(x):
    return (x**2)
result = list(map(f, a))
print(result)
>>> [1, 4, 9, 16, 25, 36, 49]

但如果我:

result = []
a = [1,2,3,4,5,6,7]
def f(x):
    result.append(x**2)
map(f, a)
print(result)
>>> []

这是行不通的。

但是,如果我这样编写函数,它就会起作用:

result = []
a = [1,2,3,4,5,6,7]
def f(x):
    result.append(x**2)
for i in a:
    f(i)
print(result)
>>> [1, 4, 9, 16, 25, 36, 49]

即使我包含它的返回值:

result = []
a = [1,2,3,4,5,6,7]
def f(x):
    result.append(x**2)
    return x**2
map(f, a)
print(result)           # >>> []
print(list(map(f,a)))   # >>> [1,2,3,4,5,6,7]

我是否应该将其理解为 map() 必须应用于具有返回值且仅返回值的函数。


你在这里看到的效果是惰性评估。 Python 3 制作了大多数这样的函数(map, filter, zip等)在Python 2中以前热切地工作的地方懒惰地工作,也就是说,当你调用时,不是立即返回并具体化数据结构map(f, some_iterable), 反而,map返回一个映射对象,然后可以对其进行迭代以具体化数据结构或逐一处理元素(让您以节省内存的方式工作)。

>>> result = []
>>> m = map(lambda x: result.append(x), range(10))
>>> m
<map object at 0x10a0b7278>
>>> result
[]
>>> next(m)
>>> result
[0]
>>> next(m)
>>> result
[0, 1]
>>> list(m)
[None, None, None, None, None, None, None, None]
>>> result
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

However!

你应该not正在使用map or filter或列表理解的副作用。这些都是函数式构造,在使用它们时应该避免改变状态。这简直就是糟糕的风格,而且,正如你在我打电话时注意到的那样list在我的地图对象上,它创建并立即丢弃无用的列表None(因为不返回任何内容的函数隐式返回None).

所以,为了回答你的问题,是的,你可以使用“map()来处理不返回值的函数”,但是你不应该。只需使用 for 循环即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于不返回值的函数使用map() 的相关文章

随机推荐