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
解决方案变成了多部分功能。这是我的风格还是我应该做的事情?
我不知道在任何情况下使用 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)
也就是说,lambda
、map
、 和都有很好的用途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
,诚然,这不是一个很好的例子)。
一旦你通过了训练营,请记住,map
和filter
是迭代器并进行惰性求值,因此,如果你只是循环它们而不构建列表,出于性能原因,它们通常更可取,尽管生成器可能只执行以及。