• python's thirteenth day for me 迭代器 生成器


    迭代器:

      for 循环可以循环的就是可迭代对象。

        可迭代对象:str, list, tuple, dict, set, range。

          迭代器:f1文件句柄。

    可迭代协议:

         可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

    可迭代对象:

      内部含有__iter__方法的对象就叫做可迭代对象。

    如何判断:两种方式:

    s = 'guqingqiu'
    # print(dir(s))
    print('__iter__' in dir(s))   # True
    from collections import Iterable
    print(isinstance(s,Iterable))   # True

    将可迭代对象转化成迭代器:     可迭代对象.__iter__() ---->迭代器

    迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

    s = 'guqingqiu'
    l_s = s.__iter__()     #将 s 转化成迭代器
    print('__iter__' in dir(l_s))    # True
    print('__next__' in dir(s))      # False
    print('__next__' in dir(l_s))    # True

    迭代器的好处:

        1,节省内存空间。

        2,满足惰性机制。

        3,不能反复取值,不可逆。

    l = [1,2,3,4,5]
    for i in l:
        print(i)
    # 1,将可迭代对象转化成迭代器。
    # 2,内部使用__next__方法取值。
    # 3,运用了异常处理去处理报错。

    while 循环 模仿 for 循环内部机制:

    l = [1,2,3,4,5]
    l_obj = l.__iter__()     #将列表转化成迭代器
    while True:
        try:
            i = l_obj.__next__()   #__next__用法:惰性打印迭代器里的值
            print(i)
        except StopIteration:   #  不写默认是:Exception(可忽略所有报错),忽略StopIteration错误
            break     # 跳出循环

    生成器:

    def func():
        print(111)
        print(222)
        yield 333
        print(444)
        yield 555
    g = func()
    g.__next__()  #将生成器内的值第一个 yield 以上的打印
    g.__next__()  # 将生成器 第一个 yield下 第二个 yield 以上的打印出来。
    
    # 111
    # 222
    # 444

        1,函数中只要有 yield 那她就不是一个函数,而是一个生成器。

        2,g 称作生成器对象。

      send 用法:

    def generator():
        print(123)
        content = yield 1
        print('yield 1:',content)  # yield 1: hello
        print(456)
        yield  2
    g = generator()
    g.__next__()    # 123
    g.send('hello')   # 456    #send 的效果和next一样。
    
    # send 获取下一个值得效果和 __next__基本一致。
    # 只是在获取下一个值的时候,给上一个 yield 的位置传递一个数据。
    # 使用 send 的注意事项:
            # 第一次使用生成器的时候 使用 __next__获取下一个值。
            # 最后一个 yield 不能接受外部的值。
  • 相关阅读:
    解决.net中access数据库连接相对路径问题
    .NET网站实例之文件上传与管理
    .NET网站实例之用户登录实例
    解决DataList控件无缝滚动图片
    【转帖】随机彩色验证码,点击刷新效果
    .NET实例之购物车系统
    .NET网站实例之投票系统
    网络模拟与抓包
    iOS开发中的SQLite知识总结
    关于ARC的一些说法
  • 原文地址:https://www.cnblogs.com/stfei/p/8710062.html
Copyright © 2020-2023  润新知