在python中使用map()更新现有列表时出现问题

在python中使用map()更新现有列表时出现问题,python,python-3.x,functional-programming,map-function,Python,Python 3.x,Functional Programming,Map Function,为什么返回空列表: def word_lengths(phrase): result = [] map(lambda x: result.append(x) , phrase.split()) return result 其中,返回短语中每个单词的长度列表: def word_lengths(phrase): return list(map(lambda x: len(x) , phrase.split())) 在Python3中,map生成一个生成器,该

为什么返回空列表:

def word_lengths(phrase):

    result = []
    map(lambda x: result.append(x) , phrase.split())
    return result
其中,返回短语中每个单词的长度列表:

def word_lengths(phrase):

    return list(map(lambda x: len(x) , phrase.split()))

在Python3中,
map
生成一个生成器,该生成器是惰性计算的

您需要对其进行迭代以使其生效,例如,通过调用其上的
list
构造函数:

result = []
list(map(lambda x: result.append(x) , phrase.split()))
return result
正如您可能预期的那样,这会导致
结果发生变异

但请注意,可以通过更简单的方式实现这一点:

return phrase.split()

在Python3中,
map
生成一个生成器,该生成器是惰性计算的

您需要对其进行迭代以使其生效,例如,通过调用其上的
list
构造函数:

result = []
list(map(lambda x: result.append(x) , phrase.split()))
return result
正如您可能预期的那样,这会导致
结果发生变异

但请注意,可以通过更简单的方式实现这一点:

return phrase.split()

请提供一个输入(短语)和预期输出与实际输出的对比示例。请注意,
lambda x:len(x)
只是表示
len
的一种更为复杂的方式,而整个事情将更为pythonical地表示为一个列表理解:
[len(word)for word in phrase.split()]
。可能的重复(这是关于
dict.update
,而不是
list.append
,但是关于它的所有其他内容都是一样的)首先,在前一种情况下,您没有将
map
调用分配给任何对象。甚至调用
list(map(…
带有
结果.append(x))也没有
由于lambda只会返回一个
None
列表,该列表中的元素数量与
phrase.split()中的元素数量相同,因此请提供一个示例输入(phrase)和预期输出与实际输出的比较。请注意
lambda x:len(x)
只是说
len
的一种更为复杂的方式,整个事情将更像是一个列表理解:
[len(word)for word in phrast.split()]
。可能的重复(它是关于
dict.update
,而不是
list.append
,但它的其他一切都是一样的)首先,在前一种情况下,您没有将
map
调用分配给任何对象。甚至使用
结果调用
list(map(…
)。append(x)
,因为您的lambda只会返回一个
None
列表,其中包含的元素数量与
phrase.split()中的元素数量相同
直接使用更具python风格。滥用
map
产生副作用是对函数式编程习惯用法的深刻误解。
map
(以及列表理解和生成器表达式)应始终无副作用,以避免在距离较远的地方发生大量令人毛骨悚然的行为,从而导致难以对代码进行推理。另外,请注意:对于极少数情况,使用
map
产生副作用是有意义的(通常使用
多处理
map
-类函数来并行化任务),强制它运行到完成的最佳方法是使用
maxlen
of
0
将它包装在
collections.deque
构造函数中(该构造函数经过优化,可以在不存储任何内容的情况下运行迭代器),例如
collection.deque(map(…),0)
这将避免无目的地列出一个潜在的大型临时
列表
None
s。我很欣赏副作用评论和短语.split()是一种更简单的方法。理解地图是python课程中的一个项目问题,我刚刚知道是否可以在lambda中更新外部列表…纯粹是学术性的。返回
phrase.split()
直接使用更具python风格。滥用
map
产生副作用是对函数式编程习惯用法的深刻误解。
map
(以及列表理解和生成器表达式)应始终无副作用,以避免在距离较远的地方发生大量令人毛骨悚然的行为,从而导致难以对代码进行推理。另外,请注意:对于极少数情况,使用
map
产生副作用是有意义的(通常使用
多处理
map
-类函数来并行化任务),强制它运行到完成的最佳方法是使用
maxlen
of
0
将它包装在
collections.deque
构造函数中(该构造函数经过优化,可以在不存储任何内容的情况下运行迭代器),例如
collection.deque(map(…),0)
这将避免无目的地列出一个潜在的大型临时
列表
None
s。我很欣赏副作用评论和短语.split()是一种更简单的方法。理解地图是python课程中的一个项目问题,我只是想知道是否可以在lambda中更新外部列表…纯粹是学术性的。