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
View Code

 

<4>修改注释信息

注意:1、修改函数的注释信息可以在函数外部进行更改,也可以在函数内部进行修改,但是不建议在函数内部进行修改。

    2、函数的注释信息是在定义阶段就有的

技术分享

 

二、装饰器小练习

1、编写函数(函数执行的时间是随机的)

 

2、编写装饰器,为函数加上统计时间的功能

3、编写装饰器,为函数加上认证的功能

4、编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无再

5、编写下载网页内容的函数,要求的功能是:用户输入一个url地址,函数返回下载页面的结果

6、为第5题编写装饰器,实现缓存网页内容的功能:

  具体操作:实现下载页面存放文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则



以上是关于Python基础第八天——装饰器迭代器的主要内容,如果未能解决你的问题,请参考以下文章

Day4 - Python基础4 迭代器装饰器软件开发规范

Python基础day-8[装饰器补充,迭代器(未完)]

python第十八天(装饰器)

Python之第十八天的努力--装饰器初识

Step4 - Python基础4 迭代器装饰器软件开发规范

Python基础 | 深浅拷贝生成器迭代器以及装饰器详解