• Python迭代器和生成器


    迭代器(iterator)

    迭代器作为容器可以保护多个数据,迭代器的数据来源:1)将其他序列转换成迭代器 2)生成器
    1)将其他序列转换成迭代器

    iter1 = iter('abc')
    print(iter1, type(iter1))
    
    iter2 = iter([12, 30, 90])
    print(type(iter2))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    获取迭代器中的元素
    不管用哪种方式去获取了元素的值,那么这个元素在迭代器中就不存在了
    1)获取单个元素:next(迭代器)、迭代器.next() -> 获取迭代器中的第一个元素

    iter3 = iter('hello')
    print(next(iter3))
    print(next(iter3))
    print(next(iter3))
    print(iter3.__next__())
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2)遍历:
    for 变量 in 迭代器:
    pass

    iter4 = iter('world')
    for x in iter4:
        print(x)
    
    • 1
    • 2
    • 3

    生成器(generator)

    什么是生成器

    1)生成器是迭代器中的一种
    2)调用一个带有yield关键字的函数就可以得到一个生成器
    如果一个函数中有yield关键字:
    a.调用函数不会执行函数体
    b.函数调用表达式的值不是函数的返回值,而是一个生成器对象

    # 1.怎么去创建一个生成器
    def func1():
        print('=======')
        if False:
            yield
        return 100
    
    
    gen1 = func1()    # 这儿的gen1就是一个生成器对象
    print('外部:', gen1)  # 外部: 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.生成器产生数据的原理

    1)一个生成器能够产生多少数据,就看执行完生成器对应的函数体会遇到几次yield;yield后面的值就是生成器能够产生的数据
    2)每次获取生成器中的元素的时候,都是先去执行函数体,直到遇到yield,并且将yield后面的值作为获取元素的结果;并且保留结束的位置,下次获取下一个值的时候,从上次结束的位置接着执行函数体,直到遇到yield,如果从开始执行到函数结束都没有遇到yield,就会报StopIteration错误

    def func2():
        print('+++++')
        yield 1
        print('-----')
        yield 100     # yield 后边可以跟数据;同一个函数可以有多个yield
    
    
    gen2 = func2()
    print(gen2)
    
    print('函数外部:', next(gen2))
    print('函数外部:', next(gen2))
    # print('函数外部:', next(gen2))   # StopIteration
     写一个可以产生学号的生成器, 生成的时候可以自定制学号数字位的宽度和学号的开头
    study_id_creater('py',5) -> 依次产生: 'py00001', 'py00002', 'py00003',....
       study_id_creater('test',3) -> 依次产生: 'test001', 'test002', 'test003',...
    ```python
    def study_id_creater(str1, n):
        for i in range(1, 6):
    
            print(str1 + str(i).zfill(n))
    
    
    study_id_creater('py', 5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    def study_id_creater(str1='abc', num=5):
        for i in range(1, num+1):
            yield str1 + str(i).zfill(7 - len(str1))
    
    
    gen1 = study_id_creater()
    print(next(gen1))
    print(next(gen1))
    print(next(gen1))
    print(next(gen1))
    print(next(gen1))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    search_everything文件搜索引擎的测试用例
    【学习笔记】「JOI Open 2022」长颈鹿
    lvgl显示中文和自定义图标
    全国建委建筑八大员报名考试大致流程(考试题库)
    AUTOSAR汽车电子嵌入式编程精讲300篇-基于 CAN 总线的车辆数据采集与远程监控系统研发(中)
    基于SpringBoot框架的古风乐曲网站的设计与实现毕业设计源码271611
    百日筑基第十八天-一头扎进消息队列1
    Fastjson历史版本记录
    【leetcode】最小差值 I c++
    找搭建app的朋友,要求什么都会。
  • 原文地址:https://blog.csdn.net/HuangXiongjin/article/details/127766578