Python基础第八天——装饰器迭代器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础第八天——装饰器迭代器相关的知识,希望对你有一定的参考价值。
鸡汤:
理想啊,你就像是一朵生在寒冬腊月里还未绽放的梅花,你的生命在满天的大雪中是显得这么的渺小、这么的脆弱。仿佛一阵北风吹过就能把你吹散至尽。未曾绽放你就要枯萎吗?未曾感受过春天的温暖你就要凋谢吗?春天的阳光近在咫尺了,请你一定要咬紧牙关在这冰天雪地的严冬里坚强的挺过去,只有这样才能在春天灿烂的阳光下开出你最美丽的花朵......
——奔跑吧小白
一、拾遗
1、闭包函数
(1)定义:
在函数内部的函数,该函数引用外部作用域而不是引用全局作用域的名字,这个函数就是闭包函数
(2)格式
def 外部函数名(形参): # 接收调用时传过来的参数
def 内部函数名(*args,**kwargs):
引用外部变形参
return 内部函数名 # 内部函数可以打破定义时的层级限制,就可以在任意位置使用了。
(3)验证
验证一个函数是否为闭包函数则用“__closure__”来验证。将会得到一个元组,(如果该闭包函数引用了多个值则得到一个包含多个元素的元组。)
如果打印的结果有值,则为闭包函数,反之会得到None
(4)查看闭包函数引用的值
先用“__closure__”验证得到一个元组,通过“[ ]”取出该元组内的元素,取出元素后通过“cell_contents”查看引用的值
例:
print(f.__closure__[0].cell_contents)
(5)闭包函数的优点
<1>自带作用域
<2> 惰性延迟 (什么时候想执行,加上括号就能执行)
2、装饰器
装饰器是闭包函数应用的场景
(1)定义:
装饰器本质是任意可调用对象 (以现在知识水平,可以认为装饰器就是函数)
被装饰对象也可以是任意可调用对象 (以现在知识水平,可以认为被装饰对象也是函数)
(2)装饰器的特性:
<1>开放封闭原则:对扩展开放,对修改封闭。(修改:修改源代码和调用方式)
<2>装饰器遵循的原则:
不修改被装饰对象的源代码和调用方式
(3)格式:
def 外部函数(func):
def 内部函数(*args,**kwargs):
函数体
return 内部函数
(4)装饰器的语法:
<1>在被装饰对象的正上方单独写一行:@装饰器名
<2>可以叠加多个装饰器,
定义阶段外部函数的计算的顺序是从下至上:。
调用阶段内部函数的执行顺序是从上至下。
(4)查看函数的注释信息
通过函数名.__doc__或help(函数名)便可查看函数的注释信息
<1>help(函数名)
<2>函数名.__doc__
例:
<3>保留被装饰函数原来的注释信息:
要求:
加上装饰器的目的是为了让软件加上功能并且让用户察觉不到。但是上面的例子中,如果用户使用了查看文档命令就会发现破绽了。为了完美地骗过用户,则还需要把注释信息进行更改
修改步骤如下:
步骤一:导入wraps模块:from functools import wraps
步骤二:在装饰器的闭包函数上面加上一行代码:@wraps(被装饰函数传过来的函数名)
例:
源码:
import time import random from functools import wraps #装饰器 def timmer(func): @wraps(func) def wrapper(*args,**kwargs): ‘This is wrapper function‘ start_time = time.time() res = func(*args,**kwargs) stop_time = time.time() print(‘run time is %s‘%(stop_time - start_time)) return res return wrapper # 装饰器语法 @timmer # 被装饰对象2——无参函数 def index(): ‘This is index function‘ time.sleep(random.randrange(1,5)) print(‘welcome to index page‘) print(index.__doc__) # 通过查看注释文档可以得知,加上装饰器的index是调用的是wrapper函数
输出结果:
This is index function
<4>修改注释信息
注意:1、修改函数的注释信息可以在函数外部进行更改,也可以在函数内部进行修改,但是不建议在函数内部进行修改。
2、函数的注释信息是在定义阶段就有的
二、装饰器小练习
1、编写函数(函数执行的时间是随机的)
2、编写装饰器,为函数加上统计时间的功能
3、编写装饰器,为函数加上认证的功能
4、编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无再
5、编写下载网页内容的函数,要求的功能是:用户输入一个url地址,函数返回下载页面的结果
6、为第5题编写装饰器,实现缓存网页内容的功能:
具体操作:实现下载页面存放文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则
以上是关于Python基础第八天——装饰器迭代器的主要内容,如果未能解决你的问题,请参考以下文章