• Python迭代器与生成器


    迭代器

      迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)

      实现了迭代器协议的对象(对象内部定义了一个__iter__()方法)

      python中的内部工具(如for循环,sum,min,max函数等)基于迭代器协议访问对象。

     1 #基于迭代器协议
     2 li = [1,2,3]
     3 diedai_l = li.__iter__()
     4 print(diedai_l.__next__())
     5 print(diedai_l.__next__())
     6 print(diedai_l.__next__())
     7 # print(diedai_l.__next__())  # 超出边界报错
     8 
     9 #下标
    10 print(li[0])
    11 print(li[1])
    12 print(li[2])
    13 # print(li[3]) # 超出边境报错
    14 
    15 # 用while循环模拟for循环机制
    16 diedai_l = li.__iter__()
    17 while True:
    18     try:
    19         print(diedai_l.__next__())
    20     except StopIteration:
    21         print("迭代完毕,循环终止")
    22         break
    23 
    24 # for循环访问方式
    25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法
    26 # 或者直接diedai_l=iter(l),然后依次执行diedai_l.__next__(),直到捕捉到
    27 # StopItearation终止循环
    28 # for循环所有的对象的本质都是一样的原理
    迭代器协议的原理方法

    生成器

      可以理解为一种数据类型,自动实现迭代器协议

      在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行

      表现形式

        1、生成器函数  带yield的函数(1、返回值 2、保留函数的运行状态)    

          next(t)  t.__next__  t.send(可以给上一层的yield传值)

    复制代码
    # 用生成器函数
    # yield 相当于return控制的是函数的返回值
    # x=yield的另外一个特性,接收send传过来的值,赋值给x
    def test():
        print("开始啦")
        first = yield # return 1   first = None
        print("第一次",first)
        yield 2
        print("第二次")
    t = test()
    print(test().__next__())
    res = t.__next__() # next(t)
    print(res)
    res = t.send("函数停留在first那个位置,我就是给first赋值的")
    print(res)
    
    输出结果
    开始啦
    None
    开始啦
    None
    第一次 函数停留在first那个位置,我就是给first赋值的
    2
    复制代码

        2、生成器表达式  

    print(sum(i for i in range(10000)))       # 表达式一般用for循环 (i for i in range(10000))
    
    
    # 作用 节省内存,在内部已经实现了__iter__的方法

    列表解析(生成了一个列表)

    1 print([i for i in range(10)])  # 生成一个列表

    三元表达式(没有四元表达式,可以有二元)

    1
    2
    3
    4
    5
    6
    7
    name = "alex"
    print("sb" if name == "alex" else "帅哥")
     
    # if name == "alex"为一元 "sb" 为二元 else "帅哥"为三元
     
    输出
    sb
  • 相关阅读:
    10 个迅速提升你 Git 水平的提示
    git-自动补全
    Andriod Atom x86模拟器启动报错
    Android SDK Manager 无法更新SDK
    tiny4412 解决内核编译版本号问题
    Move resources allocated using unmanaged interface to managed devm interface
    原理图学习
    解决tiny4412在win7 64位上adb无法使用失败的问题
    popcount 算法分析
    linux中断申请之request_threaded_irq
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/10547478.html
Copyright © 2020-2023  润新知