在Haskell中,实现以下内容最常用的方法是什么:
foldl (+) 0 [1,2,3,4,5]
--> 15或其在Ruby中的等价物:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15显然,Python提供了reduce函数,它是fold的一个实现,与上面完全一样,然而,有人告诉我编程的“pythonic”方法是避免lambda项和高阶函数,尽可能地更喜欢列表理解。因此,在Python语言中,有没有一种不是reduce函数的折叠列表或类似列表的结构的首选方法,或者reduce是实现这一目的的惯用方法?
发布于 2012-04-29 02:35:51
对数组求和的Pythonic方法是使用sum。出于其他目的,您有时可以使用reduce (来自functools模块)和operator模块的某种组合,例如:
def product(xs):
return reduce(operator.mul, xs, 1)请注意,在哈斯克尔术语中,reduce实际上是一个foldl。没有特殊的语法来执行折叠,也没有内置的foldr,实际上使用带有非关联操作符的reduce被认为是不好的风格。
使用高阶函数非常简单;它很好地利用了Python的原则,即一切都是对象,包括函数和类。您说得对,一些Pythonistas不喜欢lambdas,但主要是因为当它们变得复杂时,它们的可读性不是很好。
发布于 2015-08-20 01:36:28
Haskell
foldl (+) 0 [1,2,3,4,5]
Python
reduce(lambda a,b: a+b, [1,2,3,4,5], 0)
显然,这是一个微不足道的例子来说明一个观点。在Python语言中,您只需编写sum([1,2,3,4,5]),甚至连Haskell纯化论者通常也更喜欢使用sum [1,2,3,4,5]。
对于没有明显方便函数的重要场景,惯用的pythonic方法是显式地写出For循环,并使用可变变量赋值,而不是使用reduce或fold。
这根本不是函数式风格,但这是"pythonic“方式。Python不是为函数纯粹主义者设计的。了解Python如何偏爱流控制的异常,了解python的非功能性习语。
发布于 2019-04-28 21:00:58
从Python 3.8开始,引入了assignment expressions (PEP 572) (:=运算符),它提供了命名表达式结果的可能性,我们可以使用列表理解来复制其他语言所称的折叠/折叠向左/缩减操作:
给定一个列表、一个缩减函数和一个累加器:
items = [1, 2, 3, 4, 5]
f = lambda acc, x: acc * x
accumulator = 1我们可以使用f折叠items,以获得结果accumulation
[accumulator := f(accumulator, x) for x in items]
# accumulator = 120或者以一种压缩形式:
acc = 1; [acc := acc * x for x in [1, 2, 3, 4, 5]]
# acc = 120请注意,这实际上也是一个"scanleft“操作,因为列表理解的结果代表了每个步骤的累积状态:
acc = 1
scanned = [acc := acc * x for x in [1, 2, 3, 4, 5]]
# scanned = [1, 2, 6, 24, 120]
# acc = 120https://stackoverflow.com/questions/10366374
复制相似问题