在 Haskell 中实现以下目标的最惯用方法是什么:
foldl (+) 0 [1,2,3,4,5]
--> 15
或者在 Ruby 中等效:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
显然,Python提供了reduce
函数,它是折叠的实现,与上面完全一样,但是,我被告知“pythonic”编程方式是避免lambda
术语和高阶函数,在可能的情况下更喜欢列表推导。因此,是否有一种折叠列表的首选方法,或者 Python 中类似列表的结构不是 reduce 函数,或者 reduce
是实现此目的的惯用方式?
哈斯克尔
< code>foldl ( ) 0 [1,2,3,4,5]
蟒蛇
< code>reduce(lambda a,b: a b,[1,2,3,4,5],0)
显然,这是说明一个观点的一个微不足道的例子。在Python中,你只需要做< code>sum([1,2,3,4,5]),甚至Haskell纯粹主义者通常更喜欢< code>sum [1,2,3,4,5]。
对于没有明显便利函数的重要场景,惯用的pythonic方法是显式写出For循环,并使用可变变量赋值,而不是使用< code>reduce或< code>fold。
这根本不是功能性的风格,而是“蟒蛇式”的风格。Python不是为功能纯粹主义者设计的。了解Python如何支持流控制的异常,以了解Python的非功能惯用用法。
从 Python 3.8
开始,引入赋值表达式 (PEP 572) (:=
运算符),它提供了命名表达式结果的可能性,我们可以使用列表推导来复制其他语言称为折叠/折叠左/减少操作:
给定一个列表、一个归约函数和一个累加器:
items = [1, 2, 3, 4, 5]
f = lambda acc, x: acc * x
accumulator = 1
我们可以用 f
折叠项目
以获得结果累积
:
[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 = 120
对数组求和的 Pythonic 方法是使用 sum
。对于其他目的,您有时可以使用reduce
(来自functools
模块)和运算符
模块的某种组合,例如:
def product(xs):
return reduce(operator.mul, xs, 1)
请注意,用Haskell的术语来说,< code>reduce实际上是一个< code>foldl。没有特殊的语法来执行折叠,没有内置的< code>foldr,实际上使用< code>reduce和非关联操作符被认为是不好的风格。
使用高阶函数是一种非常单调的行为;它很好地利用了Python的原理,即一切都是一个对象,包括函数和类。你说的没错,一些Pythonista不喜欢lambdas,但主要是因为当它们变得复杂时,它们往往不太可读。
问题内容: 在Haskell中,实现以下目标的最惯用的方法是: 或等效的Ruby: 显然,Python提供了与fold完全相同的功能,它是fold的一种实现,但是,有人告诉我,“ pythonic”编程方式是避免使用术语和高阶函数,而是尽可能使用列表理解。因此,有没有一种首选的方式来折叠列表或不是Python函数的类似列表的结构,或者是实现这一目标的惯用方式? 问题答案: 用Python方式对数组
Flod 是一个有趣的高阶函数-她把列表中的所有元素变成一个值。一个简单的高阶折叠能够用来给数值数组求和。 NSNumber * sum = [array rx_foldWithBlock:^ id (id memo , id each){ return @([memo integerValue] + [each integerValue]); }]; 输出的值为@6.数组中的每一个元素按
问题内容: 是否有与的函数等效的也就是说,给定多个相同长度的数组,将创建一个成对的数组。 例如,如果我有三个看起来像这样的数组: 输出数组应为: 问题答案: 这是一个时髦的Ecmascript 6版本: 相当于插图。到: (并且指出ES6具有可变参数语法,因此以下函数定义将类似于python,但请参见下文的免责声明…这将不是其自身的逆,因此)将不相等x;尽管正如Matt Kramer指出的那样例如
在Python中有没有我可以做的等价操作?
我试图在Rust中实现一些类似于类中的C虚拟函数的东西,我会有一个带有数据的基本结构,然后我会保留一些未定义的函数,如以下示例: 我试图用函数指针来实现它,但是没有成功。我可以在A的函数中使用trait,并在另一个类中实现A,但是我会丢失结构的数据。什么最好(最快?)Rust中实现这种东西的方式?
Python 提供了一个 functools 的模块,该模块为高阶函数提供支持,partial 就是其中的一个函数,该函数的形式如下: functools.partial(func[,*args][, **kwargs]) 这里先举个例子,看看它是怎么用的。 假设有如下函数: def multiply(x, y): return x * y 现在,我们想返回某个数的双倍,即: >>> mu
函数式编程 -> 函数响应式编程 现在大家已经了解我们是如何运用函数式编程来操作序列的。其实我们可以把这种操作序列的方式再升华一下。例如,你可以把一个按钮的点击事件看作是一个序列: // 假设用户在进入页面到离开页面期间,总共点击按钮 3 次 // 按钮点击序列 let taps: Array<Void> = [(), (), ()] // 每次点击后弹出提示框 taps.forEach {