python-闭包函数和装饰器
闭包函数
什么是闭包?
函数的内部函数,对外部作用域,而非全局作用域的引用。
可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。
x = 10
def f1(x): # f1()== f2
# x = 2
def f2():
print(x)
return f2 # 把f2函数当做一个返回值返回给f1.
f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
f2()
1
全局中相同名字的变量不会影响局部的变量。
两种为函数传参的方式
使用参数的形式
def f1(x):
print(x)
f1(1)
1
包给函数
def f1(x):
def f2():
print(x)
return f2
f = f1(2)
f()
2
闭包函数的应用
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得,该函数无论在何处调用,都优先使用自己外层包裹的作用域。
应用领域:延迟计算、爬虫领域。
import requests
def outter(url): #outter() == spider ;spider() == response == requests.get(url)
def spider(): # spider() == response
response = requests.get(url)
print(response.status_code)
return response
return spider
baidu = outter('https://www.baidu.com') # baidu == spider
baidu()
200
装饰器
无参装饰器
什么是装饰器
是为被装饰器对象添加额外功能。装饰器本质上也是一个函数,只不过这个函数具有装饰的功能。
为什么要用装饰器
当我们想新增功能,但又不想修改原方法的使用方法,这个时候就可以使用装饰器。
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
怎么用装饰器
import time
def time_sleep():
time.sleep(1)
print('from time_sleep')
def deco(func): # deco()== wrapper ; func == time_sleep
def wrapper():
start = time.time()
res = func()
end = time.time()
print(end - start)
return res
return wrapper
time_sleep = deco(time_sleep) #func == time_sleep ,括号里的time_sleep才是调用上面函数time_sleep,而前面的time_sleep只是我们自定义的一个接收变量值的变量名。
time_sleep() # time_sleep() == wrapper()
from time_sleep
1.000948429107666
完善装饰器
返回值的
import time
def time_sleep():
time.sleep(1)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep() # wrapper()
print(res)
1.0001847743988037
longzeluola
参数的
import time
def time_sleep(x): #给定义了一个形参
time.sleep(x)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep(3) # wrapper()
print(res)
3.00034236907959
longzeluola
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
语法糖
import time
@deco # @deco == time_sleep == deco(time_sleep)
def time_sleep(x):
time.sleep(x)
return 'longzeluola'
time_sleep(5)
5.000701427459717
python-闭包函数和装饰器的更多相关文章
- python 闭包函数与装饰器
1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...
- python闭包函数与装饰器
目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...
- python闭包函数、装饰器
闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...
- python闭包函数及装饰器简介
目录: 闭包函数简介 闭包函数的实际应用 装饰器简介 装饰器初期-完整版 装饰器语法糖 闭包函数简介 1.定义在函数内部的函数(函数的嵌套) 2.内部函数运用外部函数局部名称空间中的变量名 注:函数名 ...
- 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 ...
随机推荐
- Luogu P3166 [CQOI2014]数三角形 组合数学
好题鸭.. 不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量. 具体求法是求出水平共线数量与竖直共线数量和斜线共线数量. 用排列组合的知识可知为水平和竖直的为$C_n^3$与$C_m^ ...
- 099 Recover Binary Search Tree 复原二叉搜索树
二叉排序树中有两个节点被交换了,要求把树恢复成二叉排序树. 详见:https://leetcode.com/problems/recover-binary-search-tree/submission ...
- PHP正则表达式 - 附录(常用正则表达式)
常用正则表达式附录I 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1- ...
- ASPX1
表单提交 <!--表单:收集用户的数据.---> <form method="post" action="AddInfo.ashx"> ...
- MySQL 查看表大小
当遇到数据库占用空间很大的情况下,可以用以下语句查找大数据量的表 SELECT TABLE_NAME ,),) 'DATA_SIZE(M)' ,),) 'INDEX_SIZE(M)' ,AVG_ROW ...
- ECSHOP 商品增加新字段的方法
在ecshop二次开发工作中,经常碰到一些ECSHOP高级使用者问我,如何给商品增加一个新字段,来录入一些新的内容. 下面我们结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品 ...
- android配置android studio not found target android-*.的问题
列:not found target android-25, 打开下载android SDK的工具栏,找到android-25版本下载到你本地的sdk路径下就OK了.
- db2数据库备份
一.离线备份 db2 list database directory -----查看有哪些数据库,确定需要备份哪个数据库 db2 disconnect current -----断开以数据库 ...
- 通用的MIME类型:application/octet-stream
按照内容类型排列的 Mime 类型列表 类型/子类型 扩展名 application/envoy evy application/fractals fif application/futurespla ...
- [dp][uestc oj][最长上升子序列] LIS N - 导弹拦截
N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...