python闭包函数及装饰器简介
目录:
闭包函数简介
闭包函数的实际应用
装饰器简介
装饰器初期-完整版
- 装饰器语法糖
闭包函数简介
1.定义在函数内部的函数(函数的嵌套)
2.内部函数运用外部函数局部名称空间中的变量名
注:函数名还可以当做函数的返回值
如何接收返回值(统一语法):变量名 = 函数()
函数名也可以被用来多次赋值
def func(username):
# username = 'jason'
def name():
print(username)
return name
res = func('jason')
print(res)
res()
闭包函数的实际应用
1.给函数体代码传值方式
1.1 通过形参传值:在函数定义时定义形参,调用时临时绑定形参与实参完成传值
def func(username):
print(username)
func('jason') # jason
1.2 通过闭包函数传值:通过返回值内部函数函数名,通过接收返回值完成传值
def func(username):
def name():
print(username)
return name
res = func('jason')
res() # jason
res1 = func('kevin')
res1() # kevin装饰器简介
1.本质:不改变'内部代码'及'调用方式'添加新功能
2.原则:对修改封闭,对扩展开放
3.扩展知识:时间戳
3.1时间戳:截至目前至1970年1月1日0时0分0秒的秒数
import time
print(time.time()) # 1657008257.5792694
3.2可以统计代码运行的时间(打印0-1000所需秒数)
import time
start_time = time.time()
for i in range(0, 1000):
print(i)
end_time = time.time()
print('%s'%(end_time-start_time)) # 0.027039527893066406
3.3睡眠时间 time.sleep(2)括号里的数字代表几秒
import time
time.sleep(2)
print('快睡着了')装饰器初期-完整版
1.装饰器初期
1.1 缺陷:如果有多个func函数统计执行时间,则需要多次写代码(统计func函数的执行时间)
import time
def func():
time.sleep(2)
print('快睡着了')
start_time = time.time()
func()
end_time = time.time()
print(end_time-start_time) # 2.002647638320923
1.2 缺陷:只能统计func函数的执行时间,不能统计其他函数(将多次需要写的代码封装成函数)
import time
def func():
time.sleep(2)
print('快睡着了')
def get_time():
start_time = time.time()
func()
end_time = time.time()
print(end_time-start_time)
get_time() # 2.0140273571014404
get_time() # 2.008859157562256
1.3 定义的函数存在形参,调用时必须传实参(可以统计多个函数的执行时间)
import time
def func():
time.sleep(2)
print('快睡着了')
def username():
time.sleep(2)
print('他的名字是kevin')
def get_time(xxx):
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
get_time(func) # 快睡着了 2.005340099334717
get_time(username) # 他的名字是kevin 2.0011959075927734
注:暂无法解决
import time
def func1(a):
time.sleep(2)
print('我是存在形参的a')
def get_time(xxx):
start_time = time.time()
xxx(*args, **kwargs) # 暂无法解决
end_time = time.time()
print(end_time-start_time)
get_time(func)
get_time(username)
get_time(func1)
1.4 缺陷:调用函数名发生变化(解决办法:装饰器)
# 传值方式-参数传值不能改变调用函数方式
import time
def get_time(xxx):
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
get_time(func)
get_time(username)
# 传值方式-闭包函数(缺陷:只能计算func函数执行时间)
def func2():
xxx = func
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
return get_time
res = func2()
res() # 快睡着了 2.0147109031677246
1.5 所有函数执行时间(可以统计多个函数执行时间、不改变调用函数名,使用闭包函数)
import time
def func():
time.sleep(2)
print('快睡着了')
def username():
time.sleep(2)
print('他的名字是kevin')
def func2(xxx):
# xxx = func
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
return get_time
func = func2(func)
func() # 快睡着了 2.0079562664031982
username = func2(username)
username() # 他的名字是kevin 2.0015351772308352.装饰器优化版本(可以统计多个函数执行时间、并且有参无参都可以使用,不改变调用函数名,使用闭包函数)
import time
def func(xxx):
def get_time(*args, **kwargs): # 形参
start_time = time.time()
xxx(*args, **kwargs) # 实参
end_time = time.time()
print(end_time-start_time)
return get_time
func2 = func(func2)3.装饰器完整版本
import time
def func(xxx):
def get_time(*args, **kwargs): # 形参
start_time = time.time()
res = xxx(*args, **kwargs) # 实参
end_time = time.time()
print(end_time-start_time)
return res
return get_time4.装饰器最终版本
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
def inner(*args, **kwargs):
print('执行被装饰对象之前可以做的额外操作')
res = func_name(*args, **kwargs)
print('执行被装饰对象之后可以做的额外操作')
return res
return inner装饰器语法糖
import time
@outer # home = outer(真正的函数名home)
def home():
'''我是home函数 我要热死了!!!'''
time.sleep(1)
print('from home')
return 'home返回值'
python闭包函数及装饰器简介的更多相关文章
- python闭包函数与装饰器
目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...
- python 闭包函数与装饰器
1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...
- python闭包函数、装饰器
闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...
- python基础-闭包函数和装饰器
闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...
- day11 闭包函数和装饰器
1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...
- Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器
目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...
- 【Python3的命名空间与作用域,闭包函数,装饰器】
一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...
- day11_7.11 闭包函数与装饰器
补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this 查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...
- CSIC_716_20191112【闭包函数和装饰器】
闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...
随机推荐
- HttpContext.TraceIdentifier那严谨的设计
前言 Asp.Net Core中有一个不受人重视的属性HttpContext.TraceIdentifier,它在链路追踪中非常有用,下面是官方的定义: 在项目中一般会将该字段输出到每一条日志中,也可 ...
- 【多线程】线程同步 synchronized
由于同一进程的多个线程共享同一块存储空间 , 在带来方便的同时,也带来了访问 冲突问题 , 为了保证数据在方法中被访问时的正确性 , 在访问时加入 锁机制synchronized , 当一个线程获得对 ...
- Css实例之信息提交
代码实例: <!DOCTYPE html><html><head><meta charset="UTF-8"><title&g ...
- 成本节省 50%,10 人团队使用函数计算开发 wolai 在线文档应用
作者: 马锐拉 我们的日常工作场景几乎离不开"云文档".目前,人们对于文档的需求再不仅仅是简单的记录,而扩展到办公协同.信息组织.知识分享等.在国内众多在线文档中,wolai 因为 ...
- 前端 跨站脚本(XSS)攻击的一些问题,解决<script>alert('gansir')</script>
问题1:跨站脚本(XSS)的一些问题,主要漏洞证据: <script>alert('gansir')</script>,对于这个问题怎么解决? (测试应当考虑的前端基础攻击问题 ...
- PyTorch DataSet Normalization torchvision.transforms.Normalize()
特征缩放, 在这种情况下,我们不仅仅考虑是一个值的数据集,我们考虑的是具有多个特征和相关的值的样本或元素的数据集. 假如正在处理一个人的数据集, 归一化数据集有许多不同的 ...
- 大功率超远距离lora无线数传电台,多级中继功能
一.在无线通信领域,LoRa是目前市场最被看好的技术之一.随着新一代LoRa调制技术的升级,市场对LoRa技术的认知.认可逐步提高,基于LoRa调制技术开发的产品得到更广泛的应用.受益于其超低的接收灵 ...
- 用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性
背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行. 这个规模不算大,测试数据以及库表结构是用Dump ...
- JVM学习笔记-从底层了解程序运行(一)
1:JVM基础知识 什么是JVM 1. java虚拟机,跨语言的平台,实现java跨平台 2. 可以实现多种语言跨平台,只要该语言可以编译成.class文件 3. 解释执行.class文件 java是 ...
- SAP Display picture
program sap_picture_demo. set screen 200. TYPE-POOLS cndp. ***************************************** ...