如何在Python中使用iterator生成器一个generator
如何在Python中使用iterator生成器一个generator?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
1. 迭代
根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历 迭代
2. 可迭代对象 iterable
如何判断可迭代对象的3种方式
能够被迭代访问的对象 for in
常用可迭代对象-list tuple str
from collections import Iterable
isinstance(obj, Iterable)
3. 可迭代对象
可迭代对象通过__iter__方法提供一个 可以遍历对象中数据的工具-迭代器
iter(可迭代对象) 可以获取可迭代对象的迭代器
通过迭代器可以迭代访问 数据
next(迭代器) ===== 迭代器对象.__next__()
可迭代对象的本质 提供了一个迭代器(遍历可迭代对象中的数据)
如何获取可迭代对象中的迭代器 迭代器对象 = iter(可迭代对象)
如果通过迭代器访问可迭代对象中下一个元素 元素的值 = next(迭代器对象)
如果迭代器遍历完成 抛出 停止迭代-异常StopIteration
如果需要实现一个迭代器 就需要实现__next__()
4. 迭代器 iterator
-- 迭代器访问可迭代对象中数据 判断对象是否是迭代器类型
fromcollectionsimportIterator isinstance(obj,Iterator)
自己实现
迭代器本身也是可迭代对象 __iter__() 提供迭代器(self)
下一个元素的值 = next(迭代器) =====> __next__()
实现一个可迭代对象
fromcollectionsimportIterable fromcollectionsimportIterator importtime classMylistIterator(object): """这是Mylist类型的对应迭代器类型""" def__init__(self,data): #需要被便利的数据 self.data=data #保存用户访问的位置 self.index=0 def__iter__(self): """python规定迭代器是一种可迭代对象""" returnself def__next__(self): """next(ml_iterator)相当于调用迭代器对象的.__next__()""" ifself.index<len(self.data): ret=self.data[self.index] self.index+=1 returnret else: #访问完成应该抛出异常 raiseStopIteration classMylist(object): """可迭代对象""" def__init__(self): self.data=[1,2,3,4,5] def__iter__(self): """提供迭代器""" #返回迭代器对象 mliter=MylistIterator(self.data) returnmliter #ml是一个可迭代类型 ml=Mylist() #获取可迭代对象的迭代器对象 ml_iter=iter(ml) print(isinstance(ml_iter,Iterator)) foriinml: print(i) time.sleep(1) """ 1 可迭代对象的本质 提供了一个迭代器(遍历可迭代对象中的数据) 2 如何获取可迭代对象中的迭代器 迭代器对象 =iter(可迭代对象) 实际上相当于可迭代对象.__iter__() 3 如果通过迭代器访问可迭代对象中下一个元素 元素的值 = next(迭代器对象) 如果迭代器遍历完成 抛出停止迭代-异常StopIteration """ print(isinstance(ml,Iterable))
用迭代器完成斐波那契数列(难点在next)
"""兔子队列某一项的值是前两项的和 112358 """ classFib(object): def__init__(self,n): """初始化操作""" #n代表数列的长度 self.n=n #下标记录 self.index=0 self.number1=0 self.number2=1 def__iter__(self): returnself def__next__(self): """next(迭代器) === .__next__()""" ifself.index<self.n: ret=self.number1 self.number1,self.number2=self.number2,self.number2+self.number1 self.index+=1 returnret else: raiseStopIteration #list()tuple()都可以接收迭代器 并且将遍历到的数据存储到集合中 print(list(Fib(10))) # ##打印斐波那契数列的前10项的值 ##foriinFib(10): ##print(i) ##1通过iter函数获取可迭代对象Iterable的迭代器iterator #ml_iterator=iter(Fib(1000)) # ##2在循环内部不断调用next(迭代器)获取下一个元素的值 ##3如果迭代完成会抛出一个停止迭代的异常StopIteration
5. 生成器 generator
生成器是一种特殊的迭代器 --- 是迭代器, 并且有自己的特点
1 创建生成器表达式 [] ----》 (x for x in range(100))
2 生成器函数
凡是有yield关键字的函数都不是普通函数了 而是生成器函数
#列表推导式 lis=[xforxinrange(10)] print(lis) #生成器表达式中括号变圆括号 data=(xforxinrange(10)) print(data) #遍历data foriindata: print(i)
结果:
[0,1,2,3,4,5,6,7,8,9] <generatorobject<genexpr>at0x02AE7120> 1 3 5 7 9
6. yield关键字的作用
挂起当前函数 将后面表达式的值 返回到调用生成器的地方
接收数据 并唤醒当前函数 并且紧接着上次运行的地址继续执行
7. 唤醒生成器的两种方式
生成器.send("数据")
next(生成器) === 生成器.send(None)
在第一次调用生成器对象的是 必须使用next()
在后续的情况下 send和next可以混用
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...