21.闭包

  1. 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量)
  2. 闭包的作用:1.保证数据的安全性(纯洁度)。2.装饰器使用
  3. .__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函数知识七 闭包、装饰器一(入门)、装饰器二(进阶)相关推荐

  1. Unity 车轮碰撞器的入门使用(二)

    Unity 车轮碰撞器的入门使用(二) 这节来分析一下车轮碰撞器里面的参数:如图 Mass:车轮的质量大小 Radius:车轮的半径大小 Wheel Damping Rate:车轮的阻尼值大小,必须要 ...

  2. Python函数中的闭包与装饰器

    目录 一. 闭包的介绍 1. 闭包的定义 2. 闭包的构成条件 3. 闭包的格式 4. 闭包的作用 二.闭包的使用 1.案例 2.实现步骤说明 3.功能实现代码 三.修改闭包内使用的外部变量 四.装饰 ...

  3. Python函数知识总结

    小白如何成为python数据分析师 第 十三天 ---->函数知识点总结 ​ 几天没有更新啦!因为没人催更,主要是时间来不及,今天就将这几天所学关于函数知识做个梳理,总结.如有不足,还请指出,谢 ...

  4. python函数作用域与闭包_python函数名称空间与作用域、闭包

    一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...

  5. python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归

    python基础-内置函数.作用域.闭包.递归 1.常见的内置函数 常见的内置函数: 查看内置函数: print(dir(__builtins__)) 常见函数 type() 数据类型 print() ...

  6. Python 函数知识汇总

    1. 函数的理解和定义 ① 是什么 函数是一段具有特定功能.可重用的语句组,是一种功能的抽象. ② 作用 降低编程难度和代码复用 ③ 怎么用 def <函数名>(<参数(0个或多个) ...

  7. python函数知识四 迭代器、生成器

    15.迭代器:工具 1.可迭代对象: ​ 官方声明,只要具有__iter__方法的就是可迭代对象 list,dict,str,set,tuple -- 可迭代对象,使用灵活 #方法一: list.__ ...

  8. Python 函数知识

    背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...

  9. python函数对象与闭包详解

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.一切皆对象 python是面向对象 ...

  10. python函数知识1(拆、装包,偏函数)

    函数 def text(): print('xxx') text() def test(num1, num2=1): print(num1 + num2) test(2) 拆包.装包 def mySu ...

最新文章

  1. DDM实践:数据库秒级平滑扩容方案
  2. 【干货】浅谈分布式数据库中间件之分库分表
  3. 区块链BaaS云服务(39)时戳信息Bystack“架构“
  4. C# 向listbox添加大量数据项的实践心得
  5. ArcGIS自定义高程
  6. 贪心算法+回溯算法+动态规划
  7. Java 获取集合长度
  8. php yii2模块,Yii2 之 frontend 子模块实践之四:路由美化
  9. oracle增量和全量的区别,ORACLE全备份和0级增量备份的区别
  10. Hooks——钩子概览
  11. 一元线性回归及案例(Python)
  12. 汇编语言典型例子详解_经典汇编程序100例
  13. 【IT项目管理】第5章 习题
  14. 3D优化之ShadowGun系列二:浓烟,使用面片模拟粒子效果
  15. Android APP 登陆界面开发 UI设计
  16. English improvement of IT Test(2014)
  17. 红米NOTE3 双网通(2015617)刷机包 解账户锁
  18. 矩阵可逆的条件以及特征值、特征向量与可对角化条件
  19. 有一种爱 不能称之为爱情
  20. Slurm作业启动原理

热门文章

  1. 《机器学习实战》完整读书笔记
  2. 服务器真在运行中,win7电脑服务器正在运行中的解决教程
  3. 未来智能合约平台的展望
  4. Docker教程小白实操入门(8)--基于save保存镜像与基于load加载镜像
  5. ubuntu php 上传大文件失败
  6. css html实现粒子特效,CSS实现粒子动态按钮效果
  7. Linux中yum使用教程,linux中关于yum使用
  8. java利用opencv降维_PCA主成分分析 特征降维 opencv实现
  9. Leetcode134.加油站
  10. css 三种颜色表示,css颜色表示法