Python 函数式编程

📅 2026/8/18 10:48:30
Python 函数式编程
Python 函数式编程函数式编程高阶函数系统高阶函数-mapreduce 归并filter 过滤函数sorted 排序函数return 返回函数闭包(closure)装饰器Decrator偏函数函数式编程高阶函数高阶函数把函数作为参数使用的函数# 函数式编程# 高阶函数把函数作为参数使用的函数a100ba# 函数名称就是一个变量deffunA():print(In funA)# 变量赋值funBfunA#调用函数funB()# In funA高阶函数举例# funA 是普通函数deffunA(n):returnn*100deffunB(n):returnfunA(n)*3print(funB(9))# 2700#高阶函数deffunC(n,f):returnf(n)*3print(funC(9,funA))# 2700#比较funC和funB显然funC写法要优于funB#funD 普通函数deffunD(n):returnn*10print(funC(7,funD))# 210系统高阶函数-mapmap(函数, 集合或列表)# 映射把集合或者列表的元素每一个元素按照一定规则进行操作生成新的列表或集合# map 函数是系统提供的具有映射功能的函数返回值是一个迭代对象l1[iforiinrange(10)]print(l1)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]l2[]foriinl1:l2.append(i*10)print(l2)# [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]#利用map实现defmulTen(n):returnn*10l3map(mulTen,l1)#map类型是一个可迭代的结构所以可以使用for遍历foriinl3:print(i,end )# 0 10 20 30 40 50 60 70 80 90# end 指定每次打印输出后的结尾字符为空格而不是默认的换行符print(l3)# 对象map object at 0x7faf844da550#以下列表生成得到的结果为空因为Python返回迭代器需要返回列表如listl4[iforiinl3]print(l4)# []reduce 归并reduce(函数可迭代对象)# reduce 归并缩减# 把一个可迭代对象最后归并成一个结果fromfunctoolsimportreduce#定义一个操作函数#加入操作函数只是相加defmyAdd(x,y):returnxy rstreduce(myAdd,[1,2,3,4,5,6])print(rst)# 21filter 过滤函数filter(函数可迭代对象)# 偶数组成新的列表defisEven(a):returna%20l[3,4,56,3,2,3,4556,67,4,4,3,23455,43]rstfilter(isEven,l)# 返回的filter内容是一个可迭代对象print(type(rst))# class filterprint(rst)# filter object at 0x7faf7663bf10print([iforiinrst])# [4, 56, 2, 4556, 4, 4]sorted 排序函数sorted(序列对象)sorted(序列对象, key算法, reverseTrue) 倒序# sorted 函数# 把序列按照给定算法进行排序# key: 在排序前对每一个元素进行key函数运算按照key函数定义的逻辑进行排序a[234,22312,123,45,43,2,3,66723,34]a1sorted(a,reverseTrue)print(a1)# [66723, 22312, 234, 123, 45, 43, 34, 3, 2]a2sorted(a)print(a2)# [2, 3, 34, 43, 45, 123, 234, 22312, 66723]# abs 绝对值倒序a3[-43,23,45,6,-23,2,-4345]a4sorted(a3,keyabs,reverseTrue)print(a4)# [-4345, 45, -43, 23, -23, 6, 2]return 返回函数# 返回函数# 函数的 return 不是必须的# 函数可以返回具体的值# 也可以返回一个函数作为结果defmyF(a):print(In myF)returnNoneamyF(8)print(a) In myF None # args参数列表# myF4 定义函数返回内部定义的函数myF5# myF5 使用了外部变量这个变量是myF4的参数defmyF4(*args):defmyF5():rst0forninargs:rstnreturnrstreturnmyF5 f5myF4(1,2,3,4,5,6,7,8,9,0)f5()# 45闭包(closure)当一个函数在内部定义函数并且内部的函数应用外部函数的参数或者局部变量当内部函数被当做返回值时相关参数和变量保存在返回的函数中这种结果叫做闭包。# 闭包常见坑defcount():fs[]foriinrange(1,4):deff():returni*i fs.append(f)returnfs f1,f2,f3count()print(f1())# 9print(f2())# 9print(f3())# 9#返回函数引用变量i,i并非立即执行等到三个函数都返回的时候才统一使用此时i已经变成3# 返回闭包时返回函数不能引用任何循环变量# 解决方案再创建一个函数用函数的参数绑定循环变量的当前值无论循环变量以后如何改变已经绑定的函数参数值不再改变defcount2():deff(j):defg():returnj*jreturng fs[]foriinrange(1,4):fs.append(f(i))returnfs f1,f2,f3count2()print(f1())# 1print(f2())# 4print(f3())# 9装饰器Decrator在不改动函数代码的基础上无限制扩展函数功能的一种机制 装饰器 是一个返回函数的高阶函数 作用使用语法即在每次要扩展到函数定义前使用函数名 好处一旦定义则可以装饰任意函数 一旦被其装饰则把装饰器的功能直接添加到定义函数的功能上# 装饰器# 使用 语法函数名# 对hello函数进行功能扩展每次执行hello完打印当前格林尼治时间importtime# 高阶函数以函数作为参数defprintTime(f):defwrapper(*args,**kwargs):print(Time:,time.ctime())returnf(*args,**kwargs)returnwrapper# 上面定义了装饰器使用时要使用#装饰器先执行再执行函数printTimedefhello():print(Hello world)hello()# Time: Sun Aug 16 15:44:53 2026# Hello worlddefhello3():print(我是手动执行的)hello3()hello3printTime(hello3)hello3()fprintTime(hello3)f()# 我是手动执行的# Time: Sun Aug 16 15:51:56 2026# 我是手动执行的# Time: Sun Aug 16 15:51:56 2026# Time: Sun Aug 16 15:51:56 2026# 我是手动执行的偏函数参数固定的函数相当于有特定参数的函数体 需要使用 funtools.partial 模块 作用把函数的某些参数固定返回新的函数importfunctools# functools.partial 作用把一个函数的某些函数固定返回一个新函数int16afunctools.partial(int,base16)bint16a(a)print(b)# 10b1int16a(12345)print(b1)# 74565# 函数默认输入的字符串是16进制数字# 将字符串返回十进制数字defint16(x,base16):returnint(x,base)int16(12345)#74565