Python习语,用于将顺序步骤应用于iterable

Python习语,用于将顺序步骤应用于iterable,python,idioms,Python,Idioms,在执行数据处理任务时,我经常发现自己将一系列合成、矢量化函数等应用于某些输入数据,以生成最终结果。理想情况下,我想要的东西将工作的列表和生成器(除了任何其他iterable)。我可以想出许多方法来构造代码来实现这一点,但我能想到的每一种方法都有一种或多种方法让我觉得不干净/不自然。我在下面概述了可以想到的不同方法,但我的问题是-有推荐的惯用方法吗? 我能想到的方法,用一个简单的例子说明,通常代表: 把它写成一个大表达式 我想这在我看来是这些选项中最不坏的一个,但是在一个通用命名的占位符变量中存储

在执行数据处理任务时,我经常发现自己将一系列合成、矢量化函数等应用于某些输入数据,以生成最终结果。理想情况下,我想要的东西将工作的列表和生成器(除了任何其他iterable)。我可以想出许多方法来构造代码来实现这一点,但我能想到的每一种方法都有一种或多种方法让我觉得不干净/不自然。我在下面概述了可以想到的不同方法,但我的问题是-有推荐的惯用方法吗?

我能想到的方法,用一个简单的例子说明,通常代表:

把它写成一个大表达式
我想这在我看来是这些选项中最不坏的一个,但是在一个通用命名的占位符变量中存储东西对我来说感觉不太好,让我怀疑有更好的解决方法。

对于样式问题,代码复查通常是一个更好的地方。解决问题的方法也更多。但CR可能会对示例的完整性吹毛求疵

但我可以看到一些观察结果:

  • 如果将此计算封装在函数中,命名就没什么大不了的了。这些名称不必具有全局意义

  • 您的许多表达式都是生成器。Itertools倾向于生成生成器或gen.表达式。所以内存使用应该不是什么大问题


我丢失了
返回值
。该函数可以返回如我所示的生成器或已计算的列表

groupby
keyfunc
不是关键字参数,而是位置参数

groupby
是一个复杂的函数。它返回一个生成元组的生成器,元组的一个元素就是生成器本身。返回此选项会使其更加明显

((key, list(group)) for key, group in grouped)

因此,澄清其用法的代码样式是可取的。

这在很大程度上取决于观点和首选样式。还有其他样式,例如or,允许更自然的调用级联。
squared = [x**2 for x in input]
filtered = filter(lambda x: x < 2, squared)
grouped = itertools.groupby(filtered, keyfunc=lambda x: x % 3)
result = [sum(group) for key, group in grouped]
tmp = [x**2 for x in input]
tmp = filter(lambda x: x < 2, tmp)
tmp = itertools.groupby(tmp, keyfunc=lambda x: x % 3)
result = [sum(group) for key, group in tmp]
def better_name(input):
   squared = (x**2 for x in input)   # gen expression
   filtered = filter(lambda x: x < 2, squared)
   grouped = itertools.groupby(filtered, lambda x: x % 3)
   result = (sum(group) for key, group in grouped)
   return result

list(better_name(input))
filtered = filter(lambda x: x < 2, squared)
filtered = (x for x in squared if x<2)
((key, list(group)) for key, group in grouped)