博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day4 迭代器与生成器解析
阅读量:5843 次
发布时间:2019-06-18

本文共 2146 字,大约阅读时间需要 7 分钟。

一、迭代器

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

    特定:

    (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

你可能感兴趣的文章
1. Two Sum
查看>>
es6的generators(生成器)
查看>>
阿里数据中台七年演化史——行在口述干货
查看>>
linux常用命令
查看>>
10.Java异常问题
查看>>
希迪智驾自动驾驶落地新思路:V2X + L4级自动驾驶货车,“落地”才是要务
查看>>
利用Git Webhooks实现jekyll博客自动化部署
查看>>
Fescar undoExecutor介绍
查看>>
Linux命令操作大全
查看>>
从周五开始香港主机特别慢,香港主机用户有同感吗?
查看>>
VAVA宠物机器人来了,可实现远程互动以及自动投食
查看>>
使用VMware安装CentOS7详请
查看>>
Ember.js 3.9.0-beta.3 发布,JavaScript Web 应用开发框架
查看>>
python标准库00 学习准备
查看>>
4.2. PHP crypt()
查看>>
Winform开发框架之附件管理应用
查看>>
软链接文件和硬链接文件
查看>>
Spring Cloud Config服务器
查看>>
commonservice-config配置服务搭建
查看>>
连接池的意义及阿里Druid
查看>>