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

    1.生成器

      1.生成器的本质就是迭代器

      2.生成器的特点和迭代器一样,取值方式和迭代器一样(__next__())

      send():给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不能用send()

      3.生成器一般由生成器函数或者生成器表达式来创建

      4.生成器就是手写的迭代器

    2.生成器函数

      1.和普通函数没有区别,里面有yield的函数就是生成器函数

      2.生成器函数在执行的时候,默认不会执行函数体,返回生成器

      3.通过生成器的__next__()分段执行这个函数

      4.send()给上一个yield传值,不能在开头(没有上一个yield),最后一个yield也不能用send()

    1 def func():
    2     print("abc")
    3     yield 1
    4     print("def")
    5 gen = func()

    return 和yield都可以返回数据,gen=func()不会执行函数,拿到的是生成器,执行生成器需要用__next__()

    函数中如果有yield,这个函数就是生成器函数,生成器函数获取的是生成器

    yield:相当于return,可以返回数据,但是yield不会彻底中断函数,而是分段执行函数

    print(gen.__next__())  执行函数,执行到下一个yield

    print(gen.__next__())  继续执行函数到下一个yield

    1 def func():
    2     yield 1
    3     yield 2
    4     yield 3
    5     yield 4
    6 for i in func():#for的内部一定有__next__()
    7     print(i)
    8 print(list(func()))#内部有__next__()

    3.推导式

      1.列表推导式:[结果 for 循环 条件筛选]

        例如:将100以内的偶数输出到一个列表中

        

    1 lst = [i for i in range(100) if i % 2 == 0]
    2 print(lst)

        

      2.字典推导式:{k:v for循环 条件筛选}

      例如:lst = [11,22,33,44] 输出{0:11,1:22,2:33,3:44}

      

    1 lst = [11,22,33,44]
    2 dic = {i:lst[i] for i in range(len(lst))}
    3 print(dic)

      3.集合推导式:{k for循环 条件}

    1 lst = [1,1,2,2,3,3,4,4]
    2 s = {el for el in lst}
    3 print(s)

    结果为:{1,2,3,4}

    4.生成器表达式

    生成器表达式使用(),由于元组不能增删改,所以没有元组推导式

      (结果 for循环 条件)

    1 tu = (i for i in range(1,10))
    2 print(tu)
    执行出来的是一个生成器

    如果要取值,使用__next__()

    1 def func():
    2     print(111)
    3     yield 222
    4     yield 333
    5 g = func()#生成器
    6 g1 = (i for i in g)#生成器
    7 
    8 g2 = func()#生成器
    9 g3 = (i for i in g2)#生成器
    10 print(list(g1)) #结果为111 222 333从源头把数据拿走
    11 print(list(g3)) #如果没有第8行,执行结果为[],因为源头已经没有数据

    生成器表达式的特点:

      1.惰性机制

      2.只能向前

      3.节省内存

  • 相关阅读:
    python2.7 使用super关键词 报错 TypeError: must be type, not classobj 解决办法
    ACM_高次同余方程
    既然选择了、再怎么艰难也要走下去
    ACM_扩展欧几里德算法
    Codeforces Round #328 (Div. 2)_B. The Monster and the Squirrel
    Codeforces Round #328 (Div. 2)_A. PawnChess
    HDU_5523Game
    POJ_2769同余问题
    poj1258prim算法
    最小生成树—prim算法
  • 原文地址:https://www.cnblogs.com/s593941/p/9469992.html
Copyright © 2011-2022 走看看