6.9 迭代器
6.9.1迭代器的定义
自己不用写,只需要学会用
迭代器:对可迭代对象中的元素进行逐一获取,表象:具有'' next ''方法且每次调用都获取可迭代对象中的元素(从前到后一个个获取)
-
列表转化为迭代器:
-
v1 = iter([11,22,33,44])
-
v1 = [11,22,33,44].iter()
-
-
迭代器想要获取每个值,就必须反复执行
v1 = [11,22,33,44]
#列表转化成迭代器
v2 = iter(v1)
result = v2.__next__()
result = v2.__next__()
result = v2.__next__()
result = v2.__next__()
#如果报错:Stopiteration,表示已经迭代完成
v1 = [11,22,334,44]
v2 = iter(v1)
while True:
try:
val = v2.__next__()
print(val)
exceppt Exception as e:
break
-
for 循环
v1 = [11,22,334,44]
#内部会将v1转换成迭代器
#内部会反复执行 迭代器.__next__()
#取完后不报错
for item in v1:
print(item)
6.9.2 可迭代对象
-
内部具有 iter() 方法并且返回一个迭代器
v1 = [11,223,33,44]
result = v1.__iter__()
-
可以被for循环
6.10生成器(函数的变异)
#函数
def func():
return 123
func()
#生成器很熟(内部包含有yield)
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
yield 100
print('F4')
#函数内部代码不会执行,返回一个生成器对象,只有被for循环才只想内部代码
v1 = func()
#生成器是可以被for循环,一旦开始循环那么函数内部得代码就会开始执行
for item in v1:
print(item)
6.10.1 生成器推导式
#正常循环
def func():
result = []
for i in range(10):
result.append(i)
return result
v1 = func()
for item in v1():
print(v1)
#推导式
v1 = [i for i in range(10)]#列表推导式立即循环创建所有的元素
#正常循环
def func():
for i in range(10):
def f():
return i
yield f
v2 = func()
for item in v2():
print(item())
#推导式
v2 = (lambda :i for i in range(10))
for item in v2:
print(item())
#生成器推导式,创建了一个生成器,内部循环未执行。也就是说,i还是一个变量,还没有赋值,只有等到for循环的时候,i就从0开始循环。
-
案例
def func():
count = 1
while True:
yield count
count += 1
if count == 99
return
val = func()
for item in val:
print(item)
-
示例:读文件
def func():
"""
分批次去读取文件的内容,将文件的内容返回给调用者
"""
cursor = 0
while True:
with open('a.txt',mode='r',encoding='utf-8') as f:
f.seek(cursor) #将光标移动到指定的位置
data_list = []
for i in range(10):
len = f.readline()
if not len:
return
data_list.append(len)
cuesor = f.tell() #获取光标的位置
f.close()
for row in data_list:
yiled row
for item in func():
print(item)