美文网首页python从入门到放弃
python-11-函数之生成器和生成式

python-11-函数之生成器和生成式

作者: 楠木cral | 来源:发表于2018-10-22 20:29 被阅读0次

    一、生成式与生成器
    可以把迭代器看成一种容器,类似列表。生成器就是来生成迭代器。

    if __name__ == '__main__':
        # 1.生成式 ---- 产生一个迭代器的表达式
        # a是生成器,能够生成0-9中的所有的数字
        a = (x for x in range(10))
        print(a, type(a))
    
        a0 = (x*2 for x in range(10))
    
        a1 = (char for char in 'hello world')
    
        a2 = (char for char in 'h0el761lo p2yt3ho4n902' if '0'<=char<='9')
    
        #2.生成器和迭代器都是通过next来获取里面的数据
        print(next(a))
        print(next(a))
        print(next(a))
        print(next(a))
    
        print('=======')
        for x in a:
            print(x)
    
        # 3.将生成器转换成列表
        # 通过将生成式产生的迭代器转换成了一个列表
        list1 = [x for x in range(10)]
        print(list1)
    
        # 4.将生成器转换成字典
        # 注意:容器类型的元素是元祖,并且元素中有且只有两个元素的,才能转换成字典
        dict1 = dict((x, x*2) for x in range(5))  # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
        print(dict1)
    
        # 练习:一句代码实现交换一个字典中的key和value的值. {'a':1, 'b':2} --> {1:'a', 2:'b'}
        dict2 = dict((value, key) for key,value in {'a': 1, 'b': 2, 'c': 3}.items())
    
        old = {'a': 1, 'b': 2, 'c': 3}
        dict3 = dict((old[key], key) for key in old)
        print(dict3)
    

    二、生成器

    if __name__ == '__main__':
        def func1():
            for x in range(10):
                return x
    
        # 0 <class 'int'> < class 'function' >
        print(func1(), type(func1()), type(func1))
    

    1.yield关键字
    只要函数中有yield关键字,那么这个函数就会变成一个生成器。
    a.有yield的函数,在调用函数的时候不再是获取返回值,
    而是产生一个生成器对象,生成器对象中保留的是函数体。
    b.当通过next获取生成器中的数据的时候,才会去执行函数体,执行到yield为止,
    并且将yield后面的结果作为生成的数据返回。同时记录结束的位置,下次再调用next的时候,
    从上次结束的位置接着往后执行。

        def func2():
            print('abc')
            for x in range(10):
                yield x
                print('aaa')
        # 注意:函数中只要有yield,不管yield会不会执行到,函数的调用结果都是生成器
        def func3(x):
            print('abc')
            if x > 10:
                yield 100
            return 20
    
        # print(func2(), type(func2()), type(func2))
        # 这儿的func2()是一个生成器
        gen = func2()
        print(next(gen))
        print(next(gen))
        print(next(gen))
    
        gen2 = func3(1)
        print(gen2)
    

    练习:写一个生成器,可以产生斐波那契数列(可以无限生成)

        # 1,1,2,3,5,8,13,21,34....
        def sequence():
            yield 1
            yield 1
            x = 1
            y = 1
            while True:
                yield x + y
                x, y = y, x+y
    
        se = sequence()
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
        print(next(se))
    
    2.生成器和生成式产生的对象就是迭代器
    将列表转换成迭代器对象
    迭代器(iter)
    
        iter1 = iter([1, 2, 3, 4])
        print(iter1)
        print(next(iter1))
        print(next(iter1))
        for item in iter1:
            print(item)
    

    三、迭代器
    1.什么是迭代器(iter)
    迭代器是python中一种容器类的数据类型。属于序列。没有具体的字面量,可以将其他的序列转换成迭代器:iter(序列)

    2.迭代器的特点
    只能通过next方法去一个一个按顺序获取迭代器中的元素,取出后迭代器中就不存在这个元素了

    iter1 = iter('abcd')
    print(iter1)
    
    print(next(iter1))
    print(next(iter1))
    
    for x in range(5):
        print(x)
    
    print(next(iter1))
    print(next(iter1))
    # print(next(iter1))  # StopIteration
    

    3.遍历迭代器

    iter1 = iter(['abc', 10, 'name'])
    print('=====')
    for x in iter1:
        print(x)
    
    print('====')
    
    # print(next(iter1))
    

    next(迭代器)
    迭代器.next()

    iter2 = iter((1, 2, 3))
    a = iter2.__next__()
    print(a)  # 1
    
    list1 = list(iter2)
    print(list1)  # [2, 3]
    

    相关文章

      网友评论

        本文标题:python-11-函数之生成器和生成式

        本文链接:https://www.haomeiwen.com/subject/ceknzftx.html