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

    一、迭代器

      简述:迭代器指的是迭代的工具,迭代指的是一个重复的过程;但是并不是单纯的重复而是基于上一次过程的结果及每一次迭代得到的最终结果都是下一次迭代的初值。

      迭代的迭代方式:通过__next__()方法从迭代器对象的第一个元素开始访问一直到最后一个元素访问后迭代结束。

    自定义的迭代器:

           class Num():
                    def __init__(self,math):
                        self.math=math
                        self.n,self.a,self.b=0,0,1
                    def __iter__(self):
                        return self
                    def __next__(self):
                        if self.n<self.math:
                            temp=self.b
                            self.a,self.b=self.b,self.a+self.b
                            n+=1
                            return temp
                        raise StopIteration
                print(Num(5))
                for iter in Num(10):
                    print(iter)

      1、可迭代对象:包含有__iter__()方法的数据类型即为可迭代对象

              'hello'.__iter__
                    (1,2,3).__iter__
                    [1,2,3].__iter__
                    {'a':1}.__iter__
                    {'a','b'}.__iter__
                    open('a.txt').__iter__

      2、迭代器对象:即包含__iter__() 和__next__()方法的对象,文件类型本身就是迭代器对象,而通过__iter__()方法得到的结果也是迭代器对象。

      3、使用迭代器的意义在于:为没有索引的数据类型提供一个迭代取值的方式

      4、示例

    name_dict={
        "name":"liu",
        "age":20,
        "hobby":"play game"
    }
    dict_iter=name_dict.__iter__()
    while True:
        try:
            k=next(dict_iter)
            print(name_dict[k])
        except Exception  :
            break

      5、for循环的运行原理就使用了迭代器:   

                基于for循环,我们可以完全不再依赖索引去取值了
                dic={'a':1,'b':2,'c':3}
                for k in dic:
                    print(dic[k])
    
                for循环的工作原理:
                1:执行in后对象的dic.__iter__()方法相当于自定义迭代器中的__iter__方法,得到一个迭代器对象iter_dic
                2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码,相当于自定义迭代器中的__next__方法
                3: 重复过程2,直到捕捉到异常StopIteration,结束循环

     二、生成器

      简述:生成器就是一个自定义的迭代器,生成器中带有yield使调用函数并不会执行函数内部的代码。

      示例:

    def Num():
        print("1")
        yield 1
        print("2")
        yield 2
        print("3")
        yield 3
        print("4")
    g=Num()
    print(next(g))#"1"

      生成器中yield与函数中return的区别:1、yield可以返回多次值,return只能返回一次值  2、yield只会暂停函数而return会结束函数 

    协程函数:生成器的表达形式

    示例:

    food_list=[]
    def Food(name):
       while True:
           Food_list = yield food_list
           print("%s喜欢吃%s" % (name, Food_list))
           food_list.append(Food_list)
    g=Food("egon")
    g.send(None)
    g.send("apple")
    g.close()

    补充:在函数中遇到多个yield时执行到一个yield函数就会暂停通过__next__()返回一个值,在使用协程函数时g.send()第一个值必须是None。

     

  • 相关阅读:
    spring配置文件中xsd引用问题
    eclipse中.project文件和.classpath文件详解
    eclipse项目中.classpath文件详解
    How HipChat Stores And Indexes Billions Of Messages Using ElasticSearch And Redis[转]
    在64位平台上的Lucene,应该使用MMapDirectory[转]
    elasticsearch 口水篇(7) Eclipse中部署ES源码、运行
    elasticsearch 口水篇(6) Mapping 定义索引
    elasticsearch 口水篇(5)es分布式集群初探
    elasticsearch 口水篇(4)java客户端
    elasticsearch 口水篇(3)java客户端
  • 原文地址:https://www.cnblogs.com/ageliu/p/12336137.html
Copyright © 2011-2022 走看看