一、迭代器

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

特定:

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

day4 迭代器与生成器解析的更多相关文章

  1. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

  2. 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式

    一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数  :*args和**kwargs def index(name,age): print(na ...

  3. Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式

    迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  4. Python基础(8)_迭代器、生成器、列表解析

    一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...

  5. Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

    Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...

  6. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  7. Python可迭代对象、迭代器和生成器

    Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...

  8. Python 迭代器和列表解析

    Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...

  9. python函数(5):迭代器和生成器

    迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...

随机推荐

  1. jsonP 后台写法 及 层级树型数据递归查询

    Controller层: package com.taotao.rest.controller; import org.springframework.beans.factory.annotation ...

  2. Linux下安装python-2.7 先zlib

    2018-04-25 发布 Linux下安装python-2.7  python 1.1k 次阅读  ·  读完需要 25 分钟 1 安装依赖的库 yum -y install python-deve ...

  3. java中Mysql开发

    [IntelliJ IDEA 12使用]导入外部包 http://www.cnblogs.com/haochuang/p/3491959.html JDBC导入包即可 http://blog.163. ...

  4. python析构函数

      class Test(object): def __init__(self, name): self.name = name print('这是构造函数') def say_hi(self): p ...

  5. 面试的角度诠释Java工程师

    原文出处: locality 一.基础篇 1.面向对象的三大特性 继承.封装.多态 什么是继承?①继承是面向对象程序设计能够提高软件开发效率的重要原因之一.②继承是具有传递性的,就像现实中孙子不仅长得 ...

  6. 持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型

    持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tens ...

  7. CF851 C 暴力

    给出n个5维下的点,求点a不与其它任意的b,c重合,向量ab,ac的夹角都为钝角,这样的点个数,并打印它们. 转换二维下的求角度的函数为五维的,而且由于要求角度大于90度,在二维情况下最多有4个点,也 ...

  8. 前端开发进阶:推荐的 CSS 书写规范

    写了这么久的CSS,但大部分前端er都没有按照良好的CSS书写规范来写CSS代码,这样会影响代码的阅读体验,这里总结一个CSS书写规范.CSS书写顺序供大家参考,这些是参考了国外一些文章以及我的个人经 ...

  9. ASP .NET登录界面用户验证码代码

    //ASP .NET用户登录界面经常用到验证码代码如下 private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码 ...

  10. 【CodeForces】932 E. Team Work

    [题目]E. Team Work [题意]给定n和k,n个人中选择一个大小为x非空子集的代价是x^k,求所有非空子集的代价和%1e9+7.n<=10^9,k<=5000. [算法]斯特林反 ...