• 生成器 迭代器


    1.生成器
    特点:只负责生产,只能往前走,不能回退,生产结束时,若在生产,就报错StopIteration

    列表生成式:a = [i for i in range(10)] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    生成器:一边循环一边计算的机制称为生成器 ,通过next()调用下一个元素

      b = (i for i in range(10)) = <generator object <genexpr> at 0x000001A2AACF3048>

      next(b)   b.__next__()   b.send('ok')   for i in b:   while True     这三种方法生产完成后,只有for不会报错StopIteration

                                                               print(i)        next(b)

    1.1.生成器的2种创建方式:

     1   b = (i for i in range(10))
     2 
     3   def fib(max):        
     4     n,a,b=0,0,1
     5     while n < max:
     6         yield b
     7         a,b=b,a+b
     8         n += 1
     9 
    10   def range(n):
    11         count = 0
    12     while count < n:
    13         yield count
    14         return 'ss'
    15         count+=1
    16 
    17   
    18   def fib(max):
    19     n,a,b=0,0,1
    20     while n <max:
    21         sign = yield b
    22         print(sign)
    23         if sign == 'stop':
    24             break
    25         a,b=b,a+b
    26         n += 1
    27    b=fib(13)
    28    next(b)
    29    b.__next__()
    30    b.send('ok')
    31    b.send('stop')

    总结:yield
          1.函数有了yield之后,函数名加()就得到了一个生成器
          2.函数有了yield之后,return在生成器里,代表生成器的终止直接报错
          3.函数有了yield之后,函数的每个运行过程都可以拿到,处理大文件比较适合

    return与yield的区别:
         1.return 返回数据 并终止function
         2.yield 返回数据 并冻结当前的执行过程,要想启动,就得next()。next()唤醒后,继续执行,直到遇到下一个yield

    ----------------------------------------------------

    2.迭代器

    2.1.可迭代对象(Iterable): list tuple dict set str
                                             generator yield的generator function

          判断是否是可迭代对象:---->可直接作用于for循环的对象是可迭代对象
          >>> from collections import Iterable
          >>> isinstance([1,2,3],Iterable)
         True

    2.2.迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

         判断是否是迭代器:----->生成器是迭代器的一种。
         >>> from collections import Iterator
         >>> isinstance([1,2,3],Iterator)
         False
         >>> isinstance((i for i in range(10)),Iterator)
         True

    2.3.可迭代对象list tuple dict set str 使用iter()函数可以变成迭代器
        >>> from collections import Iterator
        >>> isinstance([1,2,3],Iterator)
        False
        >>> isinstance(iter([1,2,3]),Iterator)
        True

    2.4.迭代器对象表示一个数据流,不知道什么时候截止,不能使用len(),直到没有数据抛出StopIteration
          数据流可以看作是一个有序序列,不知道长度,只能通过next()调用

  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8452666.html
Copyright © 2020-2023  润新知