可爱的 Python: 在 Python 中进行函数编程,第 3 部分
2008-11-13 13:19:33 来源:WEB开发网通过 第 2 部分(这次使用 curry() )中的税收计算程序的示例,可以进一步地和闭包进行比较:
清单 10:Python Curry 过的税收计算
from
functional
import
*
taxcalc =
lambda
income,rate,deduct: (income-(deduct))*rate
taxCurry = curry(taxcalc)
taxCurry = taxCurry(50000)
taxCurry = taxCurry(0.30)
taxCurry = taxCurry(10000)
print
"Curried taxes due =",taxCurry
print
"Curried expression taxes due =",
curry(taxcalc)(50000)(0.30)(10000)
不像闭包,我们需要用一个特定的顺序(从左向右)来排列参数。但是要注意到 functional 也包含一个开始于另一端(从右向左)的 curry() 类。
在同一级别示例的第二个 print 声明与直接调用普通的 taxcalc(50000,0.30,10000) 仅在拼写上做了少许的改变。然而,在不同的级别上,它使得每一个函数可以只有一个参数的函数这一概念更加清楚 -- 刚一接触这种思想的人可能会感到很惊讶。
混合高阶函数
在 curring 的“基本”操作之外, functional 提供了一个有趣的高阶函数的掠夺包。而且,写自己的高阶函数(带或者不带 functional ) 的确不难。至少带有 functional 的高阶函数会提供一些很好的主意。
对于大部分人来说,高阶函数感觉起来就像是标准的 map() 、 filter() 和 reduce() 的“增强”版本。通常,这些函数的模式是概略地“把一个或多个函数和一些列表作为参数,然后应用这些函数列出参数。”关于这个题目有数量惊人的有趣和有用的方法。另一个模式是“获取函数集合,并创建一个合并这些函数功能的函数。”再次,可能有众多的变化,让我们看一下 functional 提供的东西。函数 sequential() 和 also() 都能够创建一个基于组件函数序列的函数。组件函数可以用相同的参数来调用。两者主要的不同之处在于 sequential() 期望一个单一列表作为参数,而 also() 使用一列参数。在多数情况下,这些对于函数方面的影响是很有用的,但是 sequential() 随意地让您挑选哪个函数提供组合返回值:
更多精彩
赞助商链接