当前位置 博文首页 > m0_51723227的博客:迭代器,生成器

    m0_51723227的博客:迭代器,生成器

    作者:[db:作者] 时间:2021-08-09 10:03

    迭代器,生成器

    迭代器:具有迭代对象容器,一个可以记住遍历的位置对象

    • 两个基本的方法:iter()next()

    生成器:使用了 yield函数被称为生成器(generator)

    • 两个基本的方法:yilednext()

    迭代器:

    字符串,元组,列表都可以创建迭代器

    a = [1, 2, 3]
    iteration = iter(a)         #创建迭代器
    print(next(iteration))      #开始输出迭代器的下一个元素
    print(next(iteration))				
    print(next(iteration))
    

    结果:

    1
    2
    3
    
    

    我们再试试多出列表元素的next函数

    a = [1, 2, 3]
    iteration = iter(a)         #创建迭代器
    print(next(iteration))      #开始输出迭代器的下一个元素
    print(next(iteration))				
    print(next(iteration))
    print(next(iteration))
    

    结果:

    1
    2
    3
    Traceback (most recent call last):
      File "C:/Users/魑魅魍魉/Desktop/飞机大战/main.py", line 6, in <module>
        print(next(iteration))
    StopIteration
    

    发现报错:StopIteration,我们相信可以用什么方法解决报错?

    那就是异常处理

    例子:

    try:
        a = [1, 2, 3]
        iteration = iter(a)         #创建迭代器
        print(next(iteration))      #开始输出迭代器的下一个元素
        print(next(iteration))				
        print(next(iteration))
        print(next(iteration))
    except StopIteration:
        pass
    

    结果:

    1
    2
    3
    
    

    我们还可以使用迭代器模拟 for i in iteration循环

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    a = iter(a)
    try:
        while True:
            print(next(a))
    except StopIteration:
        pass    
    

    迭代器和可迭代对象从某种层面说是一个东西,只是迭代器(**iter(可迭代对象)**后)可以用next实现一步一步的遍历内容.而可以使用next()的方法就是一个迭代器

    生成器:

    本质上还是迭代器的一种

    特点:

    • 类似于函数逻辑
    • 支持"显"式的暂停恢复
    • 隐式的支持迭代协议
    def func():
        print("==========1==========")
        yield 111111111111
        print("==========2==========")
        yield 222222222222
        print("==========3==========")
        yield 333333333333
        print("==========4==========")
      
    #   这就是类似于函数逻辑
    
    
    a =func()          #必须有这一步,类似实例化
    print(next(a))
    

    结果:

    ==========1==========
    111111111111
    

    如果执行两次呢?

    print(next(a))
    print(next(a))
    

    结果:

    ==========1==========
    111111111111
    ==========2==========
    222222222222
    

    这就是特点2,显式的暂停(yield)和恢复(next)

    暂停在yield

    那么何为隐式的迭代协议呢???例:

    def func():
        print("==========1==========")
        yield 111111111111
        print("==========2==========")
        yield 222222222222
        print("==========3==========")
        yield 333333333333
        print("==========4==========")
    
    
    a = func()  # 必须有这一步,类似实例化
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))
    
    

    结果:

    ==========1==========
    111111111111
    ==========2==========
    222222222222
    ==========3==========
    333333333333
    ==========4==========
    Traceback (most recent call last):
      File "C:/Users/魑魅魍魉/Desktop/飞机大战/main.py", line 15, in <module>
        print(next(a))
    StopIteration
    

    这就是特点三,依然像迭代器一样顺序执行,当超出范围没有暂停就报错

    生成器可以省内存,需要多少就执行多少,而不会像列表一样,需要提前写好一大串!

    cs
    下一篇:没有了