Python 何时使用;“快捷方式”:列表理解、生成器表达式、lambda函数?

Python 何时使用;“快捷方式”:列表理解、生成器表达式、lambda函数?,python,lambda,list-comprehension,generator-expression,Python,Lambda,List Comprehension,Generator Expression,我开始工作,在数据分析的环境中更加熟悉Python,并且刚刚了解了列表理解,我觉得这非常优雅 尽管我意识到有可能会以可读性为代价过度爱上它,但我真的没有找到任何关于何时或何时不使用它的指导原则或经验法则 在我自己的代码中,我在递归函数中使用了这个生成器表达式 -->find_children()是一个用户定义的函数,用于创建分层数据 (find_children(ancestor) for ancestor in parents if len(parents) > 0) 而不是 if l

我开始工作,在数据分析的环境中更加熟悉Python,并且刚刚了解了列表理解,我觉得这非常优雅

尽管我意识到有可能会以可读性为代价过度爱上它,但我真的没有找到任何关于何时或何时不使用它的指导原则或经验法则

在我自己的代码中,我在递归函数中使用了这个生成器表达式 -->find_children()是一个用户定义的函数,用于创建分层数据

(find_children(ancestor) for ancestor in parents if len(parents) > 0)
而不是

if len(parents) > 0:
    for ancestor in parents:
        find_children(ancestor)
它看起来更整洁,但这实际上是我唯一的理由


因此,我想收集一些有经验的Pythonistas的意见,以及他们关于这方面的方法,或者什么是最佳实践。

列表理解是惯用的python代码,因此非常好。他们的主要竞争对手是使用map()、filter()等的函数样式。这两种样式都非常好。当你有很长的陈述时,我可能会避免使用列表理解,例如。
x[“data”][“data”][“data”]代表某物中的x]
自找麻烦

嵌套列表理解也是有害的,因为可读性差,我个人认为它们是一种代码味道


最后,好的代码的目标是可读性——当您完成一段代码时,请后退一步,并尝试判断谁是真正可读的代码。引入函数和变量以提高可读性。列表理解只是其中的一部分。

不要仅仅为了调用函数的副作用而使用iterables。脱离上下文,生成器表达式不会做任何事情,因为您没有对其进行迭代。它只是创建了一个生成器,该生成器在没有调用
find_children
的情况下被立即丢弃。当你想要一个列表时,使用列表理解,而不是当你只想将一个普通的
for
循环压缩到一行时。好吧,那么为了创建一个单行程序,你不需要这样做,如果代码很简单,我理解。在我的示例中,它确实有效地完成了与下面代码片段相同的工作。这与其说是一个函数,不如说是一个过程,不返回任何内容。从列表理解到常规
for
循环的转换是不正确的。列表理解中的(可选)
if
过滤iterable的输出。请看这里:你能谈谈问题中的例子吗?这是一个不错的一般性建议,但它没有解决OP如何使用它们的任何问题。