zoukankan      html  css  js  c++  java
  • 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 不能接受外部的值。
  • 相关阅读:
    使用PHPExcel 读取 表格数据, 发现中文全变成 FALSE??
    使用百度编辑器--ueditor,后台接收提交编辑的内容,HTML不见了, 赋值不了,赋值之后,html暴露出来了??
    PHP中使用RabiitMQ---各项参数的使用方法
    Java包装类、拆箱和装箱详解
    Eclipse中新建Java工程的三个JRE选项区别
    博客园的代码运行
    35个jQuery小技巧(代码)
    前端最全的 API 集锦
    我的博客开张了
    达梦数据库TPCC测试
  • 原文地址:https://www.cnblogs.com/stfei/p/8710062.html
Copyright © 2011-2022 走看看