python之闭包,装饰器
目录
- 函数对象 :相当于变量名
- 函数对象的作用:
- 1. 可以引用
- 2. 可以作为函数的返回值
- 3. 可以作为容器的元素
- 4. 可以作为函数的参数
- 函数对象的作用:
- 闭包
- 定义:
- 如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。那闭包就是,在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包
- ps:
- 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给内部函数,然后自己结束。
- 闭包的意义:
- 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域
- 定义:
- 装饰器
- 本质:装饰器 = 函数。它的本质就是函数
- 作用:给原函数增加新的功能
- 原则:
- 1. 不能改变被装饰的函数的调用方式
- 2. 装饰器不能修改装饰函数的源代码
- 实现装饰器的知识储备:
- 1. 函数即“变量”
- 2. 高阶函数。即一个函数可以作为另外一个函数的参数,这种函数就称之为高阶函数。
- 3. 嵌套函数。即定义一个函数时,在其函数体中又定义了一个函数,这个函数称之为嵌套函数。
- 装饰器的模板语法
- 装饰器的弊端:
函数对象 :相当于变量名
函数对象的作用:
1. 可以引用
def f1():print("from f1")a = f1
a()'''
from f1'''
2. 可以作为函数的返回值
def f1():print("from f1")def f2():return f1a = f2()
a()'''
from f1
'''
3. 可以作为容器的元素
def f1():print("from f1")
a = [1,2,3,4,5,f1]
4. 可以作为函数的参数
def f1():print("from f1")def f2(func):func()f2(f1)'''
from f1
'''
闭包
定义:
如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。那闭包就是,在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包
ps:
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给内部函数,然后自己结束。
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域
# 闭包
def test_plf(x):def test_lt():print(x)return test_ltf1 = test_plf(8)
f1()# 闭包的应用
import requests
def req(url):def test_plf():request = requests.get(url)data = request.status_codeprint(data)return test_plfbaidu = req("https://www.baidu.com")
baidu()
baidu()
baidu()
boke = req("https://www.cnblogs.com/plf-Jack/")
boke()
boke()
boke()# 使用普通函数进行对比
import requests
def req(url):content = requests.get(url)data = content.status_codeprint(data)req("https://www.baidu.com")
req("https://www.baidu.com")
req("https://www.baidu.com")
req("https://www.cnblogs.com/plf-Jack/")
req("https://www.cnblogs.com/plf-Jack/")
req("https://www.cnblogs.com/plf-Jack/")'''总结:相比使用普通函数和使用闭包函数实现相同业务逻辑1. 闭包在调用上要比普通函数要简单2. 闭包相对于普通函数的定义,逻辑上难度要大一些3. 闭包主要应用于延迟计算,爬虫领域
'''
装饰器
本质:装饰器 = 函数。它的本质就是函数
作用:给原函数增加新的功能
原则:
1. 不能改变被装饰的函数的调用方式
2. 装饰器不能修改装饰函数的源代码
实现装饰器的知识储备:
1. 函数即“变量”
2. 高阶函数。即一个函数可以作为另外一个函数的参数,这种函数就称之为高阶函数。
3. 嵌套函数。即定义一个函数时,在其函数体中又定义了一个函数,这个函数称之为嵌套函数。
装饰器的模板语法
def deco(func):def wrapper(*args,**kwargs):res = func(*args,**kwargs)return resreturn wrapper
无参装饰器
import time def test_lt(func):def warpper():start_time = time.time()func()end_time = time.time()print("你睡了%s秒"%(end_time-start_time))return warpper@test_lt # 语法糖,即简洁。它等同于 test_plf = test_lt(test_plf) def test_plf():time.sleep(1)print("我睡了多长时间")
返回值装饰器
import timedef test_lt(func):def warpper():start_time = time.time()res = func()end_time = time.time()print("睡了%s秒"%(end_time-start_time))return resreturn warpper@test_lt #test_plf = test_lt(test_plf) def test_plf():time.sleep(1)print("我睡了多长时间")return 123a = test_plf() print("返回值为%d"%a)
有参装饰器
dic = {"PLF":'123'} is_login = False def auth(test_type='file'):def login_desc(func):def wrepper():if test_type == "file":global is_login # 声明的是全局变量的is_loginif not is_login:user_name = input("请输入账号>>>")user_pwd = input("请输入密码>>>")if dic.get(user_name) != user_pwd:print("输入错误")returnprint("密码输入正确")is_login = Truefunc()returnfunc()elif test_type == "txt":print("文件类型不正确")else:print("你走开")return wrepperreturn login_desc@auth(test_type="file") def go_shopping():print("购物")@auth(test_type="txt") def pay():print("支付")@auth(test_type="makeDown") def see_list():print("查看清单")go_shopping() pay() see_list()
装饰器的弊端:
import timedef test_lt(func):def warpper():start_time = time.time()res = func()end_time = time.time()print("睡了%s秒"%(end_time-start_time))return resreturn warpper@test_lt #test_plf = test_lt(test_plf)
def test_plf():time.sleep(1)print("我睡了多长时间")return 123print(test_plf.__name__)'''
warpper
''''''总结:1. 目标函数(test_plf)是一个函数对象,它里米那有自己的属性,如函数名__name__,说明文档__doc__等等。但如果目标函数被装饰器装饰之后,我们在调用目标函数的__name__会发现,本来我们想要的test_plf名字,结果打印出来了warpper。这种情况确实不出乎意料,因为test_plf被装饰之后确实存的就是warpper了,我们对test_plf的操作实际上都是对inner的操作.2. 以上的操作带来了使用的不一致性。如果我们能把本来目标函数各种方法覆盖给test_plf函数就好了。这里我们可以用functools包里的工具来实现。这里暂不做解释,有兴趣的同学先去百度一下。
'''
参考博客:https://www.cnblogs.com/Lin-Yi/p/7306235.html
转载于:https://www.cnblogs.com/plf-Jack/p/10957486.html
python之闭包,装饰器相关推荐
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...
一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...
- 初学者python笔记(装饰器、高阶函数、闭包)
一个函数被定义完成后,甚至程序发布后,后期可能需要添加某些功能,但是我们不可能每次都去修改原函数的代码,这时候装饰器就可以上场了,本篇文章将会用一个个可实现的代码,由浅入深.循序渐进得阐述装饰器的强大 ...
- SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理
SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...
- python入门day11闭包装饰器
目录 闭包 例子 同级闭包 装饰器引入 装饰器使用 无参例子 有参例子 可变参数例子 带关键字参数的装饰器 双层装饰器 装饰器带参数 装饰器的应用 闭包 def func():a=100def inn ...
- python装饰器原理-python 中的装饰器及其原理
装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...
- python装饰器类-PYTHON里的装饰器能装饰类吗
扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...
- python类装饰器详解-python 中的装饰器详解
装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...
- 二十一、深入Python强大的装饰器
@Author: Runsen 文章目录 闭包 装饰器 嵌套函数的装饰器 带参数嵌套函数的装饰器 类装饰器 嵌套装饰器 @Date:2019年07月11日 最近有同学在问关于Python中装饰器的问题 ...
- day4----函数-闭包-装饰器
day4----函数-闭包-装饰器 本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时, ...
最新文章
- Spring事务配置探究
- 中台之上(十一):企业级业务架构设计的“五难”
- Pycharm安装pip pip安装第三方模块
- 蓝牙HCI剖析(三)
- vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域
- 1088 最长回文子串
- 销售流程图_34页财务管理制度和流程图!让你明白会计工作要点,总结全面清晰...
- 中国剩余定理-模版(互质版)
- List.remove(i)报错:问题分析与解决
- maven+scala和java_maven打包scala+java工程
- java在Intellij上使用sigar
- 数字通信(知识点)复习
- 宏碁台式计算机u盘启动,Acer宏碁台式电脑怎么通过bios设置u盘启动
- 使用whistle实现移动网页(H5、公众号、企微应用)的本地开发及调试
- Sigma Function
- ubuntu16.04 禁用Guest用户
- 赚钱,一定要对自己狠
- Logstash 原理分析/配置文件详解 时间 日期 时区 ip 反斜杠 grok在线地址 类型转换
- 淘宝新开店铺容易忽略的地方,如何安全提升宝贝排名
- PLSQL——条件控制(IF、CASE WHNE)
热门文章
- 删掉一个文件夹相对于另一个文件夹多出的文件
- .Net Core 部署到Ubuntu 16.04 中的步骤
- SQL中删除重复的行(重复数据),只保留一行 转
- outdated: 29.Blitter Function, RAW Texture Loading
- WPF设置ListBoxItem失去焦点时的背景色
- SQL server 2012 如何取上个月的最后一天
- roller在eclipse中的部署
- 7.2-5 usermod
- LVS负载均衡群集部署之——NAT模式的介绍及搭建步骤
- java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁