一、三者在代码上的特征

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. Azure Application Insights REST API使用教程

    本文是Azure Application Insights REST API的简单介绍,并会包含一个通过Python消费API的示例/小工具. 新加入的team中的一项工作是制作日常的运维报表,制作方 ...

  2. [Algorithm] Heap & Priority queue

    这里只是简单的了解,具体内容详见推荐的原链接 注意堆和树的区别 堆就是优先级队列的实现形式 堆排序 排序过程 Ref: 排序算法之堆排序(Heapsort)解析 第一步(构造初始堆): {7, 5, ...

  3. Mysql学习笔记整理之引擎

    mysql的引擎: myisam引擎 Mysql 5.5之前默认的存储引擎 数据.索引分别存储 (数据物理磁盘---索引物理磁盘) .MYD 存储数据                      表级索 ...

  4. JQuery学习笔记之手网琴效果

    这种东西在网上多的是,最近在学JQuery,所以就写了个随笔 <!DOCTYPE html> <html lang="en"> <head> & ...

  5. jenkins之插件下载方法

    jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...

  6. Android Studio [WebView]

    WebViewActivity.java package com.xdw.a122; import android.graphics.Bitmap; import android.support.v7 ...

  7. 项目管理知识点-结合Enovia项目管理模块

    核心知识域:整体管理.范围管理.进度管理.成本管理.质量管理.信息安全管理 保障域:人力资源管理.合同管理.采购管理.风险管理.信息(文档)管理.配置管理.知识产权管理.法律法规标准规范管理.职业道德 ...

  8. jQuery常用方法(二)-事件

    ready(fn); $(document).ready()注意在body中没有onload事件,否则该函数不能执行.在每个页面中可以 有很多个函数被加载执行,按照fn的顺序来执行. bind( ty ...

  9. 无广告版本Flash player 一枚,需要的拿走~

    无广告版本flashplayer,国内flashplayer已经被植入了广告,安装后不断的弹出广告使用体验很差,最开始还以为是电脑被恶意植入捆绑插件, 检查半天发现竟然是浏览器的flash playe ...

  10. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...