• python迭代器,生成器,装饰器,context模块


    迭代器iteration

    是访问集合元素的一种方式,只能往前不能往后
    迭代器的特点:
    1,访问者不需要关注迭代器内部结构,只需通过next()不断取下一个内容
    2,访问不能回退
    3,循环较大数据集合时,省内存
    4,不能随机访问集合中的某一个值

    iter()生成迭代器
    __next__()访问迭代器,可以迭代生成器

    生成器(genertion)

    yield
    有yield的函数叫生成器,不能直接调用
    必须要用__next__()等迭代器来访问,迭代器可以迭代一个集合,也可以迭代一个yield函数
    yield可以传出消息__next__(),也可以传入消息send()
    send()同时可以传给yield数据,也可以接受数据

    生成器只能碰到yield跳出函数,不能使用return

    def show_1():
        print("1p")
        yield
        print("3p")
        yield
    print(show_1())  #<generator object show_1 at 0x000002A9682378E0>
    show_P=show_1()  #赋值保存地址
    show_P.__next__()
    show_P.__next__()
    
    1p
    3p
    #yield传入传出数据
    def show_2():
        print("1P")
        yield 100
        print("3P")
        n=yield
        print("%dP"%n)
        yield
    show_P=show_2()
    show_P.__next__()
    show_P.__next__()
    show_P.send(10)   #传入10
    #模拟range()
    def Lrange(m=0,n,l=1):
        count=m
        while count < n:
            yield count
            count += l
    
    for i in Lrange(2,10,2):
        print(i)

     

    异步 串行

    装饰器(decorator):

    装饰器原理:
    @w1的时候会做这么几件事情:
    1,执行w1()
    2,把修饰的函数show传入w1的形参
    3,装饰器必须有返回值,返回值为了把原来的show函数封装到新的show函数
    4,装饰器必做的一件事就是再嵌套一层函数,封装以前的函数

    装饰器一:

    def w1(func):
        def outer():
            print('before')
            func()
        return outer
    @w1
    def show():
        print("show")

    装饰器二(带参数的复杂装饰器):

    写装饰器的成本比写函数高,写装饰器比较难,让外部人调用的时候,要自定义登陆界面,让他们写函数,
    然后你的装饰器要把他们定义的函数套到装饰器上,@w1(他们自己写的函数),也就是把装饰的东西封装
    到函数,装饰器调用封装的装饰函数

    def before():
        print('login!!')
    def w2(before_func):
        def accept_main(main_func):
            def outer():
                before_func()
                main_func()
                print('after')
            return outer
        return accept_main
    @w2(before)
    def show(name):
        sore=["dd","ff","gg"]

    context模块:上下文切换

    import contextlib
    @contextlib.contextmanager
    def f1():
        print("aaa")
        yield
        print("ccc")
    
    with f1():
        print("bbb")

    执行步骤:

    先执行f1,碰到yield转到with下面的语句,with结束后再返回执行f1

    Yield后面加参数可以被as后面的参数接收到

    import contextlib
    @contextlib.contextmanager
    def fl():
        print("ddd")
        yield "eee"
        print("fff")
    
    with fl() as hd:
        print(hd)

    contextlib.closing()用于调用类里面定义好的close

    class Door(object):
        def open(self):
            print('Door is opened')
    
        def close(self):
            print('Door is closed')
    
    
    with closing(Door()) as door:
        door.open()
  • 相关阅读:
    SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法
    SRM 583 Div II Level One:SwappingDigits
    SRM 583 Div Level Two:IDNumberVerification
    [置顶] gis海量资源网盘提供VIP账号无广告高速下载 (更新更多资源)
    为什么必须是final的呢?
    SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法
    【学习opencv第七篇】图像的阈值化
    quartz 2.1学习(一)
    [置顶] C++之TinyXML的使用介绍
    写个小程序来比对两个目录下的不同文件
  • 原文地址:https://www.cnblogs.com/euewrqe/p/5741122.html
Copyright © 2020-2023  润新知