• python----迭代器,生成器


    一:python中的for循环。

    二:迭代器:

            可以将某个数据集内的数据挨个取出来。

            可以迭代的有:数字,字符串,列表,元组,字典..........

    rom collections import Iterable
    l=[1,2,3,4]
    t=(1,2,3,4)
    d={1:2,3:4}
    s={1,2,3,4}
    print(isinstance(l,Iterable))
    print(isinstance(t,Iterable))
    print(isinstance(d,Iterable))
    print(isinstance(s,Iterable))
                 
    
    
               True
               True
               True
               True

         二:可迭代协议    

         能被for循环的就是就是可迭代的。--------------可以被迭代满足的要求就是可迭代协议。(就是内部实现了_inter_方法)

        

    print(dir([1,2]))
    print(dir([2,3]))
    print(dir({1:2}))
    print(dir({1,2}))

     三:迭代器------------------>必须遵循迭代器协议---------->(必须要有_iter_和_next_方法)。

         访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有元素访问完毕,只能前进不能后退。

        

    rint(set(dir([1,2].__iter__()))-set(dir([1,2])))
    
                                  {'__next__', '__length_hint__', '__setstate__'}

    =[1,2,3,4]
    l_iter=l.__iter__()
    item=l_iter.__next__()
    print(item)
    item=l_iter.__next__()
    print(item)
    item=l_iter.__next__()
    print(item)
    item=l_iter.__next__()
    print(item)
    item=l_iter.__next__
    print(item)
    
    1
    2
    3
    4
    <method-wrapper '__next__' of list_iterator object at 0x0000020A4F0397F0>

           range:

    print('_next_'in dir(range(12)))      #查看‘_next_’是不是在执行range后,是否有‘_next_’
    print('_next_'in dir(range(12)))      #查看‘_next_’是不是在执行range后,是否有‘_next_’
    from collections import Iterator
    print(isinstance(range(100000000000),Iterator))#判断range在执行之后得到的结果是不是一个迭代器。

    四:初识生成器

                  我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,可以用for循环,只能用一次。

             迭代器有的好处是可以节省内存。

            如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

           python中提供的生成器

                1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方              继续执行

                 2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

                 生成器Generator:

            本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

            特点:惰性运算,开发者自定义

             生成器函数:

    import time
    def genrator_fun1():          #生成器函数
        a=1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在定义了变量')
        yield b
    g1=genrator_fun1()          #打印g1,发现g1就是生成器
    print('g1:',g1)
    print('-'*20)
    print(next(g1))             #激活生成器
    time.sleep(0.1)             #延迟0.1秒
    
    -------------------
    现在定义了a变量
    1
    现在定义了变量
    2
    def produce():
        for i in range(2000000):
            yield "生产了第%s件衣服"%i
    product_g=produce()
    print(product_g._next_())
    print(product_g._next_())
    print(product_g._next_())
    num = 0
    for i in product_g:
        print(i)
        num+=1
        if num == 5:
            break

    五:列表生成器和列表表达式

           1.把列表解析的[]换成()得到的就是生成器表达式

           2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

           3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访            问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

              

    egg_list=['鸡蛋%s'%i for i in range(1,11)]       #列表解析
    laomuji=('鸡蛋%s'%i for i in range(1,11))        #生成器表达式
    print(laomuji)
    print(next(laomuji))              #next本质调用
    print(laomuji.__next__())
    print(next(laomuji))
    
    
     鸡蛋1
    鸡蛋2
    鸡蛋3

             

    print(dir([1,2]))
    print(dir([2,3]))
    print(dir({1:2}))
    print(dir({1,2}))
  • 相关阅读:
    Tomcat5配置mysql
    Eclipse完全手册
    MBR是什么
    必杀技公布——用特征码定位关键代码,秒杀MFC程序
    Google C++编程命名约定
    认识硬盘主引导扇区
    c++ const 用法详解
    主引导区
    C++ 关于struce结构体字节对齐
    Fedora 显示设备配置工具介绍
  • 原文地址:https://www.cnblogs.com/w-s-l123/p/7275096.html
Copyright © 2020-2023  润新知