迭代器:迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置和对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退

1.可迭代对象

我们已经知道可以对lis,tuple,str等类型的数据使用for...in...的循环语法从其他依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代

2. 如何判断一个对象是否可以迭代

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
from collections.abc import Iterable, Iteratorprint(isinstance([], Iterable))  # True
print(isinstance({}, Iterable))  # True
print(isinstance('abc', Iterable))  # True
print(isinstance(100, Iterable))  # False

3. 可迭代对象的本质

我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。
那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。
class MyList(object):def __int__(self):self.container = []def add(self, item):self.container.append(item)def __iter__(self):passmylist = MyList()print(isinstance(mylist, Iterable))  # True

4. iter() 函数 与 next()函数

list,tuple等都是可迭代对象,我们可以勇敢iter()函数获取这些可迭代对象的迭代器,然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据,iter()函数实际上是调用了可迭代对象的__iter__方法
li = [11, 22, 33, 44, 55]
li_iter = iter(li)
print(next(li_iter))    # 11
print(next(li_iter))    # 22
print(next(li_iter))    # 33
print(next(li_iter))    # 44
print(next(li_iter))    # 55
#print(next(li_iter))    # 报错 StopIteration

注意,当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有数据都已迭代完成,不用再执行next()函数了。

5.如何判断一个对象是否是迭代器4

可以使用 isinstance() 判断一个对象是否是 Iterator 对象:
print(isinstance([], Iterator))     # False
print(isinstance(iter([]), Iterator))   # True
print(isinstance(iter("abc"), Iterator))    # True

6.迭代器Iterator

迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。
实际上,在使用next()函数的时候,调用的就是迭代器对象的__next__方法()
所以,我们要想构造一个迭代器,就要实现它的__next__方法
但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。一个实现了__iter__方法和__next__方法的对象,就是迭代器。
class MyList(object):"""自定义的一个可迭代对象"""def __init__(self):self.items = []def add(self, val):self.items.append(val)def __iter__(self):myiterator = MyIterator(self)return myiteratorclass MyIterator(object):"""自定义的供上面可迭代对象使用的一个迭代器"""def __init__(self, mylist):self.mylist = mylist# current用来记录当前访问到的位置self.current = 0def __next__(self):if self.current < len(self.mylist.items):item = self.mylist.items[self.current]self.current += 1return itemelse:raise StopIterationdef __iter__(self):return selfif __name__ == '__main__':mylist = MyList()mylist.add(1)mylist.add(2)mylist.add(3)mylist.add(4)mylist.add(5)for num in mylist:print(num)

7. for…in…循环的本质

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获
取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

8. 迭代器的应用场景

举个例子,比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
class FibIterator(object):""" 斐波那契数列迭代器"""def __init__(self, n):"""":param n:int,指明生产数列的前n个数"""self.n = n# current 用来保存当前生产到数列中的第几个数了self.current = 0# num1 用来保存前前一个数,初始值为数列中的第一个数0self.num1 = 0# num2 用来保存前一个数,初始值为数列中的第二个数1self.num2 = 1def __next__(self):"""被next()函数调用来获取下一个数"""if self.current < self.n:num = self.num1self.num1 , self.num2 = self.num2, self.num1 + self.num2self.current += 1return numelse:raise StopIterationdef __iter__(self):"""迭代器的__iter__返回自身即可"""return self

9. 并不是只有for循环能接收可迭代对象

 除了for循环能接收可迭代对象,list、tuple等也能接收。
li = list(FibIterator(15))
print(li)
tp = tuple(FibIterator(6))
print(tp)if __name__ == '__main__':fib = FibIterator(20)for num in fib:print(num, end=" ")

多任务-协程(01-迭代器)相关推荐

  1. python 实现多任务协程下载斗鱼平台图片

    python 实现多任务协程下载斗鱼平台图片 import re import gevent from gevent import monkey, pool import time, random i ...

  2. python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片

    查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...

  3. Python初级爬虫(利用多任务协程爬取虎牙MM图片)

    Python多任务协程下载虎牙直播MM图片 # coding = utf-8 import re import gevent from gevent import monkey, pool impor ...

  4. python多任务—协程(一)

    写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明.本文主要包括的知识点有:yield生成器的复习并实现协程的功能.greenlet库实现协程. ...

  5. python 协程_Python多任务协程

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源).为啥说它是一个执行单元,因为它自带CPU ...

  6. Unity协程与迭代器

    简介 Unity里的协程提供了一种异步处理的方式,可以用于实现延时或者分帧操作. Unity协程的实现基本原理是利用了迭代器. 本文将利用迭代器的特性,实现Unity协程中分帧执行的功能. 迭代器 迭 ...

  7. Python-高级:多任务-协程 案例:图片下载器

    简单示例代码: # 描述:爬取网页中的图片, # 此处就给一些图片的连接,对图片下载. # 采用并发的方式 # 此处给好的图片链接分别为:import urllib.request import ge ...

  8. python后端学习(五)迭代器、生成器、协程

    迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 我们已经知道可 ...

  9. python笔记 7-8 进程池 进程通信 迭代器 消息队列 Queue 协程 和正则表达式

    day7 进程 进程池 进程通信 迭代器 消息队列 Queue 作用 用于多个进程间的通信 操作put放入消息(值) put_nowait() 放入值,不等待 如果队满,则报错 get获取消息(值) ...

最新文章

  1. Linux系统CentOS下mysql的安装日志
  2. 5.9 程序示例--非线性分类-机器学习笔记-斯坦福吴恩达教授
  3. boost::disjoint_sets_with_storage用法的测试程序
  4. 【最新合集】编译原理习题(含答案)_11-14中间代码生成_MOOC慕课 哈工大陈鄞
  5. 幕乔美化版音乐网站源码
  6. Ubuntu-创建wifi热点-Android能连接(2)
  7. app营销实训报告_数据科学实训总结(15):一睹python数据分析的真容
  8. 如何使用MIME类型
  9. 稳定币usda是哪个发行的_什么是USDA?_USDA币介绍_USDA币种百科_创始团队和代币总量_蜜蜂查...
  10. 一键搞定JavaEE应用,JRE+Tomcat+Mysql-JaveEE绿色运行环境JTM0.9版 (转载)
  11. js去空格、去重函数
  12. 第五章:Flask数据库操作
  13. 网络视频会议管理系统设计原则
  14. 树莓派查看cpu温度的命令
  15. 使用秀米编排点击展示H5
  16. 18岁少年辍学组建黑客俱乐部 已覆盖62所学校
  17. 如何分析百度SEM竞价账户,简单实用小窍门
  18. 收藏一个Ping的小工具类,可用于网络中检测目的设备是否在线
  19. 从航天到原始递归函数的四个定理及其证明——哥德尔读后之十二
  20. 微软语音朗读引擎MSSPEECH打造自己的TTS应用

热门文章

  1. Github上重现DeepMind星际争霸强化学习算法的代码调试与问题
  2. mysql where 位子,mysql中 地里位置搜索 (抄)
  3. uploadify上传控件
  4. mac系统还原和更新
  5. Ueditor编辑器实战 HTML / vue+v-model
  6. LeetCode 27 合并两个排序的链表
  7. 硬件设计之JTAG转USB转换芯片
  8. 机器学习(六)——高斯判别法(GDA)
  9. linux命令行下写for语句,Linux命令行 – 流程控制:for 循环
  10. 再寄小读者之数学篇[2014.07.01-2014.12.31]