如何在Python中使用iterator生成器一个generator

如何在Python中使用iterator生成器一个generator?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1. 迭代

如何在Python中使用iterator生成器一个generator

根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历 迭代

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可以混用

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-03-24 01:22:31
收藏
分享
海报
0 条评论
157
上一篇:URL与URLConnection怎么在Java项目中使用 下一篇:如何在Java中使用Collections工具类排序List集合
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码