在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的非功能性习语。
发布于 2017-04-27 23:20:37
在Python3中,删除了reduce
:Release notes。不过,您可以使用functools module
import operator, functools
def product(xs):
return functools.reduce(operator.mul, xs, 1)
另一方面,文档表达了对for
-loop而不是reduce
的偏好,因此:
def product(xs):
result = 1
for i in xs:
result *= i
return result
https://stackoverflow.com/questions/10366374
复制相似问题