map
和filter
通常可以与列表推导互换,但reduce
并不像map
和filter
那样轻易换出(此外,在某些情况下,我仍然更喜欢功能语法)。但是,当你需要对参数本身进行操作时,我会发现自己正在进行语法体操,并最终必须编写完整的函数来保持可读性。
我会使用map
来简化插图单元测试,但请记住,真实的用例可能更难以表达为列表理解。
我发现了两种混乱的方法,但我实际上并没有使用它。
[afunc(*i) for i in aniter] == map(afunc, *zip(*aniter))
[afunc(*i) for i in aniter] == map(lambda i: apply(afunc, i), aniter)
是否有任何简洁,优雅的方式来表达这些表达方式的右手边?
答案 0 :(得分:11)
查看itertools了解能让您的生活更轻松的工具。
例如,您发布的代码已作为itertools.starmap
提供。
itertools.starmap(afunc, aniter)
来自文档:
创建一个迭代器,使用从iterable获得的参数计算函数。当参数参数已经从单个可迭代的元组中分组时(数据已被“预压缩”),使用而不是imap()。 imap()和starmap()之间的区别与函数(a,b)和函数(* c)之间的区别相似。相当于:
def starmap(function, iterable): # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000 for args in iterable: yield function(*args)
itertools
中隐藏了其他好东西,所以我建议您仔细阅读文档,看看是否还有其他可以使用的东西。 recipes部分还显示了可以使用itertools
中可用功能解决各种问题的方法。即使你找不到能够解决你的确切要求的食谱,你也可以使用一些作为灵感来源的想法。