生成器及推导式

发布时间:2019-05-29 21:33:00编辑:auto阅读(1709)

    一、生成器——自己写的函数

    1、只要有yield关键字的函数都是生成器函数

    2、yield关键字不能与return关键字同时使用

    3、return结束函数,yield不结束函数,生成器函数执行之后得到一个生成器作为返回值

    return与yield的区别

    def ger():
        print('hello')
        yield 'Hi'
    ret=ger()
    print(ret)
    #<generator object ger at 0x00000137A9D985E8>#结果
    def ger():
        print('hello')
        return 'Hi'
    ret=ger()
    print(ret)
    #hello#结果
    #Hi

    yield的使用

    def ger():
        print('hello')
        yield 'Hi'
    ret=ger()
    print(ret.__next__())
    #hello结果
    #Hi
    '''
    def ger():
    print('hello')
    yield 'Hi'
    yield '春暖花开'
    ret=ger()
    print(ret.__next__())
    print(ret.__next__())


    #hello
    #Hi
    #春暖花开
    '''
    '''
    def ger():
    print('hello')
    yield 'Hi'
    yield '春暖花开'
    yield '面朝大海'
    ret=ger()
    for fr in ret:
    print(fr)
    #hello结果
    #Hi
    #春暖花开
    #面朝大海
    '''

     二、推导式

    分类:列表推导式(相对用的多)、生成器推导式,字典推导式;

    列表推导式ret=[满足条件的元素的相关操作 for 元素 in 可迭代数据类型 if 元素相关条件]

    例如30以内能被3整除的数的列表推导式:ret=[i for i in range(30) if i%3==0]

    生成器推导式g=(满足条件的元素的相关操作 for 元素 in 可迭代数据类型 if 元素相关条件)

    例如30以内能被3整除的数的生成器推导式:g=(i for i in range(30) if i%3==0)

    例子:

    def add(a,b):
        return a+b
    def rang():
        for i in range(4):
            yield i
    g=rang()
    for n in [1,10,5]:#遇到这样的可拆分为如下'''  '''中的代码
        g=(add(n,i) for i in g)
    '''
    #上面for里的代码等价如下:
    n=1
    g=(add(n,i) for i in g)#(add(n,i) for i in rang())
    n=10
    g=(add(n,i) for i in g)#(add(n,i) for i in (add(n,i) for i in rang()))
    n=5
    g=(add(n,i) for i in g)#g=(add(n,i) for i in (add(n,i) for i in (add(n,i) for i in rang())))#实际执行
    '''
    print(list(g))#

    结果

     

关键字