zoukankan      html  css  js  c++  java
  • 生成器

    生成器(generator)

    生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器,调用这个函数得到一个生成器对象;

    生成器函数

    函数体中包含yield语句的函数,返回生成器对象,生成器对象是一个可迭代对象,是一个迭代器,生成器的函数体不会立即执行,next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出yield的值,并暂停函数执行;没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常;

    def inc():
        for i in range(5):
            yield  i
    
    print(type(inc))
    print(type(inc()))
    x = inc()
    print(type(x))
    print(next(x))
    for m in x:
        print(m,'*')
    for m in x:
        print(m,'**')
    

    生成器函数可以使用next函数多次执行,每次返回一个值;

    def gen():
        print('line 1')
        yield 1
        print('line 2')
        yield 2
        print('line 3')
        return 3
    next(gen())
    next(gen())
    g = gen()
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g, 'End'))
    

    生成器函数中,使用多个yield语句,执行一次后会暂停执行,把yield表达式的值返回;在次执行会执行到一个yield语句;return语句依然可以终止函数运行,但return语句的返回值不能获取到;return会导致无法继续获取下一个值,抛出StopIteration异常;如果函数没有显示return语句,如果生成器函数执行到结尾,一样会抛出StopIteration异常;

    生成器的应用:

    计数器

    def inc():
        def counter():
            i = 0
            while True:
                i += 1
                yield i
        c = counter()
        return lambda : next(c)
    
    foo = inc()
    print(foo())
    print(foo())
    print(foo())
    
    def inc():
        def counter():
            i = 0
            while True:
                i += 1
                yield i
    
        c = counter()
    
        def _inc():
            return next(c)
        return _inc
    
    foo = inc()
    print(foo())
    print(foo())
    print(foo())
    

    递归问题

    pre = 0
    cur = 1
    print(pre,cur,end=' ')
    
    def fib1(n,pre=0,cur=1):
        pre,cur = cur,pre+cur
        print(cur,end=' ')
        if n == 2:
            return
        fib1(n-1,pre,cur)
    
    fib1(8)

    yield from是python3.3出现的新语法

    def counter(n):
        for x in range(n):
            yield x
    
    def inc(n):
        yield from counter(n)
    
    foo = inc(10)
    print(next(foo))
    print(next(foo))
    
    foo1 = counter(10)
    print(next(foo1))
    print(next(foo1))
    
  • 相关阅读:
    你的人生许多痛苦源于盲目较劲
    这些HTML、CSS知识点,面试和平时开发都需要 (转)
    拿什么拯救你,我的代码--c#编码规范实战篇 (转)
    最近的面试总结
    感恩和珍惜现在的生活
    我眼中的领域驱动设计(转)
    《生活就像练习》读书笔记(四)——意识状态和类型
    《生活就像练习》读书笔记(三)——发展路线
    .NET面试题解析(07)-多线程编程与线程同步 (转)
    C#进阶系列——WebApi身份认证解决方案:Basic基础认证 (转)
  • 原文地址:https://www.cnblogs.com/52py/p/7692726.html
Copyright © 2011-2022 走看看