迭代器和生成器

一. 迭代器:迭代取值的工具

  迭代:一个重复的过程,每次重复是基于上一次重复的结果

  优点:提供一种不是依赖索引的迭代取值方式(通用方式)//  更节省内存

  缺点:只能按顺序依次取值,不如索引取值灵活//  只能 一次性取值,无法预测值的个数

  如何用:

    可迭代对象:有内置__iter__方法的对象(字符串,元组,列表,字典,集合,文件)

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

    迭代器对象:既有__iter__对象(for 循环的底层机制要用到),又有__next__方法的对象(只有文件对象是迭代器对象)

d={'k1':1,'k2':2,'k3':3}

iter_d=d.__iter__()   # 生成迭代器对象

iter_d.__next__()   # 取出第一个key 

iter_d.__next__()  # 取出第二个key

iter_d.__next__()  # 取出第三个key

# 完整代码
d={'k1':1,'k2':2,'k3':3}
iter_d=d.__iter__()
while True:
    try:
        v=iter_d.__next__()
        print(v)
    except:
        break

步骤:1. 将可迭代对象用__iter__方法编程迭代器对象
        2. 用__next__方法将每个元素取出
        3. 用try, except 捕捉异常          

  for 循环底层运行机制: for k in d:

    1. 调用 in 后边的可迭代对象d 的 __iter__() 方法,得到迭代器对象

    2. 调用迭代器对象下面的__next__() 方法,将返回值赋值给 k

    3. 直到取完,抛出异常,然后处理异常

二, 生成器: 一种自定义的迭代器

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

def func():
    a=1
    yield a
    b=2
    yield 2
    c=3
    yield 3

g=func()   # 生成器对象(自定义迭代器)
res1=next(g)
print(res1)   # 结果为1
res2=next(g)
print(res2)   #结果为2

yield : 提供一种自定义迭代器的解决方案

yield & return :

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

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

# range 函数的实现

def range(start, end, step=1):
    while start<end+1:
        yield start
        start+=1

for i in range(1,5,2):
    print i    #  结果为1 ,3

    

原文地址:https://www.cnblogs.com/Afrafre/p/10057024.html