首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

函数编程之高阶函数漫话(Higher order functions)

2012-11-08 
函数编程之高阶函数漫谈(Higher order functions)IronPython和Python一样都支持多种编程范式(OOP,FP...)。

函数编程之高阶函数漫谈(Higher order functions)
IronPython和Python一样都支持多种编程范式(OOP,FP...)。本文讲述当用IronPython进行函数编程时,用到的几个基本元素:内置高阶函数(操作函数的函数:一个函数可以接受另一个函数作为参数,也可以把一个函数作为结果来返回)。这几个函数的共同点是第一个参数都是函数,并且都是对列表数据进行操作,代码简洁明了。

filter(function, iterable)
filter函数有两个参数:函数,列表(可以是一个支持迭代操作的容器或者是迭代器),并且返回一个列表。其中第一个参数函数必须是单参数的函数。filter函数返回第二个参数iterable中那些使第一个参数函数返回True值的元素。

注意:如果iterable是字符串或者元组则返回值依然是字符串或者元组,其他情况总是返回一个列表。若function是None,则默认为恒等函数,这样将去除所有取值为false的元素(包括0和None)。当function不为None时:filter(function,iterable)相当于[item for item in iterable if function(item)];当function为None时:filter(function,iterable)相当于[item for item in iterable if item]

函数编程之高阶函数漫话(Higher order functions)return n%2 #非0则为正
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)
函数编程之高阶函数漫话(Higher order functions)>>> li=[1,2,3,5,9,10,256,-3]
函数编程之高阶函数漫话(Higher order functions)>>> filter(odd, li)
函数编程之高阶函数漫话(Higher order functions)[1, 3, 5, 9, -3]
函数编程之高阶函数漫话(Higher order functions)>>> [e for e in li if odd(e)] #等价表达式
函数编程之高阶函数漫话(Higher order functions)[1, 3, 5, 9, -3]
函数编程之高阶函数漫话(Higher order functions)>>> filteredList=[]
函数编程之高阶函数漫话(Higher order functions)>>> for n in li:
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)if odd(n):
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions) filteredList.append(n)
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)
函数编程之高阶函数漫话(Higher order functions)>>> filteredList
函数编程之高阶函数漫话(Higher order functions)[1, 3, 5, 9, -3]
函数编程之高阶函数漫话(Higher order functions)>>>我们可以看到filter函数是怎么运行的,而且通过与另两种完成同样功能的代码对比可以发现,当根据某个规则从一个列表里选出目标元素时用filter函数是如此的简洁明了。

map(function, iterable, ...)

map函数原理和filter函数很相似。它对列表(iterable)里面的每个元素调用function函数,并返回一个由function函数结果所组成的列表。如果传入多个iterable参数,function函数必须去取得这些参数(即function函数的参数个数和iterable个数相同)并且作用于所有iterable参数里的每一项。如果其中一个iterable比其他的iterable短,则用None去扩充。

注意:如果参数function是一个lambda表达式,则表达式中不能使用print输出。

>>> def double(n):
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)return n*2
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)
函数编程之高阶函数漫话(Higher order functions)>>> li=[1,2,3,5,9,10,256,-3]
函数编程之高阶函数漫话(Higher order functions)>>> map(double, li)
函数编程之高阶函数漫话(Higher order functions)[2, 4, 6, 10, 18, 20, 512, -6]
函数编程之高阶函数漫话(Higher order functions)>>> [double(n) for n in li]
函数编程之高阶函数漫话(Higher order functions)[2, 4, 6, 10, 18, 20, 512, -6]
函数编程之高阶函数漫话(Higher order functions)>>> newlist=[]
函数编程之高阶函数漫话(Higher order functions)>>> for n in li:
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions) newlist.append(double(n))
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)
函数编程之高阶函数漫话(Higher order functions)>>> newlist
函数编程之高阶函数漫话(Higher order functions)[2, 4, 6, 10, 18, 20, 512, -6]
函数编程之高阶函数漫话(Higher order functions)>>> wek=['mon','tues','wed','thurs','fri','sat','sun']
函数编程之高阶函数漫话(Higher order functions)>>> work=['worked']*5
函数编程之高阶函数漫话(Higher order functions)>>> work
函数编程之高阶函数漫话(Higher order functions)['worked', 'worked', 'worked', 'worked', 'worked']
函数编程之高阶函数漫话(Higher order functions)>>> def wekStatus(day,sta):
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)return day+' '+sta
函数编程之高阶函数漫话(Higher order functions)函数编程之高阶函数漫话(Higher order functions)
函数编程之高阶函数漫话(Higher order functions)>>> map(wekStatus, wek, work)
函数编程之高阶函数漫话(Higher order functions)['mon worked', 'tues worked', 'wed worked', 'thurs worked', 'fri worked', 'sat ', 'sun ']
函数编程之高阶函数漫话(Higher order functions)>>>

?

reduce(function, iterable[, initializer])

reduce函数先获得序列中前两项,并把它传递给参数function函数(这个function必须具有两个参数),获得结果后再按序取得序列中的下一项,连同结果再传递给函数,以此类推,直到处理完所有元素返回一个单一值。例如:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 相当于计算((((1+2)+3)+4)+5)。 x是function函数的累积值,y是iterable中新取出来的值。 如果有可选参数initializer,它将在进行计算前置于iterable前端。

注意:如果没有可选参数initializer时:1,iterable仅包含一个元素时,将返回此元素的值;2,iterable为空,则将抛出一个TypeError异常。

>>> import operator
函数编程之高阶函数漫话(Higher order functions)>>> nums=[1,2,3,4,5,6,7,8,9]
函数编程之高阶函数漫话(Higher order functions)>>> reduce(operator.add, nums)
函数编程之高阶函数漫话(Higher order functions)45
函数编程之高阶函数漫话(Higher order functions)>>> reduce(operator.add, nums, 10)
函数编程之高阶函数漫话(Higher order functions)55
函数编程之高阶函数漫话(Higher order functions)>>> reduce(operator.add, [])
函数编程之高阶函数漫话(Higher order functions)Traceback (most recent call last):
函数编程之高阶函数漫话(Higher order functions) File "<stdin>", line 1, in <module>
函数编程之高阶函数漫话(Higher order functions)TypeError: reduce() of empty sequence with no initial value
函数编程之高阶函数漫话(Higher order functions)>>> reduce(operator.add, [1])
函数编程之高阶函数漫话(Higher order functions)1
函数编程之高阶函数漫话(Higher order functions)>>>Rise our ability!

热点排行