目录

  • 闭包
  • 例子
  • 同级闭包
  • 装饰器引入
  • 装饰器使用
  • 无参例子
  • 有参例子
  • 可变参数例子
  • 带关键字参数的装饰器
  • 双层装饰器
  • 装饰器带参数
  • 装饰器的应用

闭包

def func():a=100def inner_func():b=99print(a,b)return a# print(a)
# inner_func()x=func()#100  并没有调用到inner_func()
print(x)#闭包
#在函数中提出得概念
def func2():a=100def inner_func():b=99print(a,b)return inner_func #注意不要加上括号# print(a)
# inner_func()x=func2()#100  并没有调用到inner_func()
print(x)#<function func2.<locals>.inner_func at 0x000001E579519048>
x()#100 99
#x就是内部函数,加上()就可以调用这个函数'''
闭包的条件:
1.外部函数中定义了内部函数
2.外部函数是有返回值的
3.返回的值是:内部函数名
4.内部函数引用了外部函数的变量
格式:
def 外部函数():...def 内部函数():...return 内部函数
'''

例子

#例子
def func(a,b):c=10def inner_func():s=a+b+cprint('相加之后的结果是:',s)return inner_func#调用func
ifunc=func(6,9)
ifunc1=func(2,8)
#调用反出来的内部函数
ifunc1()
ifunc()
'''
相加之后的结果是: 20
相加之后的结果是: 25
'''

同级闭包

#同级闭包
'''
闭包有什么缺点?
1.作用域没有那么直观
2.因为变量不会呗垃圾回收所以有一定的内存占用问题作用:
1.可以使用同级的作用域!!
2.读取其他元素的内部变量
3.延长作用域总结:
1.闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
3.闭包的好处,使代码变得更简洁,便于阅读代码
4.闭包是理解装饰器得基础'''
def func():a=100def inner_func1():b=90s=a+bprint(s)def inner_func2():inner_func1()print('---inner_func2')return inner_func2x=func()
x()
'''
190
---inner_func2
'''

装饰器引入

#闭包回顾(返回函数的地址出来)
def func(number):a=100def inner_func():nonlocal anonlocal numbernumber+=1for i in range(number):#对a进行number+1次加1a+=1print('修改后的a:',a)return inner_func#调用func
f=func(5)
f()#修改后的a: 106#地址引用变量和函数
a=10
b=a
print(a)#10
print(b)#10def test():print('test-----')t=test
#调用
t()#test-----
test()#test-----#函数地址作为参数(装饰器)
def func1(f):print(f)f()#调用参数中的函数print('--->func')
func1(test)#注意test参数不要带括号
'''
<function test at 0x000001886707A048>
test-----
--->func
'''

装饰器使用

def house():print('我是毛胚房')def house1():house()print('刷漆')print('铺地板')
#调用函数
house1()
'''
我是毛胚房
刷漆
铺地板
''''''
装饰器特点:
1.函数A是作为参数出现的(函数B接收函数A作为参数)
2.要有闭包的特点(外部函数调用外部函数的变量&外部函数返回内部函数的地址)
'''
#定义一个装饰器
def decoratea(func):a=100def wrapper():func()print('----->刷漆')print('---->铺地板',a)print('---->装门')return wrapper#使用装饰器
@decoratea#表示把下面的函数作为参数传给这个装饰器
def house():print('我是毛胚房')
#调用函数house
print(house)
house()#本质是调用wrapper,wrapper里面调用真实house'''
<function decoratea.<locals>.wrapper at 0x000001CEB9969158>
我是毛胚房
----->刷漆
---->铺地板 100
---->装门
'''
'''
@装饰器类名底层调用步骤:
1.house作为被装饰函数
2.将被装饰函数作为参数传给装饰器decoratea
3.执行decoratea函数
3.1 a=100
3.2 加载函数wrapper进入内存,但是没有调用
4.将返回值赋值给被装饰函数house,因此当我们调用house时其实是调用wrapper函数,而wrapper函数里面调用了函数参数func才是我们真正的house函数'''

无参例子

#例子
import timedef decorator2(func):def wrapper():print('正在校验中...')time.sleep(2)print('检验完成..')#调用原函数func()return wrapper@decorator2
def f1():print('----f1--')'''
正在校验中...
检验完成..
----f1--
'''
'''
@decorator2底层:
1.把f1当作被装饰函数
2.调用decorator2
3.把返回值赋值给f1
'''
f1()
#调用返回值wrapper函数,wrapper函数里面调用f1

有参例子

#例子
import timedef decorator2(func):def wrapper(x):print('正在校验中...')time.sleep(2)print('检验完成..')#调用原函数,原函数有参数,这里也要有func(x)return wrapper@decorator2
def f1(n):print('----f1--',n)'''
正在校验中...
检验完成..
----f1-- 5
'''
f1(5)#本质是调用wrapper,因此wrapper也要有参数
#调用返回值wrapper函数,wrapper函数里面调用f1@decorator2
def f3(students):for stu in students:print(stu)
students=['lily','tom','lucy']f3(students)
'''
正在校验中...
检验完成..
lily
tom
lucy
'''

可变参数例子

#如果现在某个被装饰类传入两个参数?
#----》修改装饰类的参数为可变参数#例子
import timedef decorator2(func):def wrapper(*x):  #*x是5,x是(5,)print('正在校验中...')time.sleep(2)print('检验完成..')#调用原函数,原函数有参数,这里也要有func(*x)  #对元组拆包,*x是5,将5作为参数return wrapper@decorator2
def f1(n):print('----f1--',n)'''
正在校验中...
检验完成..
----f1-- 5
'''
f1(5)#本质是调用wrapper,因此wrapper也要有参数
#调用返回值wrapper函数,wrapper函数里面调用f1@decorator2
def f2(name,age):print('----f2---',name,age)
f2('lily',20)
'''
正在校验中...
检验完成..
----f1-- 5
正在校验中...
检验完成..
----f2--- lily 20
'''

带关键字参数的装饰器

# 带关键字参数的装饰器
import time
def decorate(func):def wrapper(*args,**kwargs):print('正在校验...')time.sleep(2)print('校验完毕...')#调用原函数func(*args,**kwargs)return wrapper@decorate
def f3(students, clazz='1905'):print('{}班级的学生如下:'.format(clazz))for stu in students:print(stu)students = ['lily', 'tom', 'lucy']
f3(students, clazz='1904')
'''
正在校验...
校验完毕...
1904班级的学生如下:
lily
tom
lucy
'''

双层装饰器

#双层装饰器
def zhuang1(func):print('--->1 start')def wrapper1(*args,**kwargs):func()print('刷漆')print('--->1 end')return wrapper1def zhuang2(func):print('--->2 start')def wrapper2(*args,**kwargs):func()print('铺地板,装门..')print('---->2 end')return wrapper2@zhuang2
@zhuang1
def house():print('我是毛胚房...')#调用
house()
'''
1.@zhuang1底层
2.@zhuang2底层
3.调用house,看当前house本质是谁
双层装饰器的调用是符合就近原则,先调用zhuang1,把house作为zhuang1的参数,zhuang1返回wrapper1给house,此时house=wrapper1
然后zhuang2就把house(此时是wrapper1)作为参数,返回wrapper2给house,此时house=wrapper2
接着调用了house,实际是调用wrapper2,里面的func是wrapper1,wrapper里面的func是原始的house
'''
'''
--->1 start
--->1 end
--->2 start
---->2 end
我是毛胚房...
刷漆
铺地板,装门..
'''

装饰器带参数

#装饰器带参数(必须用三层函数才可以使得装饰器带参数)
'''
带参数的装饰器是三层的
最外层的函数负责接收装饰器参数
里面的内容还是原装饰器的内容'''
def outer(a):#在原来两层基础上多加一层用来接收参数def decorate(func):def wrapper(*args,**kwargs):func(*args)print('---->铺地砖{}块'.format(a))return wrapperreturn decorate@outer(10)
def house(time):print('我{}日期拿到的房子的钥匙,是毛胚房..'.format(time))house('2021-05-08')
'''
我2021-05-08日期拿到的房子的钥匙,是毛胚房..
---->铺地砖10块
'''@outer(100)
def street():print('新修街道名字是:黑泉路')street()
'''
新修街道名字是:黑泉路
---->铺地砖100块
'''

装饰器的应用

#装饰器的应用
#开发:登录验证
import time#登录状态
islogin=Falsedef login():global isloginusername=input('请输入用户名')password=input('请输入密码')if username=='admin' and password=='123456':islogin=True#定义一个装饰器,进行付款验证
def login_required(func):def wrapper(*args,**kwargs):print('---付款----')#验证用户有没有登录if islogin:func(*args,**kwargs)else:#跳转到登录页面print('请先进行登录')login()return wrapper@login_required
def pay(money):print('正在付款,付款金额是{}元'.format(money))print('付款中...')time.sleep(1)print('付款完成')#调用
pay(100)
pay(200)'''
---付款----
请先进行登录
请输入用户名admin
请输入密码123456
---付款----
正在付款,付款金额是200元
付款中...
付款完成
'''

python入门day11闭包装饰器相关推荐

  1. Python 进阶_闭包 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  2. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

  3. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  4. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

  5. python闭包函数使用教程_Python闭包装饰器使用方法汇总

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  6. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  7. day4----函数-闭包-装饰器

    day4----函数-闭包-装饰器 本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时, ...

  8. itext生成pdf paragraph 自动换行_reportlab高级制作多格式PDF和python的class和装饰器复习

    1 说明 1.1 reportlab高级制作多格式PDF:即包含文字.表格.柱状图. 1.2 复习python的class和装饰器的高级基础知识. 1.3 列表转换字符串.读取txt文件等python ...

  9. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

最新文章

  1. 2022-2028年中国普鲁兰多糖行业市场分析及投资前景研究报告
  2. 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...
  3. 两个软件相互交换数据_六轴算法机软件使用说明
  4. Java虚拟机:Java中堆和栈的详细区别
  5. java集合学习笔记 ---Collections类对集合的处理
  6. 重庆邮电计算机科学分数线,2020重庆邮电大学录取分数线已公布
  7. arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)
  8. appium java环境_Appium环境搭建(Windows版)
  9. CentOS 7中添加一个新用户并授权(转载)
  10. 分析一个JDK卡死问题,还真有点麻烦
  11. poj3254:基础状压dp
  12. 手机手写签名 php,jSignature手写签名
  13. Firefox 火狐浏览器 windows 启用Flash
  14. java 替换 ppt内容_Java 替换PPT文档中的文本和图片
  15. 【数字水印】基于matlab DFT数字水印嵌入提取攻击【含Matlab源码 2320期】
  16. 中序遍历二叉树-非递归方式实现-附C++代码
  17. 享元模式--大量的飞龙
  18. 运营商大数据在不同行业的利用
  19. CAD中怎么识别标高范围?CAD标高范围识别技巧
  20. php学生管理系统视频教程,学生管理系统——PHP

热门文章

  1. (2017多校训练第一场)HDU - 6034 Balala Power! 贪心
  2. 数据分析——切片器、数据透视表与数据透视图(职场必备)
  3. 当数字孪生遇上轨道交通,会有什么新发展?
  4. 组件之间数据信息传递方法
  5. Windows Latex 中日文字体设置例
  6. 介绍几个实用的小技巧
  7. cesium相关学习网址
  8. Nokia E71 常见问题
  9. C语言stu1成员age的非法引用,2009年上海市高校计算机等级考试(2级C-b卷)
  10. java开发金融数字_java金融数字用什么类型