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

原文地址:https://www.cnblogs.com/gengcx/p/6880530.html