Python函数式编程实例详解

  

本文实例讲述了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而不是1      

Python函数式编程实例详解