一、生成器

1. 生成器的定义

  • 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间

2. 生成器的创建方式

  • 第一种只要把一个列表生成式的 [ ] 改成 ( )
ret = (n + 1 for n in range(0,10))
# 返回值是生成了一个生成器对象<genexpr>储存在16进制的地址中<generator object <genexpr> at 0x7f909f4be150>
# 如果调用次数超过生成器内值的总数量,会报错
  • 第二种方法使用yield创建生成器
  • 只要在一个函数中存在至少一个yield关键字,该函数就不是普通函数,是一个生成器
  • 返回一个对象,需要使用变量接收
  • 生成器可以用for进行遍历得到所有的值
# 定义一个斐波那契数列的生成器
def creatnum():print('-----start------')a,b = 0,1for i in range(5):print('----1-----')# 每次执行函数都会停在此处,并将b值返回yield bprint('----2-----')a,b = b,a+bprint('----3-----')print('-----stop-----')f = creatnum()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
  • 打印结果
-----start------
----1-----
1
----2-----
----3-----
----1-----
1
----2-----
----3-----
----1-----
2
----2-----
----3-----
----1-----
3
----2-----
----3-----
----1-----
5

3. 启动生成器的方法

  • 第一种:
next(生成器的名称)
  • 第二种:
# 生成器第一次调用时尽量不要使用send,非要使用必须用send(None)
send()方法

二、迭代器

  1. 可迭代数据类型(具有可迭代功能)

    • 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)
      例如:列表,元组,字典,集合等数据类型,但他们不是可迭代对象
    • generator(生成器)
      • yield
      • 列表生成器
      • 生成器都是可迭代对象
  2. 如何判断一个对象是不是有可迭代功能

    from collections import Iterator
    # 列表是可迭代的
    result = isinstance([1,2], Iterable)
    print(result)
    # isinstance函数会返回一个bool值 True为可迭代,反之False
    
  3. 将具有迭代功能的数据类型转化为可迭代器

    • 可以被next()调用并不断返回下一个值的对象称之为迭代器Iterator
  4. 迭代器的判断方式

    from collections import Iterator
    # 列表是可迭代对象
    # isinstance函数会返回一个bool值 True为迭代器,反之False
    result = isinstance([1,2], Iterator)
    print(result)
  5. 可迭代对象的本质

    • 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

    • 可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

    • 可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.

    • 那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。

    from collections import Iterable
    # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象class MyClass(object):# 可迭代对象的本质是,类中是否定义了 __iter__() 方法def __iter__(self):return selfc1 = MyClass()
    # 对象c1不是可迭代对象
    result = isinstance(c1, Iterable)
    print(result)
    
  • 举例说明迭代器本质原理

    比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。

class Fibonacci():def __init__(self, num):# 通过构造方法,保存num到类的成员属性中self.num = num# 定义变量保存斐波那契数列前两个值self.a = 0self.b = 1# 记录当前的变量值self.current_index = 0def __iter__(self):# 返回迭代器,因自身就是迭代器,故可以返回自己return selfdef __next__(self):# 判断是否生成完毕if self.current_index < self.num:# 返回result = self.a# 交换两个变量值self.a, self.b = self.b, self.a+self.bself.current_index += 1return resultelse:# 停止迭代raise StopIterationif __name__ == '__main__':# 创建迭代器fib_iterator = Fibonacci(5)# 使用迭代器,输出斐波那契数列值for value in fib_iterator:print(value, end=" ")

转载于:https://www.cnblogs.com/yanguhung/p/10145767.html

Python中生成器generator和迭代器Iterator的使用方法相关推荐

  1. python生成器generator和迭代器Iterator测试

    为什么需要使用生成器? ''' generator生成器 通过列表推导式,我们可以创建一个新的列表,但是,受内存限制,列表的容量是有限的. 而且,创建一个包含100万个元素的列表,不仅占用很大存储空间 ...

  2. [转载] Python中生成器和迭代器的区别

    参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...

  3. Python中生成器是什么?

    何为生成器 生成器的wiki页:https://en.wikipedia.org/wiki/Generator_(computer_programming) 在计算机科学中,生成器是特定的迭代器,它完 ...

  4. python中生成器的惰性机制

    生成器有一个惰性机制,只有当你需要的时候才给你(一个个的取),而不是一下字全部给你.可能有些抽象,来一个例子 吧. 普及一个小知识**:一只母鸡并不是生一辈子鸡蛋,有一个时间段.** 例:小明和小红两 ...

  5. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  6. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  7. 介绍python中几种遍历列表的for循环方法

    我们在使用列表的过程中,经常需要遍历列表的所有元素,对每个元素执行相同的操作.今天就给大家介绍python中几种遍历列表的for循环方法. 首先我们先构造一个numbers列表,如下: numbers ...

  8. python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案

    把两个已有项目放到一起,就是一个新项目,这种项目来源属于(?? ) 答:整合 辩证法同形而上学的斗争 答:是从属于唯物主义同唯心主义的斗争,并同这种斗争交织在一起的 中国大学MOOC: 广义的计划是对 ...

  9. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

最新文章

  1. 在Ubuntu 16.04.6 LTS升级python 3.5.x到3.7.3之后导致gnome-ternimal无法打开的解决办法
  2. Handler线程间通信
  3. 从0搭建一个Springboot+vue前后端分离项目(一)安装工具,创建项目
  4. 设计模式之策略模式和状态模式
  5. deeplearning4j
  6. 前端学习(3079):vue+element今日头条管理-数据筛选处理
  7. linux php mysql 中文_Linux下PHP+MySQL+CoreSeek中文检索引擎配置 | 系统运维
  8. Web页面打印及GridView导出到Excel
  9. springboot 文件上传大小配置
  10. 设计模式-第八篇之桥接模式
  11. openlayers集成echarts实现百度迁徙的模拟
  12. 思科交换机dhcp配置
  13. 虚幻4皮肤材质_虚幻4果真被玩坏了?浅谈光影与材质带来的极致体验
  14. styl类型文件css,styl样式文件问题:vue重复加载
  15. 【数字IC/FPGA】时钟无毛刺切换
  16. 微型计算机基础答案,第1章 微型计算机基础知识 题库和答案
  17. 冬奥闭幕,冰雪产业将何去何从
  18. PAT甲级1100 Mars Numbers (20 分)题解
  19. HP大中华区总裁孙振耀撰文谈退休并畅谈人生【全详细】
  20. 机器学习笔记-多分类下的召回率和F值

热门文章

  1. [国家集训队] tree Ⅱ
  2. [BZOJ2834]回家的路
  3. EXPORT_SYMBOL使用
  4. Python练习-从小就背不下来的99乘法表
  5. C#值类型以及默认值记录下
  6. 项目管理控件Project Management Library
  7. 模板类的析构函数如何写_顶尖文案如何写?这6大模板、29个方法,奥美大咖都在用!|优惠最后1天...
  8. 利用IDA Pro反汇编程序
  9. Python应用实战-pandas绘制图形
  10. 作为一个算法攻城狮,你训练的算法翻车了该怎么办?