zoukankan      html  css  js  c++  java
  • 迭代器和生成器

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

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

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

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

      如何用:

        可迭代对象:有内置__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

        

  • 相关阅读:
    NYOJ47 过河问题
    CodeForces1165
    LuoGuP3667
    ZROI#958
    ZROI#957
    KMP小结
    LuoGuP2742[模板]二维凸包
    ZROI#999
    ZROI#997
    ZROI#996
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10057024.html
Copyright © 2011-2022 走看看