• python学习-38迭代器和生成器


    迭代器和生成器



    ---- 迭代器协议和for循环工作机制

    1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往后走,不能往前走)
    2.可迭代对象:实现了迭代器的对象(如何实现:对象内部定义一个_iter_()方法)
    3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如:for循环,sum,min,max函数等)使用迭代器协议访问对象。
    dic ={'a':1,'b':2}
    iter_d=dic.__iter__()              # 相当于for循环的迭代。 列表,字典,文件等有_iter_()方法的都可以
    print(iter_d.__next__())
        

    for循环的本质:循环所有对象,全部都是使用的迭代协议

    -for循环机制也可以用while表示

    a=[1,2,3,4,5]
    iter_a=a.__iter__()
    while True:
        try:
            print(iter_a.__next__())
        except StopAsyncIteration:
             print('迭代完毕,循环终止')
             break

    -迭代器原理

    1.

    a = [1,2,3,4,5]
    iter_a=a.__iter__()          # 切换为迭代器形式
    
    print(iter_a.__next__())
    print(iter_a.__next__())
    print(iter_a.__next__())
    print(iter_a.__next__())
    print(iter_a.__next__())

    运行结果:

    1
    2
    3
    4
    5
    
    Process finished with exit code 0

    2.用next方法

    a = [1,2,3,4,5]
    iter_a=a.__iter__()          # 切换为迭代器形式
    
    print(next(iter_a))
    print(next(iter_a))
    print(next(iter_a))
    print(next(iter_a))
    print(next(iter_a))

    运行结果是一样的

    只要遵循迭代器协议,那就是可迭代对象。

    ------ 初识生成器

    可以理解为一种数据类型。这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的_iter_方法),所以生成器就是可迭代对象。

    --生成器表现形式:

    1.生成器函数

    def test():
        yield 1
    g=test()
    print(g)      # 生成器内存地址
    print(g.__next__())

    运行结果:

    <generator object test at 0x0000023EBB890B10>1
    
    Process finished with exit code 0

    2.生成器表达式

    res=(i for i in range(11))
    print(res.__next__())
    print(res.__next__())

    运行结果:

    0
    1
    
    Process finished with exit code 0

    ps:

    三元表达式

    name='john'
    res='1' if name == 'john' else'2'  #如果name='john',返回1,不是则返回2
    print(res)

    运行结果:

    1
    
    Process finished with exit code 0
  • 相关阅读:
    001 课程定位和目标
    003 Python基本语法元素
    Oracle之用户和表空间
    基于SecureCRT的测试环境的克隆的linux/vi相关命令
    今日总结(linux和plsql)
    String小案例(**)、包装类型和普通数据类型的转换(拆装箱)
    Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)
    Servlet向JSP过渡
    控制层和ajax用法的详解
    注册页面的JSON响应方式详细分析(与前端页面交互方式之一)
  • 原文地址:https://www.cnblogs.com/liujinjing521/p/11193880.html
Copyright © 2020-2023  润新知