zoukankan      html  css  js  c++  java
  • day4 迭代器与生成器解析

    一、迭代器

        迭代器是访问集合元素的一种方式。其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态。迭代器是访问集合元素的一种方式。并且,迭代器只能前进,不能后退迭代器对象从集合的第一个元素开始访问直到所有的元素被访问完结束

        特定:

        (1).访问者不需要关心迭代器内部的文件,仅需通过next()方法不断去取下一个内容;

      (2).不能随机访问集合中的某个值,只能从头到尾依次访问;

      (3).访问到一半时不能往回退

      (4).便于循环比较大的数据集合,节省内存生成一个迭代器。

         iter()用来声明迭代器,示例如下:

        names = iter(["alex","sb",11,22,"gengchangxue"])
      print(names.__next__())
      print(names.__next__())
      print(names.__next__())
      print(names.__next__())
      print(names.__next__())
      print(names.__next__())

        运行结果如下:

        alex
      sb
      11
      22
      gengchangxue
      Traceback (most recent call last):
        File "/home/zhuzhu/day4/iterator.py", line 7, in <module>
          print(names.__next__())
      StopIteration

        从上面结果可以看出,迭代器是使用__next__()方法来遍历集合中的每一个元素,当超过列表的长度的时候会出现错误,stoplteration(停止迭代)。上面集合有5个元素,我们去了6次,结果就报错。迭代器只能从元素的第一个值开始遍历,直到所有的元素遍历完为止。中间过程不能后退,也不能取中间某个特定位置的值。

        迭代器中只有一个__next__()方法,用来去元素。

        二、生成器generator

        定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器

        其实,生成器(generator)函数中包含yield,yield的作用与return作用类似,只是yield结束本地循环之后,记录程序运行的状态,能够保持在当前状态,当用户再一次调用的时候,会从这里开始,重新进行循环,并且,yield能够返回一个值给函数,并且yield与send结合还能够接收返回值。

        def cash_money(amount):
        while amount > 0:
          amount -= 100
          yield 100
          print("败家子,又来取钱了!...")


      atm = cash_money(600)

        上面我们写了一个函数,并且调用这个函数,但是print()语句并没有执行。下面来看看atm的类型:

        print(type(atm))

        运行如下:

        <class 'generator'>

        可以看出,atm是一个生成器,生成器的调用要使用__next__()方法。实例如下:

        def cash_money(amount):
        while amount > 0:
          amount -= 100
          yield 100
          print("败家子,又来取钱了!...")


      atm = cash_money(600)
      print(atm.__next__())
      print(atm.__next__())

        生成器的作用,我们之前学的程序都是串行的,从上到下进行执行,如果中间某个过程没有执行,那么会一直等待,但是我们使用yield就能够保持记忆功能。让程序其做其他的事情,作用之后在回来继续做这件事情,比如我们去做一个大保健,做完之后重新回来取钱。

        def cash_money(amount):
        while amount > 0:
          amount -= 100
          yield 100
          print("败家子,又来取钱了!...")


        atm = cash_money(600)
        print(atm.__next__())
        print(atm.__next__())
        print("叫个大保健")
        print(atm.__next__())

        运行结果如下:

        100
      败家子,又来取钱了!...
      100
      叫个大保健
      败家子,又来取钱了!...
      100

        yield就是保存函数的状态,可以让我们先去完成其他事情,然后继续执行。生成器在某些时候很有用,比如我们想保存之前用户的状态,以便用户下次登录能够知道之前的信息。比如银行的系统,用户取钱之后肯定要进行减去金额,并且保存之前操作的状态。

  • 相关阅读:
    [LeetCode] Reverse Linked List II 解题报告
    [LeetCode] Search for a Range 解题报告
    Git教程
    今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
    套接字的域和地址族
    套接口和I/O通信
    2010年第82届奥斯卡金像奖获奖影片名单
    恩信ERP7.10安装、定制和二次开发 (2)
    从 Google 代码库找到的好东西 [转]
    更自然的人机交互——2010微软技术节现场速递
  • 原文地址:https://www.cnblogs.com/gengcx/p/6880530.html
Copyright © 2011-2022 走看看