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

标签 python python-3.x

我有一个简短的问题:

如果我有一个函数:

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() 必须应用于具有返回值且仅返回值的函数。

最佳答案

您在这里看到的是 lazy-evaluation 的效果. Python 3 使大多数像这样的函数(mapfilterzip 等)在它们过去在 Python 2 中急切工作的地方懒惰地工作,也就是说,而不是在调用 map(f, some_iterable) 时立即返回并具体化数据结构,map 返回一个 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]

但是!

您不应该使用mapfilter 或列表推导来解决它们的副作用。这些都是函数式结构,使用它们时应避免改变状态。这是一种糟糕的风格,而且,正如您在我的 map 对象上调用 list 时注意到的那样,它创建并立即丢弃了一个无用的 None 列表(因为不不返回任何隐式返回 None)。

因此,为了回答您的问题,是的,您可以使用“map() 用于不返回值的函数”,但您不应该。只需使用 for 循环。

关于python - 对不返回值的函数使用 map(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722712/

相关文章:

python - 如何制作具有不同输入形状的批处理的神经网络

python - 如何设置VideoCapture的窗口大小?

python - 在 Linux 中安装 Pillow(Python 模块)时失败

python-3.x - 如何使用opencv python查找图像中的最小矩形?

python - 在复平面上绘制图形

python-3.x - 类型错误 : unhashable type: 'Int64Index'

python - 如何更改除这两个字符之外的所有字符?

python - 如何检查 os.makedirs 的参数?

python - 从函数和前缀字符串在 Django 中创建默认 ID

python - PyQt5:通过小部件方法在 QAction 之后更新 MainApplication 布局