当前位置:
首页 > temp > 简明python教程 >
-
闭包函数与装饰器
一、什么是闭包函数
闭:封闭
包:包裹
闭包函数必须在函数内部定义
闭包函数可以引用外层函数的名字
闭包函数就是函数嵌套,函数对象,名称空间与作用域的结合体
二、闭包函数的传参
-
直接传参
def fun(x): print(x) func(1000)
-
通过闭包函数传参
def outer(num): def inner(): print(num) return inner func = outer(100)#inner地址 func()
三、装饰器及装饰器语法糖
-
什么是装饰器
装饰:装饰,修饰
器:工具
-
装饰器必须要遵循的‘开放封闭原则’
开放:对函数功能的添加是开放的
封闭:对函数功能的修改是封闭的
-
装饰器的作用
在不修改被装饰对象源代码与调用方式的前提下,添加新的功能
被修饰对象:需要添加功能的函数
装饰对象:添加功能函数
-
应用
统计时间
登录认证
可以解决冗余代码,提高代码可扩展性
-
小实例结合time包
import time # 被修饰函数 def download_movie():#download_movie函数名 print('开始下载电影') time.sleep(3)#模拟下载时间 print('电影下载成功') start_time = time.time() download_movie() end_time = time.time() print(f'电影下载时间:{end_time - start_time}') >>>开始下载电影 电影下载成功 电影下载时间:3.0007519721984863 #装饰器即装饰函数 def time_record(func):#time_record装饰器的函数名,func形参,用来接收实参 def inner():#内部函数名 start_time = time.time() func()#执行接收到的函数 end_time = time.time() print(f'电影下载时间:{end_time - start_time}') return inner#调用time_record这个函数返回inner的内存地址 #print(time_record(download_movie))#time_record(download_movie)是一个内存地址 download_movie = time_record(download_movie) download_movie() >>>开始下载电影 电影下载成功 电影下载时间:3.000049352645874 开始下载电影 电影下载成功 电影下载时间:3.00085186958313 #1、被修饰对象有返回值 import time def download_movie(): print('开始下载电影') time.sleep(3)#模拟下载时间 print('电影下载成功') return '小泽.mp4'#调用函数返回'小泽.mp4' def time_record(func):#func<---download_movie def inner(): start_time = time.time() res = func()#res = '小泽.mp4' # print(res)#res字符串 end_time = time.time() print(f'电影下载时间:{end_time - start_time}') return res#调用函数inner返回res # print(inner()) return inner#调用函数time_record返回inner,此时才是地址 # print(time_record(download_movie))#inner地址 download_movie = time_record(download_movie) download_movie() >>>开始下载电影 电影下载成功 电影下载时间:3.0000083446502686 #2、被修饰对象有参数 import time def download_movie(url):#url用来接收参数 print('开始下载电影') time.sleep(3)#模拟下载时间 print('电影下载成功') return '小泽.mp4'#返回'小泽.mp4' def time_record(func):#func用来接收被修饰函数func<---download_movie def inner(url):#url接收参数 start_time = time.time() res = func(url)#func(url)<----download_movie(url) end_time = time.time() print(f'电影下载时间:{end_time - start_time}') return res#把res即(download_movie(url))---->inner return inner#(download_movie(url))---->time_record download_movie = time_record(download_movie) download_movie('https://www.jd.com/') >>>开始下载电影 电影下载成功 电影下载时间:3.0002450942993164 #3、有多个参数 import time def download_movie(*args, **kwargs): print('开始下载电影') time.sleep(3)#模拟下载时间 print('电影下载成功') return '小泽.mp4'#把'小泽.mp4' def time_rcod(func): def inner(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(f'电影下载时间:{end_time - start_time}') return res return inner download_movie = time_rcod(download_movie) download_movie('https://www.baidu.com/') >>>开始下载电影 电影下载成功 电影下载时间:3.000089168548584
-
装饰器模板
def wrapper(func): def inner(*args,**kwargs): #添加功能 res = func(*args,**kwargs) #添加功能 return res return inner def func1(): pass func1 = wrapper(func1)#func1被修饰函数,wrapper修饰函数 func1()
-
装饰器语法糖
装饰器的语法糖是属于装饰器的
@:装饰器的语法糖
注意:在使用装饰器的语法糖时,装饰器必须定义在被装饰函数前
# 统计函数执行时间装饰器 def wrapper(func): # 被装饰对象 def inner(*args, **kwargs): # 被装饰对象的参数 # 调用前增加新功能 start_time = time.time() # 调用被装饰对象,并接收返回值 res = func(*args, **kwargs) # 调用后添加新功能 end_time = time.time() print(end_time - start_time) return res return inner # func函数需要执行3秒 # 无参装饰器 # 使用装饰器 @wrapper # wrapper(func) ---> func def func(): time.sleep(3)
-
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数