• python基础6之迭代器&生成器、json&pickle数据序列化


    内容概要:

    一、生成器

    二、迭代器

    三、json&pickle数据序列化

    一、生成器generator

    在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10],当然有很多方法,下面的方法就叫列表生成式。

    >>> [ i*2 for i in range(6) ]
    [0, 2, 4, 6, 8, 10]

    当然还有其他方法:

    >>> a=map(lambda x:x*2,range(6))
    >>> for i in a:
    ...     print(i)
    ...
    0
    2
    4
    6
    8
    10
    lambbda版本

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。

    >>> ( i*2 for i in range(6) )
    <generator object <genexpr> at 0x000000000106B360>

    当我们把列表生成式变成了生产器,它会有__next__()方法(在2.7中是next()),此时我们每调用一次,就会生成一次数据:

    >>> a=( i*2 for i in range(6) )
    >>> a.__next__()
    0
    >>> a.__next__()
    2
    >>> a.__next__()
    4
    >>> a.__next__()
    6
    >>>

    普通的生成器

    定义:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

    yield作用:使函数状态停留在yield关键字执行完之后的状态,并返回当前的迭代值,当我们使用next方法的时候,会重新唤醒该函数,并从之前保留的状态继续执行下去yield下面的代码;

    后续还提到send方法,作用是给yield发送返回数据,让我们来看看普通生成器。

    def gen():
        a=1
        while a<10:
            res=yield a
            print(res)
            a+=1
    a=gen()
    print(a.__next__())#调用next方法唤醒函数
    print("分割线====")
    print(a.__next__())
    a.send("拿去")#向yield发送返回值
    print(a.__next__())
    结果:
    1
    分割线====
    None
    2
    拿去
    None
    4

     通常我们在使用的生成器的时候并不使用next的方法,而是使用for循环取得返回值(tips:当生成器执行到最后时候使用next方法会抛出StopIteration异常,而for循环不会。);

    def gen():
        a=1
        while a<10:
            yield a
            a+=1
    for i in gen():
        print(i)
    结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    View Code
    二、迭代器

    概念:

    可迭代对象(Iterable)):可以被for循环的对象或者数据类型叫做可迭代对象,所以像listtupledictsetstr、generator都是可迭代对象,这些可迭代对象可以通过iter()方法成为迭代器;

    迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,生成器是迭代器,但迭代器不一定是生成器;

    可以使用isinstance()判断一个对象是否是Iterator对象

    >>> from collections import Iterator,Iterable
    >>> isinstance([],Iterator)#不是迭代器返回false
    False
    >>> isinstance([],Iterable)#可迭代对象返回True
    True
    >>> isinstance((i*2 for i in range(6)),Iterator)#是迭代器
    True
    >>> isinstance((i*2 for i in range(6)),Iterable)
    True
  • 相关阅读:
    SDN3
    SDN2
    SDN1
    软工实践5
    2019 SDN上机第二次作业
    2019 SDN上机第一次作业
    软件工程实践2019第五次作业
    软件工程实践2019第四次作业
    软件工程实践2019第三次作业
    软件工程实践2019第二次作业
  • 原文地址:https://www.cnblogs.com/wdliu/p/6402774.html
Copyright © 2020-2023  润新知