迭代器和生成器的关系
迭代概念
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
可迭代对象
a.可以直接作用于for-in循环的数据类型都被称为可迭代对象:Iterable
b.可以使用isinstance()判断一个对象是否是可迭代对象
c.可以直接作用于for-in循环的数据类型
1>数据结构:list、set、tuple、dict、string
2>generator【生成器】【(),函数结合yield】
迭代器
a.迭代器:Iterator
b.不但可以作用于for-in循环,还可以使用next()函数将其中的元素获取出来,当获取完最后一个元素之后,当再次调用next方法,则会出现StopIteration错误,表示无法继续返回一个值
c.可以使用isinstance()判断一个对象是否是迭代器
结论:list、set、tuple、dict、string是可迭代对象,但是,不是迭代器,只有生成器才是迭代器
#导入模块
#collections:包【文件夹】
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance((x for x in range(0,6)),Iterable))
print(isinstance("",Iterable))
print(isinstance(10,Iterable))
print(isinstance(True,Iterable))
print(isinstance(10.23,Iterable))
将迭代对象转换成迭代器
迭代器一定是可迭代对象,但是,可迭代对象不一定是迭代器
iter():将可迭代对象转化为迭代器【主要针对list、set、tuple、dict、string】
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance((x for x in range(0,6)),Iterator)) #生成器
print(isinstance("",Iterator))
ge = (x for x in [12,24,435,455,4])
for i in range(0,5):
print(next(ge))
#print(next(ge)) #StopIteration
list1 = [12,2,434,3]
#将列表转换为了迭代器
a = iter(list1)
print(next(a))
print(isinstance(iter([]),Iterator))
print(isinstance(iter(()),Iterator))
print(isinstance(iter({}),Iterator))
print(isinstance(iter(""),Iterator))
for x in [12,34,3545]:
print(x)
it = iter([12,34,3545])
while True:
try:
num = next(it)
except StopIteration:
break
(4.)总结
a.凡是可以使用for-in循环进行遍历元素的数据类型都是Iterable类型【可迭代对象】
b.凡是可以使用next()的数据类型都是Iterator类型
c.list、set、tuple、dict、string是Iterable类型,但是不是迭代器,可以通过iter()转换为迭代器
生成器
生成器的本质就是迭代器。
生成器包括两种:生成器函数和生成器表达式
生成器函数
一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。
(1).生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。
(2).执行了__next__()方法之后才会执行函数体,并且获得返回值。
(3).next()内置方法,内部调用生成器函数的__next__()方法。
(3).yield和return相同的是可以返回值,但是不同的是yield 不会结束函数
练习1:创建一个生成器,并且调用
def generator():
print('xxx')
yield
print('zzz')
# 接收返回值
ret = generator()
print(ret) # 返回一个生成器对象 <generator object generator at 0x0000000002165888>
#调用__next__()方法执行生成器
ret.__next__() # xxx 执行函数体,遇到yield结束
#ret.__next__() # StopIteration 报错
# next()方法相当于调用__next__方法
# next(ret)
练习2:创建一个生成器,并且设置返回值
def generator():
print('xxx')
yield 1 # 返回值
g = generator()
ret = next(g) # xxx
print(ret)#1
练习3:创建生成器,定义多个yield 值
def generator():
print('xxx')
yield 1
print('zzz')
yield 2
g = generator()
ret1 = next(g) # xxx
ret2 =next(g) # zzz
print(ret1,ret2) # 1,2