【Python语法糖】闭包和装饰器
Python闭包和装饰器
参考:
https://zhuanlan.zhihu.com/p/453787908
什么是闭包?
简单来说就是,在一个函数f1中又定义了一个函数f2,f2构成了闭包,一般来说f2会使用f1中的某些变量
def func():#外部函数
a = 1 #外部函数作用域里面的变量
print("this is func.")
def func1(num):#内部函数
print("this is func1")
print(num + a)
return func1
if __name__ == '__main__':
#func()#运行外部函数,内部面数就被创建了
var = func()#创建过程在funC国数的执行过程中
#var == funcl
var(3) #这样处理后,func的局部变量a会随着var一直存在于内存之中直到var被GC回收或用户删除
定义
维基百科的严肃定义:
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
解读一下就是:
- 定义:闭包就是能够读取其外部函数变量的一个函数
- 作用1:将外层函数(这个“外层”是相对于闭包函数来说的)内的局部变量和外层函数的外部连接起来的一座桥梁
- 作用2:将外层函数的变量持久地保存在内存中
举例
再举一个例子认识闭包对于持久化局部变量的作用
mylist = [1,2,3,4,5]
def func(obj):
print('func:', obj)
def func1():
obj[0] += 1
print('func1:', obj)
return func1
if __name__ == '__main__':
var =func (mylist)
var()
#var: obj print( 'funcl: ' ,obj)
func: [1,2,3,4,5]
func1: [2,2,3,4,5]
func1: [3,2,3,4,5]
func1: [4,2,3,4,5]
[Finished in 0.1s]
什么是装饰器?
装饰器是Python中的一种语法糖,用于修饰一个函数,使其具有额外的某些功能
@func1
def func():
print('aaa')
#不影响原有的功能,还能添加新的功能
模板
一般来说写一个装饰器的模板如下
def func1(func) :
...
def func2():
...
return func
return func2
@func1
def xxx():
pass
装饰器使用过程分析
def func1(func):#外部闭包函数的参数是被装饰的对象
def func2():
print('aaabbb ')
return func()#返回了外部接收的被装饰面数的调用
return func2
#func1() takes 0 positional arguments but 1 was given
#return func#返回了对象
#return func()#返回的是一个函数调用
#func1(myprint)()#接收被装饰的函数作为参数,而且还要继续调用一次
#func2() -> print('aaabbb') -> return myprint()
@func1
def myprint():
print("你好,我是print")
if __name__ == '__main__':
myprint()#func1(myprint)()
上述代码中,func1作为装饰器修饰函数myprint(),工作步骤如下:
①调用func1函数,将myprint函数作为参数传入
②调用func1的内部函数(闭包)func2,func2打印语句并使用了传入func1的参数myprint函数,将其作为返回值返回
③结束
总结一下就是:整个过程中,我们多运行了一个闭包,这个闭包就是修饰器func1附加给myprint函数的功能
例子
1、含参数的装饰器
def arg_func(sex):
def func1(b_func) :
def func2():
if sex == 'man':
print("你不可以生娃")
if sex == 'woman':
print("你可以生娃")
return b_func()
return func2
return func1
#arg_func(sex= ' man ')()() --> func1#func1() --> func2
#func2() >('你不可以生娃') or print( '你可以生娃') b_func()
@arg_func(sex = 'man')
def man():
print("好好上班.")
@arg_func (sex = 'woman ')
def woman():
print("好好上班.")
if __name__ == '__main__':
man ()
woman()
含参的装饰器需要再为装饰器函数再套一层来接受参数
2、被修饰函数带参数
def func1(func) :
def func2(x, y):
print(x, y)
x += 5
y += 5
return func(x, y)
return func2
@func1
def mysum(a, b):
print(a + b)
if __name__ == '__main__':
mysum(1,2)
被装饰的函数带参数:只需要在最内部函数传入参数即可
常用于某些数学模块的编写
【Python语法糖】闭包和装饰器的更多相关文章
- 彻底理解Python中的闭包和装饰器(下)
上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用. 如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上) 什么是装饰器 装饰器的作用是在不修改函数定义 ...
- python中的闭包和装饰器
重新学习完了函数,是时候将其中的一些重点重新捋一捋了,本次总结的东西只有闭包和装饰器 1.闭包 闭包是python函数中的一个比较重要功能,一般闭包都是用在装饰器上,一般学完闭包就会去学习装饰器,这俩 ...
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- Python 中的闭包与装饰器
闭包(closure)是函数式编程的重要的语法结构.闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数 ...
- python 小兵(8)闭包和装饰器
闭包"是什么,以及,更重要的是,写"闭包"有什么用处. (个人理解) 1."闭包"是什么 首先给出闭包函数的必要条件: 闭包函数必须返回一个函数对象 ...
- 轻松理解python中的闭包和装饰器 (下)
在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函 ...
- 轻松理解python中的闭包和装饰器(上)
继面向对象编程之后函数式编程逐渐火起来了,在python中也同样支持函数式编程,我们平时使用的map, reduce, filter等都是函数式编程的例子.在函数式编程中,函数也作为一个变量存在,对应 ...
- python基础16_闭包_装饰器
不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...
- Python:Day16 闭包、装饰器
def outer(): x = 10 def inner(): #条件一.inner就是一个内部函数 print(x) #条件二.引用外部作用域的一个变量,因为x在函数外部的,所以是外部作用域的变量 ...
- 聊聊Python中的闭包和装饰器
1. 闭包 首先我们明确一下函数的引用,如下所示: def test1(): print("--- in test1 func----") # 调用函数 test1() # 引用函 ...
随机推荐
- Oracle19c 单节点ASM 存储模式数据库实例搭建过程
1. 建议使用OEL进行安装. 2. 可以优先在Oracle的yum上面下载必须的rpm包. 地址为: http://yum.oracle.com/repo/OracleLinux/OL7/lates ...
- Ant Design Vue照片墙a-upload
<template> <div class="clearfix"> {{ fileList }} <a-upload list-type=" ...
- 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某地公共资 ...
- 使用C#做为游戏开发的服务器语言方案
Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...
- Nmap 扫描并生成HTML报告
Nmap扫描器,支持生成扫描报告,配合转换模板,可实现自定义转换报告,非常方便. 扫描报告,可以生成如下格式,这是Nmap中自带的格式. nmap -PR -oX lyshark.xml 192.16 ...
- P8575 「DTOI-2」星之河 题解
题目链接:星之河 比较经典的偏序问题.区别于强制在线类算法:树套树之类的,对于偏序问题,我们有许多种优秀的离线算法,比如此篇要讲的 cdq 分治. 它更偏向于一种思想,它的思想使得它对偏序类问题,往往 ...
- 201871010111-刘佳华 实验二 个人项目—《D[01]背包问题》项目报告
实验二 软件工程个人项目 ========== 时间:2021-3-18 项目 内容 课程班级博客链接 课程链接 这个作业要求链接 作业要求 我的课程学习目标 1.了解软件工程过程中个人项目的开发流程 ...
- java的char类型,只有两个字节,为什么可以存储汉字?java中 char详解
我自己出了一道面试题,如下: public static void main(String[] args) { char a = '9'; char b = 9; char c = '我'; Syst ...
- 【译】介绍 MSTest Runner – CLI、Visual Studio 等
原文 | Amaury Levé, Marco Rossignoli, Jakub Jareš 翻译 | 郑子铭 我们很高兴推出 MSTest runner,这是一个用于 MSTest 测试的新型轻量 ...
- PAC主成分分析__784手写特征案例
from sklearn.neighbors import KNeighborsClassifier as KNN from sklearn.decomposition import PCA from ...