迭代器,生成器

一,迭代的概念

  迭代器是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下次一迭代的初始值

while True: #只是单纯地重复,因而不是迭代
    print('===>') 
    
l=[1,2,3]
count=0
while count < len(l): #迭代
    print(l[count])
    count+=1

二,为什么要用迭代器

  迭代器:

    优点: 1),提供一种不依赖索引的迭代取值方式

       2),更加节省内存

    缺点: 1),不如按照索引取值的方式灵活

        2),取值一次性的,只能往后取值,无法预测值的个数

三,如何使用迭代器

  可迭代的对象:str list tuple dict set 文件对象

    但凡内置有_iter_方法的对象都称之为可迭代对象

  迭代器对象: 文件对象

    既可以内置_iter_方法又可以内置_next_方法的对象都称之为迭代器对象

调用可迭代对象_iter_ 方法,会有一个返回值,该返回值就是内置的迭代器对象

d = {'k1': 111, 'k2': 222, 'k3': 333}

iter_d = d.__iter__()       #将数据类型可迭代对象转变成迭代器对象
print(iter_d)

try:    #让报错继续运行
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
except StopIteration:   #捕捉'StopIteration'异常
    print('取值完毕')

for循环的底层工作原理:

  1,调用in后面那个值对象的_iter方法,拿到一个迭代器对象iter_obj

  2,调用迭代器对象iter_obj._next_()将得到的返回值复制变量名k,循环往复直到取值完毕抛出异常StopIteration

  3,捕捉异常结束循环

iter_d=d.__iter__()
while True:
    try:
        v=iter_d.__next__()
        print(v)
    except StopIteration:
        break

 生成器:

  生成器就是一种自定义的迭代器

如何得到生成器:

  但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即定义的迭代器

自定义一个迭代器

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step


r = my_range(1, 1000, 5)
res = next(r)
print(res)

for i in my_range(1, 1000, 5):
    print(i)

总结:

  1, 提供一种自定义迭代器的解决方案

  2, yield & return 

      相同点: 都可以返回值,返回值没有类型限制个数限制

      不同点: return 只能返回一个值,yield 却可以让函数暂停在某一个位置,可以返回多次值

列表生成器

  把列表推导式的[]换成()就是生成器表达式

with open('a.txt',mode='rt',encoding='utf-8') as f:
    # print(len(f.read()))

    # g=(len(line) for line in f)
    # res=sum(g)

    res = sum(len(line) for line in f)
    print(res)
原文地址:https://www.cnblogs.com/kp1995/p/10060308.html