• Python学习(七) —— 装饰器、迭代器、生成器


    一、装饰器(decorator)

      1.装饰器的本质是闭包函数,作用:在不改变函数的调用方式的情况下,给函数的前后添加新的功能

    #装饰器的固定结构
    def warpper(func):  #定义装饰器函数
        def inner(*args,**kwargs):  #定义内部函数
            # 函数执行前的代码  #添加新功能
            ret = func(*args,**kwargs)  #执行被装饰的函数
            # 函数执行后的代码  #添加新功能
            return ret  #返回被装饰的函数
        return inner  #返回内部函数名
    
    @wrapper  #==> func1 = warpper(func1)  #执行装饰器函数并返回内部函数名给func1
    def func1():
        pass
    
    func1()  #执行内部函数

       2.开放封闭原则:1.对扩展是开放的

                 2.对修改是封闭的

                 装饰器完美的遵循了这个开放封闭原则  

      3.多个装饰器装饰同一个函数  

    def wrapper1(func):
        def inner(*args,**kwargs):
            print(1)
            func(*args,**kwargs)
            print(2)
        return inner
    
    def wrapper2(func):
        def inner(*args,**kwargs):
            print(3)
            func(*args,**kwargs)
            print(4)
        return inner
    
    @wrapper1
    @wrapper2
    def f1():
        print(123)

    二、迭代器(iterator)

      可迭代的:iterable,必须含有__iter__()方法  #可迭代协议

      迭代器:iterator,必须含有__iter__()、__next__()方法  #包含__next__方法的可迭代对象就是迭代器

      迭代器是可迭代的一部分

      获得迭代器:可迭代的调用__iter__()方法

      使用迭代器:迭代器调用__next__()方法

      迭代器的特点:惰性运算、从前到后一次去取值,过程不可逆、节省内存空间

    a = 'abcde'  #a是可迭代对象
    b = a.__iter__()  #获得迭代器
    print(b.__next__())  #a
    print(b.__next__())  #b

       判断一个变量是不是迭代器或者可迭代的:

        1.判断这个变量是否含有__iter__()、__next__()方法

          print('__iter__' in dir(变量))

          print('__next__'  in dir(变量))

        2.判断这个变量是否是迭代器或者可迭代的

          from collections import Iterable

          print(isinstance(变量,Iterable)

          from collections import Iterator

          print(isinstance(变量,Iterator))

    print('__iter__' in dir(range(20)))  #True #range(20)是可迭代的
    print('__next__' in dir(range(20)))  #False  #range(20)不是迭代器
    
    range_iter = range(20).__iter__()  #获得迭代器
    
    from collections import Iterable
    print(isinstance(range_iter,Iterable)) #True
    from collections import Iterator
    print(isinstance(range_iter,Iterator))  #True
    #用while循环模拟for循环
    li = [1,2,3,4]
    li_iter = li.__iter__()  #生成迭代器
    while True:
        try:
            print(li_iter.__next__())  #使用迭代器
        except StopIteration:  #遇到异常break
            break

    三、生成器(generator)

      生成器的本质是迭代器,因此生成器的所有好处都和迭代器一样

      生成器的实现有两种方法:1.生成器函数:常规定义函数,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,下次在这个地方执行

                  2.生成器表达式

    def generator_func():  #定义一个函数
        print('a')
        yield 1       
        print('b')
        yield 2
    
    g = generator_func()  #返回一个生成器,不执行函数的任何内容
    print('abc')  #abc
    print(next(g))  #a
    1
    print(next(g))  #a
    2
  • 相关阅读:
    linux常用命令
    10.8统计英文词频
    9月10号作业
    华氏温度与摄氏温度转换
    小故事
    Java的工厂模式(三)
    Javascript实现图片翻转
    Java的工厂模式(二)
    Java的工厂模式(一)
    Java新建线程的两种方式
  • 原文地址:https://www.cnblogs.com/Coufusion/p/7778686.html
Copyright © 2020-2023  润新知