python基础知识——函数(下)
python基础知识——函数(下)
1. 高阶函数
*变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
# 接收函数作为参数,或者将别的函数作为返回值返回的函数就是高阶函数
def fun_1(i):
if i%2 == 0:
return True
def fun(n):
list_1 = []
for i in range(101):
if n(i):
list_1.append(i)
return list_1
print(fun(fun_1))
- 匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。 - lambda语法的定义如下:
lambda [arg1 [,arg2, … argN]] : expression
# 1.防止重名
# 2.不用再去定义函数,使用方便
# 3.可以作为一个传参的工具
#lambda 函数就是匿名函数
list_1 = [1,2,3,4,5,6,7,8]
#语法: lambda 参数:表达式
print((lambda a,b:a+b)(1,2))
#filter()有两个参数,第一个是过滤规则,第二个是过滤的数据
s = (lambda a:a % 2 == 0)
print(list(filter(s,list_1)))
2. 闭包
- 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。
# 行成闭包的条件(三点缺一不可)
# • 函数嵌套
# • 将内部函数作为返回值返回
# • 内部函数必须要使用到外部函数的变量
#定义一个外部函数
def fun(num):
#定义一个内部函数
def fun_1(n):
res = num + n
# print(res)
return res
return fun_1
# 函数的调用等于函数的返回值
f = fun(1) #fun(1) = fun_1 = f
#内部函数的调用
print(f(2)) #fun(1)(2) = fun_1(2) = f(2)
print(f(3))
- 闭包的好处
#• 通过闭包可以创建一些只有当前函数能访问的变量
#• 可以将一些私有数据藏到闭包中
#保证被内部使用的外部变量不被销毁
#定义一个外部函数
def fun(num):
#定义一个内部函数
def fun_1(n):
# global num 无意义
nonlocal num #使num为局部变量
num = 10
res = num + n
# print(res)
return res
# print(num)
fun_1(1)
# print(num)
return fun_1
# 函数的调用等于函数的返回值
f = fun(1) #fun(1) = fun_1 = f
3. 装饰器
- 在编程时,为了实现同样的功能,需要更改代码来实现。如果大量的修改代码,不仅增加了工作量,还不方便后期维护,更加不符合ocp规则(o:open 开放对代码的拓展,c :close 关闭对代码的修改),装饰器就是为了解决这写问题被引入的。
def fun(a,b)
print('函数开始')
print('函数结束')
return a+b
def fun1(a,b):
return a*b
'''
如果fun函数要实现fun1函数同样的输出效果,可以直接复制print进行粘贴就行,\
但是这样就出现了代码的冗余、增加工作量等情况,那是否有办法不用复制就直接那过来用呢?
'''
#例子一:
def fun(fn):
print('函数开始')
fn()
print('函数结束')
def fun1():
print('函数运行')
fun(fun1)
#例子二
def fun(fn,a,b):
print('函数开始')
res = fn(a,b)
print(res)
print('函数结束')
def add(a,b):
return a+b
fun(add,1,2)
#例子三
'''
但是这样还是不行,因为每次还得修改参数,可以使用不定长参数进行传参
'''
def fun(fn,*args):
print('函数开始')
res = fn(*args)
print(res)
print('函数结束')
def add(a,b):
return a+b
fun(add,1,2)
4. 装饰器的使用
- 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能的
#装饰器是一个特殊的闭包函数
#装饰器
def ch(fn): #定义外层函数
def new_ch(*args,**kwargs): #定义一个内层函数,使用不定长参数进行传参
print('函数开始')
fn(*args,**kwargs) #调用内层函数
print('函数结束')
return new_ch #返回内层函数名
@ch #@ch=ch(fun),装饰器的语法糖写法 ,必须紧贴需要用到装饰器的函数,即@ch必须在def fun():这个函数前
#函数
def fun(): #定义一个函数
print('我是fun函数')
#return '我是fun函数'
#函数调用方法一:通过装饰器的语法糖写法
fun()
#函数调用方法二:
# r = ch(fun) #此处是将函数名fun作为实参传递给fn,即fn = fun ,ch(fn) = new_ch = ch(fun) ,\
# # 内层函数调用ch(fn)() = new_ch() = ch(fun)()
# r()
# 总结 本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。
仅是个人意见,如有不足之处或者侵权,请留言