• python3 速查参考- python基础 7 -> 函数编程之 装饰器、生成器


    装饰器


    1.速查笔记

    #-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成  
            @staticmethod  
            def smeth(x): print(x)  
        # 等同于:  
            def smeth(x): print(x)  
            smeth = staticmethod(smeth)  

    定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

    经典示例:

    # -*-  coding:utf-8 -*-
    import time
    def timer(func): #把被装饰的函数ceshi的内存地址传给了func
        def deco(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)
            stop_time = time.time()
            print('测试函数运行时间',(stop_time-start_time))
        return deco #返回deco的内存地址
    
    @timer
    def ceshi(a):
        time.sleep(3)
        print('测试%s'%a)
    ceshi('装饰器')

    2. 原则:①不能修改被装饰函数的源代码;②不能修改被装饰函数的调用方式

    3.实现装饰器的技能储备

    ① 函数本身即是变量

    ② 高阶函数,把一个函数名当做实参穿给另一个函数

    ③ 嵌套函数

    参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

    生成器


    1.速查笔记

    #-- 生成器函数:yield VS return  
        def gensquare(N):  
            for i in range(N):  
                yield i** 2                 # 状态挂起 可以恢复到此时的状态  
        for i in gensquare(5):              # 使用方法  
            print(i, end = ' ')             # [0, 1, 4, 9, 16]  
        x = gensquare(2)                    # x是一个生成对象  
        next(x)                             # 等同于x.__next__() 返回0  
        next(x)                             # 等同于x.__next__() 返回1  
        next(x)                             # 等同于x.__next__() 抛出异常StopIteration  
          
    #-- 生成器表达式:小括号进行列表解析  
        G = (x ** 2 for x in range(3))      # 使用小括号可以创建所需结果的生成器generator object  
        next(G), next(G), next(G)           # 和上述中的生成器函数的返回值一致  
        #(1)生成器(生成器函数/生成器表达式)是单个迭代对象  
        G = (x ** 2 for x in range(4))  
        I1 = iter(G)                        # 这里实际上iter(G) = G  
        next(I1)                            # 输出0  
        next(G)                             # 输出1  
        next(I1)                            # 输出4  
        #(2)生成器不保留迭代后的结果  
        gen = (i for i in range(4))  
    in gen                            # 返回True  
    in gen                            # 返回True  
    in gen                            # 返回False,其实检测2的时候,1已经就不在生成器中了,即1已经被迭代过了,同理2、3也不在了  

    2. 生成器表达式

    局限性:只能适合简单的算法

    示例: 

    test = (x**2 for x in range(1,10))
    print(next(test))
    print(test.__next__())

    3. 生成器函数 yield

    斐波那契函数的打印示例:

    def fib(max):
        a,b,n = 1,1,0
        while n<max:
            yield b
            a,b = b,a+b
            n+=1
        return b
    test = fib(10)
    print(test.__next__())
    print(next(test))
    for i in test:
        print(i)
  • 相关阅读:
    C# MVC 自定义ActionResult实现EXCEL下载
    如何让WEBAPI 能够进行跨越访问
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    sC#进阶系列——WebApi 接口参数不再困惑:传参详解
    mybatis.net insert 返回主键
    [转]MySQL中timestamp数据类型的特点
    [转]java List和数组相互转换方法
    [转]Mybatis foreach 批量操作
    [转]让iframe自适应高度-真正解决
    [转]decorators.xml的用法
  • 原文地址:https://www.cnblogs.com/wuzhiming/p/8988427.html
Copyright © 2020-2023  润新知