我有一个简短的问题:
如果我有一个函数:
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 使大多数像这样的函数(map
、filter
、zip
等)在它们过去在 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]
但是!
您不应该不使用map
或filter
或列表推导来解决它们的副作用。这些都是函数式结构,使用它们时应避免改变状态。这是一种糟糕的风格,而且,正如您在我的 map 对象上调用 list
时注意到的那样,它创建并立即丢弃了一个无用的 None
列表(因为不不返回任何隐式返回 None
)。
因此,为了回答您的问题,是的,您可以使用“map() 用于不返回值的函数”,但您不应该。只需使用 for 循环。
关于python - 对不返回值的函数使用 map(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722712/