首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >函数式编程中的“折叠”函数的“pythonic”等价物是什么?

函数式编程中的“折叠”函数的“pythonic”等价物是什么?
EN

Stack Overflow用户
提问于 2012-04-29 02:30:49
回答 6查看 115.5K关注 0票数 146

在Haskell中,实现以下内容最常用的方法是什么:

代码语言:javascript
复制
foldl (+) 0 [1,2,3,4,5]
--> 15

或其在Ruby中的等价物:

代码语言:javascript
复制
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15

显然,Python提供了reduce函数,它是fold的一个实现,与上面完全一样,然而,有人告诉我编程的“pythonic”方法是避免lambda项和高阶函数,尽可能地更喜欢列表理解。因此,在Python语言中,有没有一种不是reduce函数的折叠列表或类似列表的结构的首选方法,或者reduce是实现这一目的的惯用方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-29 02:35:51

对数组求和的Pythonic方法是使用sum。出于其他目的,您有时可以使用reduce (来自functools模块)和operator模块的某种组合,例如:

代码语言:javascript
复制
def product(xs):
    return reduce(operator.mul, xs, 1)

请注意,在哈斯克尔术语中,reduce实际上是一个foldl。没有特殊的语法来执行折叠,也没有内置的foldr,实际上使用带有非关联操作符的reduce被认为是不好的风格。

使用高阶函数非常简单;它很好地利用了Python的原则,即一切都是对象,包括函数和类。您说得对,一些Pythonistas不喜欢lambdas,但主要是因为当它们变得复杂时,它们的可读性不是很好。

票数 142
EN

Stack Overflow用户

发布于 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循环,并使用可变变量赋值,而不是使用reducefold

这根本不是函数式风格,但这是"pythonic“方式。Python不是为函数纯粹主义者设计的。了解Python如何偏爱流控制的异常,了解python的非功能性习语。

票数 22
EN

Stack Overflow用户

发布于 2017-04-27 23:20:37

在Python3中,删除了reduceRelease notes。不过,您可以使用functools module

代码语言:javascript
复制
import operator, functools
def product(xs):
    return functools.reduce(operator.mul, xs, 1)

另一方面,文档表达了对for-loop而不是reduce的偏好,因此:

代码语言:javascript
复制
def product(xs):
    result = 1
    for i in xs:
        result *= i
    return result
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10366374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档