WEB开发网
开发学院软件开发Python 可爱的 Python: 在 Python 中进行函数编程,第 3 ... 阅读

可爱的 Python: 在 Python 中进行函数编程,第 3 部分

 2008-11-13 13:19:33 来源:WEB开发网   
核心提示: 清单 11:连续的函数调用(用相同的参数)>>> def a(x):... print x,... return "a"...>>> def b(x):... print x*2,... return "b"...

清单 11:连续的函数调用(用相同的参数)

>>> def a(x):
... print x,
... return "a"
...
>>> def b(x):
... print x*2,
... return "b"
...
>>> def c(x):
... print x*3,
... return "c"
...
>>> r = also(a,b,c)
>>> r
<functional.sequential instance at 0xb86ac>
>>> r(5)
5 10 15
'a'
>>> sequential([a,b,c],main=c)('x')
x xx xxx
'c'

在创建新功能(这些功能将参数应用于几个组件函数)方面,函数 disjoin() 和 conjoin() 与 sequential() 和 also() 相似。但是 disjoin() 询问是不是 任何组成函数都返回真(给定了参数),而且 conjoin() 询问是不是 所有的组件函数都返回真。在可能的地方应用逻辑快捷键,那么 disjoin() 可能就不会发生某些方面的影响。 joinfuncs() 与 also() 类似,它返回一个组件返回值的元组而不是选择一个主要返回值。

先前的函数让您访问具有相同参数的多个函数, any() 、 all() 和 none_of() 让您根据参数列表调用相同的函数。在通常的结构中,它们有一点象内建的 map() 、 reduce() 、 filter() 函数。但是这些来自于 functional 的特殊高阶函数询问的是关于返回值集合的布尔问题。例如:

清单 12:询问返回值集合

>>> from functional import *
>>> isEven = lambda n: (n%2 == 0)
>>> any([1,3,5,8], isEven)
1
>>> any([1,3,5,7], isEven)
0
>>> none_of([1,3,5,7], isEven)
1
>>> all([2,4,6,8], isEven)
1
>>> all([2,4,6,7], isEven)
0

对于那些有一点数学背景人来说,特别有意思的高阶函数是 compose() 。一些函数的组合是一个函数返回值的“联合链”,并输入下一个函数。编写这些函数的程序员应该负责确保输出和输入相匹配,但是这样的话,任何时候程序员都使用一个返回值。一个简单的示例就会让您明白:

清单 13: 创建组合函数

>>> def minus7(n): return n-7
...
>>> def times3(n): return n*3
...
>>> minus7(10)
3
>>> minustimes = compose(times3,minus7)
>>> minustimes(10)
9
>>> times3(minus7(10))
9
>>> timesminus = compose(minus7,times3)
>>> timesminus(10)
23
>>> minus7(times3(10))
23

直到下一次

我希望对高阶函数的最新研究能够唤起读者在一定的思考方式上的兴趣。请尽一切办法使用它。试着创建一些自己的高阶函数;有些可能是非常有用和非常强大的。请让我知道它是如何运行的;可能这个特别系列的后面部分将会讨论读者们继续提供的新奇的、迷人的方法。

上一页  2 3 4 5 6 7 

Tags:可爱 Python Python

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接