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

Cod*_*755 2 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]
Run Code Online (Sandbox Code Playgroud)

但如果我:

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

它不会起作用.

但是,如果我以这种方式编写函数,它将起作用:

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]
Run Code Online (Sandbox Code Playgroud)

即使我为它包含一个返回值:

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]
Run Code Online (Sandbox Code Playgroud)

我应该理解它,因为map()必须应用于具有返回值和返回值的函数.

jua*_*aga 9

你在这里看到的是懒惰评估的影响.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]
Run Code Online (Sandbox Code Playgroud)

然而!

你不应该使用map或filter列表理解它们的副作用.这些都是功能结构,你应该避免在使用时改变状态.它只是糟糕的风格,而且,正如你在我调用list我的地图对象时注意到的那样,它会创建并立即丢弃一个无用的列表None(因为那些不会返回任何意义的函数返回None).

所以,回答你的问题,是的,你可以使用"map()来获取不返回值的函数",但你不应该这样做.只需使用for循环.


dec*_*eze 5

map创建一个迭代器。它不会立即执行映射,而是在您使用迭代器时一项一项地执行映射。 list(map(...))立即消耗整个迭代器以将其转换为列表。但在它不起作用的测试中,您永远不会使用迭代器,因此f永远不会被调用一次。

\n\n

换句话说:不起作用:

\n\n
map(f, a)\nprint(result)\n
Run Code Online (Sandbox Code Playgroud)\n\n

作品:

\n\n
list(map(f, a))  # \xe2\x86\x90 list consumes the iterator\nprint(result)\n
Run Code Online (Sandbox Code Playgroud)\n