本文实例讲述了Python函数式编程。分享给大家供大家参考,具体如下:
<强>函数式编程>强就是一种抽象程度很高的编程范式,从计算机硬件→汇编语言→C语言→Python抽象程度越高,越贴近于计算,但执行效率也越低。纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有<强>副作用>强。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持,支持高阶函数(函数可以作为变量传入),支持闭包(返回一个函数),有限地支持匿名函数。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
1,高阶函数
即可以通过变量名指向函数,函数通过变量名作为参数传给另一个函数,并通过变量名来使用,例如下面将开方函数math.sqrt作为参数传递给变量f,变量名f就指向了函数math.sqrt,再通过变量f使用该函数给x, y开方。
导入数学 def添加(x, y, f): 返回f (x) + f (y) #函数作为参数传递给f来调用 math.sqrt res=添加(25日9日) 打印(res) >之前映射函数接收一个函数f和一个列表,并把函数f依次作用在列表的每个元素上,得到一个迭代器并返回。
def format_name (s): 返回s [0] .upper () + s [1:] .lower() #将列表的每个元素首字母大写,其他小写 print(列表(地图(format_name[“亚当”,“丽莎”,“巴特”)))) #输出:(“亚当”,“丽莎”,“巴特”) >之前过滤器()根据判断函数f的结果自动过滤掉不符合条件的元素,以迭代器返回剩下的元素
def is_odd (x): 返回x % 2==1 #过滤函数,x为奇返回现实 f_res=过滤器(is_odd, (1, 4, 6、7、9、12、17)) 打印(列表(f_res)) #输出过滤后的结果列表:1 7 9 17 >之前排序()函数用于对可迭代的对象进行排序,参数键=指定排序的关键字,这里可以借助functools.cmp_to_keys()将比较方法映射为自定义的方法,例如实现了降序排列,比较函数cmp返回值1代表一个应该排在b的前面,如果一排在b的后面返回1。如果a, b相等返回0。
进口functools def cmp (a, b): 如果b & lt;答: 返回1 如果一个& lt;b: 返回1 返回0 一个=(1、2、5、4) 打印(排序(一键=functools.cmp_to_key (cmp))) >之前2,匿名函数和闭包
有时函数简单到只有一个表达式时,为了简化代码可以使用<强>匿名函数强>来代替,匿名函数一般形式为λ参数:返回表达式,例如λx: x * x,就是传入x参数并返回x的平方。例如在使用地图()函数时需要传入一个函数用于列表的元素,此时可以使用匿名函数作为参数
lst=[1, 2, 3, 4, 5, 6, 7, 8, 9) res=地图(λx: x * x, lst) #将匿名函数作用于lst print(列表(res)) >之前<强>函数的闭包(Closure) 强>是指内层函数引用了外层函数的变量,然后将内层函数像变量一样返回的情况,例如函数calc_prod()接收一个列表,在其内部定义一个函数相乘,计算列表元素的乘积并将乘返回。用f接收calc_prod()的返回函数,并在之后调用该函数
def calc_prod (lst): def乘以(): res=1 因为我在lst: res=res *我 返回res 返回用#将函数返回 f=calc_prod([1、2、3、4]) #接收返回函数 打印(f()) #调用返回函数 >之前注意在函数闭包时要确保引用的局部变量在函数返回后不能变,例如下面的例子,当数()函数返回3个函数时,由于f1, f2, f3并没有被调用,所以并未计算我*。当f1被调用时,这3个函数所引用的变量我的值已经变成了3,所以此时使用的变量我的值已经发生了改变,三个函数的输出都是9 .
def count (): fs=[] 我的范围(1、4): def f (): 打印(i) #函数f1()调用时我已经变为3 返回我* fs.append (f) 返回fs f1, f2, f3=count () 打印(f1()) #输出9而不是1Python函数式编程实例详解