python函数知识七 闭包、装饰器一(入门)、装饰器二(进阶)
21.闭包
- 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量)
- 闭包的作用:1.保证数据的安全性(纯洁度)。2.装饰器使用
- .__closure__判断是否是闭包
def func():a = 1 def foo():print(a)return foo
ret = func()
ret()
#例子
def func():avg_lst = []def foo(pirce):avg_lst.append(pirce)avg = sum(avg_lst) / len(avg_lst)return avgreturn foo
ret = func()
print(ret(1500))
print(ret(1600))
print(ret.__closure__)#结果:(<cell at 0x000002095400B558: list object at 0x00000209540A5B48>,)证明是闭包
print(func.__closure__)#结果:None,不是闭包print(ret.__code__.co_freevars)#获取的是自由变量
print(ret.__code__.co_varnames)#获取的是局部变量
22.装饰器一(入门)
1.一个装饰器装饰多个函数
开放封闭原则:扩展是开放的(增加新功能),源码是封闭的(修改已经实现的功能)
作用:在不改变源代码及调用方式的基础下额外增加新功能。
装饰器:用来装饰的工具
2.版一:
import time
start_time = time.time
def func():time.sleep(2)#睡眠s模拟网络延时print("我要飞")
func()
print(time.time - start_time)
#改变了源代码
3.版二:
def times(f):start_time = time.time()f()print(time.time() - start_time)
def foo():time.sleep(3)print("我飞的比你高")
#times(foo)#改变了调用方式
s = foo
foo = times
foo(s)#不改变调用方式
4.版三:(low版装饰器)
def times(f):def inner():start_time = time.time()f()print(time.time() - start_time)return inner
def foo():time.sleep(3)print("我飞的比你高")
foo = times(foo)
foo()
5.版四:
def wrapper(f):def inner(a):start_time = time.time()f(a)print(time.time() - start_time)return inner#切记不加括号def func(a):print(f"{a}你不行")
func = wrapper(func)
func("alex")
#传输多个数据,用*args,**kwargs
6.版五(标准版装饰器):
@wrapper#语法糖:必须放在要装饰的函数的正上方
def wrapper(f):#f是要被装饰的函数名def inner(*args,**kwargs):"被装饰前"start_time = time.time()ret = f(*args,**kwargs)print(time.time() - start_time)"被装饰后"return retreturn inner#切记不加括号
@wrapper#语法糖 -->func = wrapper(func)
def func(*args,**kwargs):print(f"{a}你不行")return "我可以返回了"
#func = wrapper(func)#有语法糖不用多次赋值
func("alex")
23.装饰器二(进阶)
1.有参装饰器:
有参装饰器:在基础装饰器的基础上再套一层函数
#有参装饰器实现登陆验证
msg = """
QQ
微信
抖音
请输入您要登录的的app:
"""
chose = input(msg).upper()
dict_flag = {'username':None,'flag':False}
def auth(a):def wrapper(f):def inner(*args,**kwargs):if dic_flag['flag']:fun(*args,**kwargs)else:if argv =="QQ":print("欢迎登陆QQ")user = intput("user:")pwd = input("passwd:")if user == "alex" and pwd == "alex123":dict_flag["flag"] = Truedict_flag["username"] = userfoo(*args,**kwargs)else:print("用户名或密码错误!")return innerreturn wrapper
@auth(chose)
"""
语法糖拆分:
wrapper = auth(chose)
foo = wrapper(foo)
"""
def foo():print("这是被装饰的函数")
foo()
2.多个装饰器装饰一个函数:
当被装饰的函数正上方有多个装饰器,先执行里被装饰函数最近的装饰器(小技巧:进入装饰器,从上往下,走到最后一个装饰器,执行被装饰的函数,退出装饰器从下往上)
def wrapper1(f):def inner1(*args,**kwargs):print("这是第一个装饰器开始")f(*args,**kwargs)print("这是第一个装饰器结束")return return inner1def wrapper2(f):def inner2(*args,**kwargs):print("这是第二个装饰器开始")f(*args,**kwargs)print("这是第二个装饰器结束")return return inner2@wrapper1
@wrapper2
"""
两个语法糖等价于:
foo = wrapper2(foo)#foo == inner2
foo = wrapper1(foo)#foo = wrapper(inner2),foo == inner1
foo()#-->inner1()
"""
def foo():print("这是被装饰的函数")
foo()
'''
结果:
这是第一个装饰器开始
这是第二个装饰器开始
这是被装饰的函数
这是第二个装饰器结束
这是第一个装饰器结束
'''
转载于:https://www.cnblogs.com/Onlywang/p/11241567.html
python函数知识七 闭包、装饰器一(入门)、装饰器二(进阶)相关推荐
- Unity 车轮碰撞器的入门使用(二)
Unity 车轮碰撞器的入门使用(二) 这节来分析一下车轮碰撞器里面的参数:如图 Mass:车轮的质量大小 Radius:车轮的半径大小 Wheel Damping Rate:车轮的阻尼值大小,必须要 ...
- Python函数中的闭包与装饰器
目录 一. 闭包的介绍 1. 闭包的定义 2. 闭包的构成条件 3. 闭包的格式 4. 闭包的作用 二.闭包的使用 1.案例 2.实现步骤说明 3.功能实现代码 三.修改闭包内使用的外部变量 四.装饰 ...
- Python函数知识总结
小白如何成为python数据分析师 第 十三天 ---->函数知识点总结 几天没有更新啦!因为没人催更,主要是时间来不及,今天就将这几天所学关于函数知识做个梳理,总结.如有不足,还请指出,谢 ...
- python函数作用域与闭包_python函数名称空间与作用域、闭包
一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...
- python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归
python基础-内置函数.作用域.闭包.递归 1.常见的内置函数 常见的内置函数: 查看内置函数: print(dir(__builtins__)) 常见函数 type() 数据类型 print() ...
- Python 函数知识汇总
1. 函数的理解和定义 ① 是什么 函数是一段具有特定功能.可重用的语句组,是一种功能的抽象. ② 作用 降低编程难度和代码复用 ③ 怎么用 def <函数名>(<参数(0个或多个) ...
- python函数知识四 迭代器、生成器
15.迭代器:工具 1.可迭代对象: 官方声明,只要具有__iter__方法的就是可迭代对象 list,dict,str,set,tuple -- 可迭代对象,使用灵活 #方法一: list.__ ...
- Python 函数知识
背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...
- python函数对象与闭包详解
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.一切皆对象 python是面向对象 ...
- python函数知识1(拆、装包,偏函数)
函数 def text(): print('xxx') text() def test(num1, num2=1): print(num1 + num2) test(2) 拆包.装包 def mySu ...
最新文章
- DDM实践:数据库秒级平滑扩容方案
- 【干货】浅谈分布式数据库中间件之分库分表
- 区块链BaaS云服务(39)时戳信息Bystack“架构“
- C# 向listbox添加大量数据项的实践心得
- ArcGIS自定义高程
- 贪心算法+回溯算法+动态规划
- Java 获取集合长度
- php yii2模块,Yii2 之 frontend 子模块实践之四:路由美化
- oracle增量和全量的区别,ORACLE全备份和0级增量备份的区别
- Hooks——钩子概览
- 一元线性回归及案例(Python)
- 汇编语言典型例子详解_经典汇编程序100例
- 【IT项目管理】第5章 习题
- 3D优化之ShadowGun系列二:浓烟,使用面片模拟粒子效果
- Android APP 登陆界面开发 UI设计
- English improvement of IT Test(2014)
- 红米NOTE3 双网通(2015617)刷机包 解账户锁
- 矩阵可逆的条件以及特征值、特征向量与可对角化条件
- 有一种爱 不能称之为爱情
- Slurm作业启动原理