一.函数式编程和高阶函数
概念与实例精讲:http://www.cnblogs.com/kym/archive/2011/03/07/1976519.html
高阶函数就是把函数作为参数
例:
def test(x,y,f): return f(x)+f(y)
调用的时候f传入一个函数abs,如:
test(-5,10,abs)#ads是取正数
执行过程:
abs(-5)+abs(10)
结果是:15
如果传入其他的函数如:平方根 math.sqrt
import math
test(4,16,math.sqrt)
执行结果: 2+4=6
map函数
map是python内置的一个高阶函数,它接受一个函数 f 和一个list,并通过把 f 依次作用在list上返回一个新的list。
1.有list=[1,2,3,4,5,6,7,8] 求list平方后的新list
先定义一个求平方的函数,传入map即可
def f(x): return x*x list=[1,2,3,4,5,6,7,8] print map(f,list)结果:[1, 4, 9, 16, 25, 36, 49, 64]
注意:map()函数不改变原有的list,而是返回一个新的list。list可以是任何数据类型,但要保证你传入的函数 f 可以处理这种数据类型。
2.把用户名处理成首字母大写的形式
['adam','LIsA','BarT']
def format(s): return s[0].upper()+s[1:].lower() list=['jAck','HELLOKITTY','PeteR'] print map(format,list)
结果:['Jack', 'Hellokitty', 'Peter']
reduce() 函数
reduce() 函数是python内置的一个高阶函数,reduce()函数接受的参数和map() 类似,一个函数 f ,一个list,但执行和map()不同,reduce() 传入的函数 f 必须接受两个参数,reduce() 对list的每个元素反复调用函数 f ,并返回最终结果值。
例:
def f(x,y): return x+y
调用
reduce(f,[1,3,5,7,9])
执行过程是:
计算头两个元素:f(1,3) ,结果:4
计算结果和下一个元素:f(4,5), 结果:9
计算结果和下一个元素:f(9,7),结果:16
计算结果和下一个元素:f(16,9),结果:25
计算结束 结果:25
reduce() 还可以接受第三个参数为可选参数:
reduce(f,[1,3,5,7,9],100)
此时的第一轮计算变为f(100,1)
最后的结果:125
3.利用reduce() 函数来求积,2*4*5*7*12
def f(x,y): return x*y list=[2,4,5,7,12] print reduce(f,list)
结果:3360
filter()函数:
filter() 函数是python内置的另一个高阶函数,接受一个函数 f,一个list,函数f的作用是对每一个元素进行判定,返回true/false,filter()根据判断结果自动过滤掉不符合的元素,返回由符合条件的元素组成的新list。
4.[1, 4, 6, 7, 9, 12, 17] 删除其中的偶数
def f(x): return x%2==1 list=[1, 4, 6, 7, 9, 12, 17] print filter(f,list)
结果:[1, 7, 9, 17]
5.删除None或者空字符串
def notEmpty(s): return s and len(s.strip())>0 list=['test', None, '', 'str', ' ', 'END'] print filter(notEmpty,list)
结果:['test', 'str', 'END']
6.过滤出1~100中的平方根是整数的数。
import math def f(x): return int(math.sqrt(x))*int(math.sqrt(x))==x list=range(1,101) print filter(f,list)
结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
sorted() 函数自定义排序函数
sorted([2,1,3,4,19,5]) 结果:[1,2,3,4,5,19]
自定义:如果x在y前面返回-1;在后面返回1;相等返回0;
倒序排列:
def f(x,y): if x>y: return -1 if x<y: return 1 return 0 list=[5,3,1,6,8,4] print sorted(list,f)
结果:[8, 6, 5, 4, 3, 1]
返回函数:
python函数不但可以返回int,str,list,dict等数据类型,还可以返回函数。
例:定义一个函数f(),我们让他返回一个函数g()
def f(): print 'f......' def g(): print 'g......' return g g1=f();#返回的g()赋值给g1 g1();#调用g1
结果:
>>>
f......
g......
6.编写一个函数,接受一个list,计算他们的乘积。
def calc_prod(lst): def lazy_prod(): def f(x, y): return x * y return reduce(f, lst, 1) return lazy_prod f = calc_prod([1, 2, 3, 4]) print f()
闭包:
在函数内部定义的函数和外部定义的函数一样的,只是他们无法被外部访问:
def calc_sum(lst): def lazy_sum(): return sum(lst) return lazy_sum
像这种内层函数引用了外层函数的参数,然后返回内层函数的情况,称之为闭包。
特点:返回的函数引用的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。
例如:我要返回三个函数,分别计算1*1,2*2,3*3
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() print f1() print f2() print f3()
结果是:9,9,9
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:因为f1现在才计算i*i,但现在i的值已经变为3
因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。
正确示例:
def count(): fs=[] for i in range(1,4): def f(j): def g(): return j*j return g r=f(i) fs.append(r) return fs f1,f2,f3=count() print f1(),f2(),f3()
匿名函数:
高阶函数可以接受函数做参数,有些时候,我们不需要显示的定义函数,直接传入函数耿方便,在Pytho中对匿名函数提供了有限的支持,还是以map()函数为例,计算f(x)=x*x,除了定义f(x)的方式外,还可以用匿名函数,匿名函数用lambda关键字。lambda表示匿名函数,冒号前面的是参数,多个参数用逗号分开。
平方:
map(lambda x:x*x,[1,2,3,4,5,6,78,9]) [1,4,9,16,25,49,64,81]
排序:
print sorted([1,3,9,5,0],lambda x,y:-cmp(x,y)) [9, 5, 3, 1, 0]
返回匿名函数:
>>> myabs = lambda x: -x if x < 0 else x >>> myabs(-1) 1 >>> myabs(1) 1