doraemon的python 迭代器与生成器

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)

 

猜你喜欢

转载自www.cnblogs.com/doraemon548542/p/11241792.html