Python - 迭代器、生成器
迭代器
- 什么是迭代器(iter)
迭代器是容器型数据类型,可以同时保存多个数据;可以被遍历也可以转换成列表或元组
打印迭代器时无法打印里面的元素;迭代器不支持len()操作
如需迭代器中的元素,必须将元素将迭代器中取出,而且一旦取出元素,这个元素在迭代器中就不存在了
-
怎么创建迭代器
方式1:通过iter将其他序列转换成迭代器
方法2:创建生成器对象(生成器可以看成是一种特殊的迭代器)
# 创建 iter1 = iter('zzx') print(iter1) #<str_iterator object at 0x0000020249D17A00> # print(len(iter1)) #TypeError: object of type 'str_iterator' has no len()
-
获取迭代器中的元素
1)、获取单个元素:next(迭代器)
2)、遍历(for 循环)
# 获取 print(next(iter1)) #'z' print(next(iter1)) #'z' print(next(iter1)) #'x' iter2 = iter([9,99,999,9999]) for item in iter2: print(f'item in iter2:{item}') iter3 = 'Hello!' print(list(iter3)) #['H', 'e', 'l', 'l', 'o', '!'] # 执行list(iter3)时已经将iter3中的所有数据拿出来了,iter3已经空了 # print(next(iter3)) #TypeError: 'str' object is not an iteratoriter2 = iter([9,99,999,9999]) for item in iter2: print(f'item in iter2:{item}') iter3 = 'Hello!' print(list(iter3)) #['H', 'e', 'l', 'l', 'o', '!'] # 执行list(iter3)时已经将iter3中的所有数据拿出来了,iter3已经空了 # print(next(iter3)) #TypeError: 'str' object is not an iterator
生成器
-
什么是生成器(generator)
生成器是具备能够产生多个数据能力的一种容器
生成器在获取数据的时候和迭代器一样
-
怎么创建生成器
调用一个带有yield关键字(只要包含,不论是否执行)的函数就可以得到一个生成器对象
(若一个函数中有yield,那么这个函数在调用时不会执行函数体也不会获取返回值而是得到一个生成器)
-
控制生成器产生数据的能力
执行生成器对应的函数会遇到几次yield这个生成器就能产生多少个数据,每次遇到yield的时候
yield后面的值就是对应可以产生的数据
-
获取元素
单个获取next(生成器)
遍历(for 循环)
-
生成器产生数据的原理
在通过生成器对象获取数据的时候,程序才会执行生成器对应的函数,每次遇到yield就会停止
将yield后面的数据作为这次获取到的数据。记录结束位置,下一次获取数据时从上一次结束位置开始执行
def func1():
yield 999
for i in range(5):
yield i
for item in func1():
print(f'生成器生成的数据:{item}')
def func2():
yield 999
yield 888
yield 777
# 每次都重新执行func2()
print(next(func2())) #999
print(next(func2())) #999
print(next(func2())) #999
gen = func2()
print(next(gen)) #999
print(next(gen)) #888
print(next(gen)) #777
# 练习:创建一个生成器函数,可以产生前N个偶数(从0开始)
# N --> 5 生成:0, 2, 4, 6, 8
def func3(item):
for i in range(item):
yield 2 * i
for item in func3(5):
print(item)