在学习python函数的过程中,函数的高阶应用包括闭包lambda函数,过滤器等都让我头痛不已.接下来我把课堂中听到的笔记进行整理,再写一遍,希望在提醒自己的同时也能帮助到别人.
首先,我们来看一下什么是闭包,闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
废话不多说,我们上栗子:
def f1(): def line(x): return 2*x+1 return line myline=f1() print myline(5) 11
在上面f1()的返回结果返回给myline对象,输出11
如果在line()中引入了外部的变量,情况会怎么样呢
def f1(): b=10 def line(x): return 2*x+b return line b=5 myline=f1() print myline(5) 20
我们可以看到,line定义的隶属程序块中引用了高层级的变量b,但b信息存在于line的定义之外。我们称b为line的环境变量。事实上,line作为f1的返回值时,line中已经包括b的取值(尽管b并不隶属于line)。
上面的代码将打印20,也就是说,line所参照的b值是函数对象定义时可供参考的b值,而不是使用时的b值。
接下来是匿名函数lambda,lambda用途是指定短小的回调函数.lambda将返回一个函数而不是将函数赋值给参数
lambda arg:expression
lambda x,y:x+y f2=lambda x,y:x+y f2(3,4) 7
翻译成普通函数就是
def f2(x,y) return x+y a=f2() a(3,4)
lambda也支持使用默认参数
f=lambda x,y,z=10 :x+y+z f(4,5) 19
l3=[(lambda x:x*2),(lambda y :y*3)] for i in l3: print i(4) 8 12
接下来是3个python内置函数 filter(),map(),reduce()
filter()用来过滤,filter的语法是
filter(func,seq)
函数接收一个函数和一个序列,把函数一次用于序列的每个元素,如果为True则保留
l1=[1,2,3,4,42,60] def f1(x): if x>20: return True else: return False filter(f1,l1) [42, 60]
map()和filter()一样,也接收了一个函数和一个序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
l1=[1,2,3,4,42,60] map(lambda x:x*2,l1) [2, 4, 6, 8, 84, 120]
map中可以跟多个list,
def abc(x,y): return x*100+y list1=[11,22,33] list2=[44,55,66] map(abc,list1,list2) [1144, 2255, 3366]
reduce()迭代器
reduce(func,seq[,init])
对sequence中的item顺序迭代调用function,如果有init,还可以作为初始值调用,例如可以用来对List求和:
def add(x,y): return x+y reduce(add,range(1,11),10) 65
完成从1加到11,最后加上初始值10,最后是65
接下来完成以下马哥在视频中的几个练习
返回/etc/passwd中包含了/bin/bash字串的所有用户名
f1=open('/etc/passwd') b=filter(lambda i:'/etc/passwd' in i,f1.readlines()) re.search('(\w*):',str(b)).groups(0)
将/etc/passwd中的每一行都分隔为一个列表
f1=open('/etc/passwd') f1.readline()
用折叠的方式求阶乘
l1=[1,2,3,4] reduce(lambda x,y:x*y,l1)
原创文章,作者:海马,如若转载,请注明出处:http://www.178linux.com/10094
评论列表(1条)
非常不错。赞