多任务-协程(01-迭代器)
迭代器:迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置和对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退
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-迭代器)相关推荐
- python 实现多任务协程下载斗鱼平台图片
python 实现多任务协程下载斗鱼平台图片 import re import gevent from gevent import monkey, pool import time, random i ...
- python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片
查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...
- Python初级爬虫(利用多任务协程爬取虎牙MM图片)
Python多任务协程下载虎牙直播MM图片 # coding = utf-8 import re import gevent from gevent import monkey, pool impor ...
- python多任务—协程(一)
写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明.本文主要包括的知识点有:yield生成器的复习并实现协程的功能.greenlet库实现协程. ...
- python 协程_Python多任务协程
协程 协程,又称微线程,纤程.英文名Coroutine. 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源).为啥说它是一个执行单元,因为它自带CPU ...
- Unity协程与迭代器
简介 Unity里的协程提供了一种异步处理的方式,可以用于实现延时或者分帧操作. Unity协程的实现基本原理是利用了迭代器. 本文将利用迭代器的特性,实现Unity协程中分帧执行的功能. 迭代器 迭 ...
- Python-高级:多任务-协程 案例:图片下载器
简单示例代码: # 描述:爬取网页中的图片, # 此处就给一些图片的连接,对图片下载. # 采用并发的方式 # 此处给好的图片链接分别为:import urllib.request import ge ...
- python后端学习(五)迭代器、生成器、协程
迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 我们已经知道可 ...
- python笔记 7-8 进程池 进程通信 迭代器 消息队列 Queue 协程 和正则表达式
day7 进程 进程池 进程通信 迭代器 消息队列 Queue 作用 用于多个进程间的通信 操作put放入消息(值) put_nowait() 放入值,不等待 如果队满,则报错 get获取消息(值) ...
最新文章
- Linux系统CentOS下mysql的安装日志
- 5.9 程序示例--非线性分类-机器学习笔记-斯坦福吴恩达教授
- boost::disjoint_sets_with_storage用法的测试程序
- 【最新合集】编译原理习题(含答案)_11-14中间代码生成_MOOC慕课 哈工大陈鄞
- 幕乔美化版音乐网站源码
- Ubuntu-创建wifi热点-Android能连接(2)
- app营销实训报告_数据科学实训总结(15):一睹python数据分析的真容
- 如何使用MIME类型
- 稳定币usda是哪个发行的_什么是USDA?_USDA币介绍_USDA币种百科_创始团队和代币总量_蜜蜂查...
- 一键搞定JavaEE应用,JRE+Tomcat+Mysql-JaveEE绿色运行环境JTM0.9版 (转载)
- js去空格、去重函数
- 第五章:Flask数据库操作
- 网络视频会议管理系统设计原则
- 树莓派查看cpu温度的命令
- 使用秀米编排点击展示H5
- 18岁少年辍学组建黑客俱乐部 已覆盖62所学校
- 如何分析百度SEM竞价账户,简单实用小窍门
- 收藏一个Ping的小工具类,可用于网络中检测目的设备是否在线
- 从航天到原始递归函数的四个定理及其证明——哥德尔读后之十二
- 微软语音朗读引擎MSSPEECH打造自己的TTS应用
热门文章
- Github上重现DeepMind星际争霸强化学习算法的代码调试与问题
- mysql where 位子,mysql中 地里位置搜索 (抄)
- uploadify上传控件
- mac系统还原和更新
- Ueditor编辑器实战 HTML / vue+v-model
- LeetCode 27 合并两个排序的链表
- 硬件设计之JTAG转USB转换芯片
- 机器学习(六)——高斯判别法(GDA)
- linux命令行下写for语句,Linux命令行 – 流程控制:for 循环
- 再寄小读者之数学篇[2014.07.01-2014.12.31]