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

    1.1生成器函数:带yield语句的函数成为生成器函数,生成器函数的返回值是生成器

    def gen():
        print('a')
        yield 1
        print('b')
        yield 2
        return 3
    #执行生成器函数的时候,函数体并没有背执行
    g = gen()
    #执行到第一个yield的时候停止执行
    next(g)
    #从第一个yield之后开始执行,在第二个yield之前停止执行
    next(g)
    #从第二个yield开始执行,当没有更多yield的时候,抛出stopiteration异常,异常的值正好是返回值
    

      

    生成器函数执行的时候不会执行函数体

    当next一个生成器的时候,会执行到第一个yield语句,会弹出值,并且暂停函数

    当再次next生成器的时候,从上次暂停处开始往下执行

    当没有多余的yield的时候,会抛出stopiteration异常。异常的值是函数的返回值

    def dedupe(item):
        seen = set()
        for items in item:
            if items not in seen:
    #            print('this is  a item {}'.format(items))
                yield items
            seen.add(items)
    #        print('this is a set {}'.format(seen))
    
    lst =[1,5,2,1,9,1,5,10]
    #generator本身就是一个iterator,所以肯定是iterable的 所有list后面可以放yield的返回值
    print(list(dedupe(lst)))
    #next 执行到第一个yield的时候停止执行,在次执行next的时候,从seen.add(items)上执行
    
    # print(next(func))
    

      

    for example :更好的理解list(generator)
    def take (n):
        for i in range(n):
            yield i
    
    l = list(take(4))
    
    >>> l = [0,1,2,3]
    

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

    def cocunter(n):
        for x in range(n):
            yield x
    def inc(n):
        yield from cocunter(n)
    
    foo = inc(10)
    for x in foo:
        print(x)
    def cocunter(n):
        for x in range(n):
            yield x
    def inc(n):
        yield cocunter(n)
    
    foo = inc(10)
    print(foo)
    for x in foo:
        print(x)
        for j in x:
            print(j)
    本文为原创文章,转载请标明出处
  • 相关阅读:
    6、方法
    5、封装
    4、循环
    3、判断
    2、基本语法
    1、基本框架
    CodeForces 681C Heap Operations(模拟)
    CodeForces 682C Alyona and the Tree(广搜 + 技巧)
    URAL 2099 Space Invader题解 (计算几何)
    HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)
  • 原文地址:https://www.cnblogs.com/harden13/p/6379411.html
Copyright © 2011-2022 走看看