一、迭代器

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

特定:

(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. 洛谷P1937 [USACO10MAR]仓配置Barn Allocation

    题目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from t ...

  2. Android缓存

    一个利用内存缓存和磁盘缓存图片的例子 public class BitmapCache { public static final String TAG = "debug"; pr ...

  3. 【题解】【LibreOJ Beta Round #5】游戏 LOJ 531 基环树 博弈论

    Prelude 题目链接:萌萌哒传送门♪(^∇^*) Subtask 1 & 2 这是什么鬼题面... 首先要看出,这就是一个基环树博弈. 具体题意:给出一个基环内向树,一个棋子初始在\(1\ ...

  4. struts标签错误:Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"

    今天使用eclipse开发ssh,出现Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/co ...

  5. 分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客

    前言 由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react.数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的.re ...

  6. Spark Core 资源调度与任务调度(standalone client 流程描述)

    Spark Core 资源调度与任务调度(standalone client 流程描述) Spark集群启动:      集群启动后,Worker会向Master汇报资源情况(实际上将Worker的资 ...

  7. JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  8. Redis-1-Redis的安装

    Redis 什么是Redis? redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 安装Redis: windows下如何安装? 官方网址:ht ...

  9. js写弹窗

    1.先来看弹窗的模样 点击“弹出窗口”后会弹出下面窗口 2.下面是实现弹出窗口的代码,其中引入的jquery一般自己有,没有的话可以从网上下载.tanchuang.js和tanchuang.css写在 ...

  10. 面试整理(1):原生ajax

    接到电话面试,有一些送分题答的不好,在这里整理一下 问题:原生ajax的工作流程是怎么样的? 老用封装好的工具,原生的ajax其实并不熟悉,今天复习一下.主要参考http://www.w3school ...