函数式编程
- 在python中,函数是一等对象
- 一等对象一般都会具有如下特点:
- 对象是在运行时创建的
- 能赋值给变量或作为数据结构中的元素
- 能作为参数传递
- 能作为返回值返回
- 高阶函数
- 高阶函数至少要符合以下两个特点中的一个
- 接受一个或多个函数作为参数
- 将函数作为返回值返回
- 接受函数作为参数,或者将函数作为返回值得函数是高阶函数
#定义一个函数#可以将制定列表中的所有的偶数,保存到一个新的列表中返回def fn(list): new_list = [] for i in list: if i % 2 == 0: new_list.append(i) return new_list
- 高阶函数至少要符合以下两个特点中的一个
1.fulter()
fulter() 可以从序列中过滤出符合条件的元素,保存到一个新的序列中
参数:
- 函数,根据该函数来过滤序列(可迭代的结构)
- 需要过滤的序列(可迭代结构)
返回值
过滤后的新序列(可迭代结构)
2.lambda 函数表达式 匿名函数
lambda函数表达式专门来创建一些简单地函数,他是函数创建的又一种方式
语法:lambda 参数列表:返回值
匿名函数一般都是作为参数使用,其他部分一般不会使用
3.sort()
- 该方法用来对列表中的元素进行排序
- sort()方法默认是直接比较列表中的元素大小
- 在sort()可以接收一个关键字参数,key
- key需要一个函数作为参数,当谁知了函数作为参数
- 每次都会以列表中的一个元素作为参数来调用函数,并且使用函数的返回值来比较元素的大小
l = [2,3,4,1,6,5]l.sort()print(l)
4.sorted()
这个函数和sort()的用法基本一致,但是sorted()可以对任意的序列进行排序,并且使用sorted()排序不会影响原来的对象,而是返回一个新对象
5.闭包
将函数作为返回值返回,也是一种高阶函数,这种高阶函数我们也成为闭包,通过闭包可以创建一些只有当前函数能访问的变量,
作用:可以将一些私有的数据藏到闭包中
形成函数的要件
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须要使用到外部的变量
def fn(): a = 10 #函数内部在定义一个函数 def inner(): print(‘我是fn2‘,a) #将内部函数 innner作为返回值返回 return inner#r是一个函数,是调用fn()后返回的函数#这个函数是在fn()内部定义,并不是全局函数#所以这个函数总是能访问到fn()函数内的变量r = fn()? # 求多个数的平均值 # print(sum(sum)/len(sum))?def make_avg(): nums = []? def avg(n): nums.append(n) return sum(nums)/len(nums) return avgavg = make_avg()print(avg(10))print(avg(30))
6.装饰器
通过直接修改代码的方式来完成某个需求,会产生一下某些问题
- 如果要修改的函数过多,修改起来会比较麻烦
- 不方便后期维护
- 这样做会违反开闭原则(ocp)
开闭原则:程序的设计,要求开发对程序的扩展,要关闭对程序的修改
像begin_end()这种函数我们称它为装饰器
- 通过装饰器,可以再不修改原来函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数功能的‘
在定义函数时,可以通过@装饰器,来使用指定的装饰器,来装饰当前的函数。同时可以为一个函数指定多个装饰器,这样的函数将会安装从内到外的方式进行装饰
def begin_end(old): ‘‘‘ 用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束 参数: old 要扩展的函数对象 ‘‘‘#创建一个新函数 def new_function(*args,**kwargs): print(‘开始执行---‘) #调用被扩展的函数 result = old(*args,**kwargs) print(‘执行结束---‘) #返回执行的结果 return result? #返回新函数 return new_function@begin_end #越靠近def hello的再靠内def hello(): print(‘你好‘)hello()
原文地址:https://www.cnblogs.com/wn-888/p/11647170.html
时间: 2024-10-11 02:19:17