函数基础:
#将函数赋值给变量
def hello():
print('hello')
Hi = hello
Hi()
#将函数作为参数传递
def add(a,b):
return a + b
def subtract(a,b):
return a - b
def action(x,y,function):
return function(x,y)
action(5,3,add)
action(5,3,subtract)
#函数嵌套
def greeting():
def welcome():
return 'Welcome'
return welcome() #返回函数welcome的执行结果
greeting()
#函数跨域访问
def fun1():
x = 10
def fun2():
nonlocal x #定义不是本地x,而是使用fun2外层fun1内的x
return x + 10
return fun2()
fun1()
装饰器的定义方式:
函数定义装饰器(函数定义装饰器既可以用在脚本里包含的普通函数上,也可以用在一个类包含的方法上)
#函数定义装饰器
def p_decorator(func):#定义一个装饰器函数,参数是需要需要装饰的函数
def wapper(*args, **kwargs):#任何函数的任何类型的参数都可以通过*args, **kwargs来表示。因为,*args可以理解为所有元组传递进来的单个参数,就是一些没有名字按照位置传递的的数据,**kwargs可以理解为带有名字的数据
return '<P>' + func(*args, **kwargs) + '</P>'#保留需要修饰的函数的原始功能,增加装饰效果
return wapper#返回函数的对象而不是结果,意味着返回的东西并没有被执行
@p_decorator#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
return '欢迎学习'
@p_decorator
def get_upper_text(text):#对带参数的函数进行装饰
return text.upper()
class Student:
def __init__(self,name):
self.name = name
@p_decorator#对一个类中的函数进行装饰
def get_upper_name(self):
return self.name.upper()
if __name__ == '__main__':
print(get_text())
print(get_upper_text('hello'))
s = Student('tom')
print(s.get_upper_name())
程序运行结果如图,函数定义装饰器既可以用在脚本里包含的普通函数上,也可以用在一个类包含的方法上。
类定义装饰器(类定义的装饰器可以用在脚本里包含的普通函数上,当用在另外一个类包含的方法上时会因为两个类的self冲突而出现错误)
#类定义装饰器
class P:#通过创建类来创建装饰器
def __init__(self,func):#构造函数
self.func = func
def __call__(self, *args, **kwargs):#调用函数
return '<P>' + self.func(*args, **kwargs) + '</P>'#定义如何装饰传递进来的函数
@P#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
return '欢迎学习'
@P
def get_upper_text(text):#对带参数的函数进行装饰
return text.upper()
class Student:
def __init__(self,name):
self.name = name
#@p_decorator#对一个类中的函数进行装饰
def get_upper_name(self):
return self.name.upper()
if __name__ == '__main__':
print(get_text)
print(get_upper_text('hello'))
s = Student('tom')
print(s.get_upper_name())
程序(未对另一个类中的函数进行装饰)运行结果如图,类定义的装饰器可以用在脚本里包含的普通函数上。
程序(对另一个类中的函数进行装饰)运行结果如图,出现错误,当用在另外一个类包含的方法上时会因为两个类的self冲突而出现错误。
参数化装饰器,对装饰器外侧在进行一次封装来接受参数,不影响装饰器原本功能。
#参数化装饰器
def tags(tag):#参数化装饰器实现原理:对装饰器外侧在进行一次封装来接受参数
def tag_decorator(func):#定义一个装饰器函数,参数是需要需要装饰的函数
def wapper(*args, **kwargs):#任何函数的任何类型的参数都可以通过*args, **kwargs来表示。因为,*args可以理解为所有元组传递进来的单个参数,就是一些没有名字按照位置传递的的数据,**kwargs可以理解为带有名字的数据
return f'<{tag}>{func(*args, **kwargs)}</{tag}>'#保留需要修饰的函数的原始功能,增加装饰效果
return wapper#返回函数的对象而不是结果,意味着返回的东西并没有被执行
return tag_decorator
@tags('p')#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
return '欢迎学习'
@tags('div')#可以通过改变参数,来改变装饰器装饰效果
def get_upper_text(text):#对带参数的函数进行装饰
return text.upper()
class Student:
def __init__(self,name):
self.name = name
@tags('div')#对一个类中的函数进行装饰
@tags('p')#可以多次装饰,靠近函数的为装饰器为内侧装饰效果
def get_upper_name(self):
return self.name.upper()
if __name__ == '__main__':
print(get_text())
print(get_upper_text('hello'))
s = Student('tom')
print(s.get_upper_name())
程序运行结果如图所示,实现参数化装饰器功能。