何时以及为何将 lambda 函数映射到列表

Emp*_*ero 3 python functional-programming

我正在学习数据科学训练营的预备课程,它在课程的早期就介绍了lambda关键字和map功能。filter它为您提供了语法以及如何使用它,但我正在寻找上下文的原因和时间。以下是他们的解决方案示例:

def error_line_traces(x_values, y_values, m, b):
    return list(map(lambda x_value: error_line_trace(x_values, y_values, m, b, x_value), x_values))
Run Code Online (Sandbox Code Playgroud)

我感觉好像每次我在实验室检查他们的解决方案时,我都将单行return解决方案变成了多部分功能。这是我的风格还是我应该做的事情?

wja*_*rea 5

我不知道在任何情况下使用 lambda 映射是有意义的,因为使用生成器表达式更短、更清晰。lambda 映射的列表更糟糕,因为它可能是列表理解

def error_line_traces(x_values, y_values, m, b):
    return [error_line_trace(x_values, y_values, m, b, x) for x in x_values]
Run Code Online (Sandbox Code Playgroud)

看看它多短多清晰!

lambda 过滤器也可以重写为推导式。例如:

list(filter(lambda x: x>5, range(10)))
[x for x in range(10) if x>5]
Run Code Online (Sandbox Code Playgroud)

也就是说,lambdamap、 和都有很好的用途filter,但通常不会组合使用。根据上下文, Even 也list(map(...))可以,例如将字符串列表转换为整数列表:

[int(x) for x in list_of_strings]
list(map(int, list_of_strings))
Run Code Online (Sandbox Code Playgroud)

这些都是清晰和简洁的,所以真正需要考虑的是阅读你的代码的人是否会熟悉map,以及你是否想给可迭代的元素一个有意义的名称(这里x,诚然,这不是一个很好的例子)。

一旦你通过了训练营,请记住,mapfilter迭代器并进行惰性求值,因此,如果你只是循环它们而不构建列表,出于性能原因,它们通常更可取,尽管生成器可能只执行以及。