python基础-闭包函数和装饰器
闭包函数和装饰器
闭包函数
- 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字。
- 特性
- 闭包函数必须在函数内部定义
- 闭包函数可引用外层函数的名字
闭包函数是函数嵌套、函数对象、名称空间与作用域结合体
闭包中被内部函数引用的变量,不会因为外部函数结束而被释放掉,而是一直存在内存中,直到内部函数被调用结束
# 闭包函数的定义
def func(y):
x = 100
def inner(): # 此处的inner 就是闭包函数
print(x)
print(y)
return inner
# 闭包函数的调用
inner = func(1000)
inner()
- 应用:为了给装饰器的使用做准备
装饰器
概念:在不修改被装饰对象源代码与调用方式的前提下,添加新的功能。简单来说,就是给其他函数增加额外功能的函数
装饰器必须遵循“开放封闭”原则
- 开放:对函数功能的添加是开放的
- 封闭:对函数功能的修改是封闭的
必备条件:
- 不能改变被装饰对象源代码
- 为被装饰对象添加新的功能
- 不能改变被装饰对象调用方式
使用装饰器,可以解决代码冗余问题,提高代码的可扩展性
应用:统计时间、登录认证
说了这多理论,上代码。
需求:统计下载媒体文件的时间(简易版)
# 需求: 统计下载电影的时间。
# 一般我们实现这个功能的方式如下
import time
def download_movie():
"""
下载电影功能
:return: None
"""
print("电影下载开始了……")
time.sleep(2) # 模拟电影下载2 秒
print("下载完成")
start_time = time.time() # 获取当前时间戳
download_movie() # 下载电影
end_time = time.time() # 获取当前时间戳
print(f"下载时间:{end_time-start_time}")
以上代码确实实现了统计下载时间的功能,问题来了,如果我有多个类型文件下载函数,都需要统计时间呢?难道展现我们的“CV大法”?估计隔天就要被扫地出门了……
就没有什么办法可以解决了吗?当然有啦!先看代码
# 定义一个装饰器
def time_record(func):
"""
新增统计时间功能
:param func: 使用该功能的函数对象
:return: inner 函数对象
"""
def inner():
# 统计开始
start_time = time.time()
func() # func() ----→ download_movie() or download_music()
end_time = time.time()
# 统计结束,打印统计时间
print(f"下载时间:{end_time-start_time}")
return inner
def download_movie():
"""
模拟下载电影
:return: None
"""
print("电影下载开始了……")
time.sleep(2)
print("下载完成!")
def download_music():
"""
模拟下载音乐
:return: None
"""
print("歌曲下载开始了……")
time.sleep(2)
print("下载完成!")
# time_record(download_movie) 返回一个inner,将其赋值给download_movie
inner = time_record(download_movie)
inner() # inner() ----→ download_movie()
# time_record(download_music) 返回一个inner,将其赋值给download_music
inner1 = time_record2(download_music)
inner1()
以上代码就是对装饰器的引入,其中 time_record 就是装饰器,download_movie 和 download_music 就是被装饰的函数对象。
通过观察
python基础-闭包函数和装饰器的更多相关文章
- Python基础之函数与装饰器
阅读目录 一.为什么要使用函数 二.函数的定义与调用 三.函数返回值 四.函数的参数 五.本章小结 六.装饰器 一.函数流程图: 函数名的命名规则: 1.函数名必须由字母下划线数字组成,不能是关键字和 ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- Python之闭包函数、装饰器
1.闭包函数 #作用域关系在函数定义阶段时就已经固定死了,与调用位置无关 # 即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系 # def f1(): # x=1 # def inner(): ...
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- day11 闭包函数和装饰器
1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...
- Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器
目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...
- Python入门之函数的装饰器
本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 ======================== ...
- python基础整理4——面向对象装饰器惰性器及高级模块
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
- python基础知识-11-函数装饰器
python其他知识目录 1.装饰器学习前热身准备 1.1装饰器简介 1.2装饰器热身分析 ) def func(): pass v1 = v2 = func #将函数名赋予一个变量,就和变量赋值是同 ...
随机推荐
- 强大得分布式项目管理工具Git
---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...
- Java线程状态和关闭线程的正确姿势
1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public enum State { /** 表示一个线程还没启用(即未 ...
- sqlmap实战-1
sqlmap实战-1 检测和利用sql注入 python2 sqlmap.py -u "[URL_SQL注入点]" [--batch] --batch:自动选择sqlmap默认的选 ...
- Jmeter结构体系及运行顺序
一:jmeter运行原理: jmeter时以线程的方式来运行的(由于jmeter是java开发的所以是运行在JVM虚拟机上的,java也是支持多线程的) 二:jmeter结构体系 1.取样器smapl ...
- 渗透测试-基于白名单执行payload--zipfldr.dll
0x01 zipfldr.dll简介: zipfldr.dll自Windows xp开始自带的zip文件压缩/解压工具组件. 说明:zipfldr.dll所在路径已被系统添加PATH环境变量中,因此, ...
- java学习6-java基础类库
1.与用户互动 2.系统相关 3.常用类 4.日期.时间类
- ESP8266开发之旅 应用篇① 局域网应用 ——炫酷RGB彩灯
1.前言 这一篇,博主将教大家怎么去实现一个WiFi RGB彩灯. 先来一个博主已经实现功能的图片,如下: 当然,博主也拍了运行视频,请点击 传输门. 1.1 知识储备 ...
- 百万年薪python之路 -- 装饰器进阶
本文链接:https://blog.csdn.net/xiemanR/article/details/72510885 一:函数装饰函数 def wrapFun(func): def inner(a, ...
- Eureka和zookeeper的比较
什么是CAP? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不 ...
- Shiro learning - 入门学习 Shiro中的基础知识(1)
Shiro入门学习 一 .什么是Shiro? 看一下官网对于 what is Shiro ? 的解释 Apache Shiro (pronounced “shee-roh”, the Japanese ...