一、三者在代码上的特征

1.有__iter__方法的对象就是可迭代类(对象)
2.有__iter__方法,__next()方法的对象就是迭代器
3.生成器 == 函数+yield

生成器属于迭代器, 迭代器是特殊的可迭代对象

二、各自的执行过程

1.可迭代对象执行过程

  1.先调用iter()函数:  iter(iterable) -> iterator : 函数传入一个可迭代对象(iterable),返回迭代器(iterator);
  内部是通过可迭代对象(iterable)的__iter__ ()取得迭代器(iterator)

  2.再调用next()函数:  next(iterator)->Return the next item from the iterator : 函数传入一个迭代器(iterator),返回迭代器指向的下一个值;

  内部是通过迭代器(iterator)的__next__ ()取得下一个值(iitem)

代码如下:

 # 定义一个可迭代对象,如列表
list1 = [1, 2, 3, 4, ] # 通过iter()生成一个迭代器
list_iterator = iter(list1) # 通过next()取得迭代器指向的下一个元素,默认从第一个开始
print("第1个迭代出的元素:",next(list_iterator))
print("第2个迭代出的元素:",next(list_iterator))
print("第3个迭代出的元素:",next(list_iterator))
print("第4个迭代出的元素:",next(list_iterator)) 结果如下:
第1个迭代出的元素: 1
第2个迭代出的元素: 2
第3个迭代出的元素: 3
第4个迭代出的元素: 4 进程已结束,退出代码 0

补充:

列表元祖等是可迭代对象,但不是可迭代器,虽然可以调用内部__iter__方法,返回的是一个迭代器,但不是自己的本身(本身就不是生成器),所以不能直接所以不能直接调用next()返回迭代器指向的下一个值,必须先调用iter()方法

2.yield实现生成器的执行过程

1. 假如函数中有yield,则不再是函数,而是生成器
2. yield 会产生一个断点,暂停函数 ,挂起函数, 且保存当前状态
3. 假如yield后面紧接着一个数据,就会把数据返回,
作为next()函数或者for ...in...迭代出的下一个值
4. 可以通过next()唤醒生成器,让生成器从断点处继续执行

代码如下:

def fibo(n):
"""使用yield实现生成器求斐波那契数列"""
count = 0 # 记录当前迭代的位置,初始值为0
num1, num2 = 0, 1 # 初始化数列的前两位值 0,1
while count < n:
yield num1
num1, num2 = num2, num1 + num2
count += 1 # 自加一,迭代器指针指向下一个位置 # 创建生成器,生成器默认是沉睡的,假如是第一次唤醒生成器(函数),则从生成器(函数)的起始位置开始运行
gen = fibo(10) # 使用next()迭代
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen))
print("返回的值:", next(gen)) 结果如下:
返回的值: 0
返回的值: 1
返回的值: 1
返回的值: 2
返回的值: 3
返回的值: 5
返回的值: 8
返回的值: 13
返回的值: 21
返回的值: 34 进程已结束,退出代码 1

三、总结三者拿到迭代出的数据的方法如下:

  生成器 :  可使用next()/send()    拿到数据
   迭代器:   可使用next() 拿到数据
   可迭代对象(只是可迭代对象):    可使用iter() +next() 拿到数据

如果你和我有共同爱好,我们可以加个好友一起交流!

python编程系列---可迭代对象,迭代器和生成器详解的更多相关文章

  1. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  2. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  3. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  4. python当中的 可迭代对象 迭代器

    学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...

  5. python迭代器与生成器详解

    迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子. for 语句与可迭代对象(ite ...

  6. python 迭代器和生成器详解

    一.迭代器 说迭代器之前有两个相关的名词需要介绍:可迭代对象:只要定义了__iter__()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器.迭代器:实现了__next__()或者next ...

  7. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  8. python学习笔记8--面向对象--属性和方法详解

    属性: 公有属性  (属于类,每个类一份) 普通属性  (属于对象,每个对象一份) 私有属性    (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...

  9. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

随机推荐

  1. 基于 HTML5 WebGL 的医疗物流系统

    前言 物联网( IoT ),简单的理解就是物体之间通过互联网进行链接.世界上的万事万物,都可以通过数据的改变进行智能化管理.ioT 的兴起在医疗行业中具有拯救生命的潜在作用.不断的收集用户信息并且实时 ...

  2. Django中自定义模型管理器(Manager)及方法

    1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个Django模型至少有一个ma ...

  3. (七十四)c#Winform自定义控件-金字塔图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. 【笔试题】Java笔试题知识点

    Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...

  5. SQL数据库各种查询建表插入集合-待续持续更新

    创建表 drop table student; DROP table Course; DROP table sc; CREATE TABLE student ( sid integer PRIMARY ...

  6. [经验栈]SQL语句逻辑运算符"AND"、"&&"兼容性

    最近打算把博客转移到typecho平台,选了一个风格个人比较喜欢的主题,即Akina for Typecho 主题模板,在这里先感谢题主的开源分享,但是在使用过程中一开始就出现"500 Da ...

  7. WPS删除多余空白页

    WPS删除多余空白页 在实际工作中,我们在操作WPS文字的时候常常会遇到一种问题,就是当在文字占满整页的时候,文档常常会多出一页空白页的现象.如图1 图 1   对于WPS文字怎么删除空白页这个问题, ...

  8. Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】

     一.Web框架概述  Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...

  9. Redis-->windows上的安装教程

    Windows下安装Redis服务 说明:本文拷贝自http://www.cnblogs.com/jaign/articles/7920588.html Redis是有名的NoSql数据库,一般Lin ...

  10. openstack问题记录

    先去查看对应的日志:/var/log/,再来排查错误 1.实例处于错误状态 解决办法: 1.使用openstack hypervisor list查看 2.然后openstack hypervisor ...