• python--自定义迭代器的学习


    #如何得到自定义的迭代器:
    #在函数内一旦存在yield关键字,调用函数并不会执行函数代码体代码
    #会返回一个生成器对象,生成器即自定义的迭代器
    # def func():
    # print("第一次")
    # yield 1
    # print("第二次")
    # yield 2
    # print("第三次")
    # yield 3
    # g=func()
    # print(g)
    #<generator object func at 0x10676fa50>
    # #会触发函数体代码的运行,然后遇到yield 停下来,将yield 后的值当作本次调用的结果返回
    # res=g.__next__()
    # print(res)
    # res1=g.__next__()
    # print(res1)
    # res2=g.__next__()
    # print(res2)
    #g.__iter__()

    """补充"""
    # l="123"
    # len(l)--->l.__len__()
    # iter(l)--->l.__iter__()
    # next(l)--->l.__next__()

    """应用案例"""
    #能产生无穷个值的迭代器
    # def my_range(start,stop,step):
    # print("start******")
    # while start<stop:
    # yield start
    # start+=step
    # print("end******")
    #
    # g=my_range(1,7,2)
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))

    """优化"""
    # def my_range(start,stop,step):
    # print("start******")
    # while start<stop:
    # yield start
    # start+=step
    # print("end******")

    # for i in range(1,7,2):
    # print(i)


    #有了yield关键字,我们就有了一种自定义迭代器的实现方式。
    #yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值

    #一、叠加多个装饰器的加载,运行分析

    def deco1(func1):
        def wrapper(*args,**kwargs):#fun3=Wrapper2的内存地址
            print("正在运行===》deco1.rapper1")
            res2=func1(*args,**kwargs)
            return res2
        return wrapper
    
    def deco2(func2):
        def wrapper2(*args,**kwargs):#fun3=Wrapper3的内存地址
            print("正在运行===》deco2.rapper2")
            print()
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2
    
    def deco3(x):
        def outter3(func3):
            def wrapper3(*args,**kwargs):#fun3=被装饰对象index函数的内存地址
                print("正在运行===》deco3.rapper3")
                print()
                res3=func3(*args,**kwargs)
                return res3
            return wrapper3
        return outter3
    
    #加载顺序自下往上
    @deco1 ##index=deco1(wrapper2的内存地址)--》index=wrapper1的内存地址
    @deco2 #index=deco2(wrapper3的内存地址)--》index=wrapper2的内存地址
    @deco3(111) #-->@outter3-->index=outter3(index)===>index=wrapper3的内存地址
    
    def index(x,y):
        print("from index %s,%s" %(x,y))
    
    print(index)
    
    #执行顺序:执行顺序是自上而下的,即wrapper1-->wrapper2-->wrapper3
    index(1,2)
    /usr/local/bin/python3.8 /Users/futantan/PycharmProjects/S14/函数的学习/自定义迭代器.py
    <function deco1.<locals>.wrapper at 0x108f43280>
    正在运行===》deco1.rapper1
    正在运行===》deco2.rapper2
    
    正在运行===》deco3.rapper3
    
    from index 1,2
    
    Process finished with exit code 0
  • 相关阅读:
    手把手教你安装系统-只需一个U盘
    Linux系统优化05-Centos修改主机名
    Linux系统优化06-Centos远程登录与连接(SSH配置)
    数据库ACID
    Java中的String,StringBuilder,StringBuffer三者的区别
    zookeeper的选举机制
    mysql的数据类型
    常用类(四)
    常用类(三)
    常用类(二)
  • 原文地址:https://www.cnblogs.com/clairedandan/p/14146639.html
Copyright © 2020-2023  润新知