zoukankan      html  css  js  c++  java
  • 生成器 迭代器

    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()调用

  • 相关阅读:
    AMR转换MP3 linuxCentOS 版(不管任何语言可以使用shell命令在linux执行转换语句)
    MySql 入门——日期计算
    javascript深度剖析之 【 var 关键字】。
    javascript动画浅析。
    javascript之this关键字浅析。
    javascript【AMD模块加载器】浅析V3(添加CSS加载功能,重构内部流程)
    html5 canvas 自制小游戏系列之 【贪吃蛇】。
    javascript设计模式简单介绍之【工厂模式】
    javascript【AMD模块加载器】浅析
    javascript【AMD模块加载器】浅析V2(整合DOM ready)
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8452666.html
Copyright © 2011-2022 走看看