zoukankan      html  css  js  c++  java
  • python基础之生成器(generator)

    1:创建的生成器方法1

     1 >>> b=(x * 2 for x in range(10)) #创建生成器方法1
     2 >>> b
     3 <generator object <genexpr> at 0x0000000002FB80F8>
     4 >>> next(b)
     5 0
     6 >>> next(b)
     7 2
     8 >>> next(b)
     9 4
    10 >>> next(b)
    11 6
    12 >>> next(b)
    13 8
    14 >>> next(b)
    15 10
    16 >>> next(b)
    17 12
    18 >>>  next(b)
    19 SyntaxError: unexpected indent
    20 >>> next(b)
    21 14
    22 >>> next(b)
    23 16
    24 >>> next(b)
    25 18

    就是把想要的结果,用一个取一个

    2:创建生成器方法2

     1 def creatNum():
     2     print('----start-----')
     3     a,b=0,1
     4     for i in range(5):
     5         print('-----1------')
     6         yield b    #只要函数里面有yield 那么这就不是一个函数了,而是一个生成器函数,程序运行到这会停,然后从停的地方继续开始
     7         print('-----2------')
     8         a,b = b,a+b
     9         print('-----3------')
    10     print('-----stop-----')
    11 x = creatNum()
    12 print(x)
    13 print(next(x))
    14 print('='*20)
    15 
    16 print(next(x))
    17 print('='*20)
    18 
    19 print(next(x))
    20 print('='*20)
    21 #其实next(x)可以用x.__next__()代替
    22 
    23 
    24 print(next(x))
    25 print('='*20)
    26 
    27 print(next(x))
    28 print('='*20)

    运行结果:

     1 <generator object creatNum at 0x0000000002193C50>
     2 ----start-----
     3 -----1------
     4 1
     5 ====================
     6 -----2------
     7 -----3------
     8 -----1------
     9 1
    10 ====================
    11 -----2------
    12 -----3------
    13 -----1------
    14 2
    15 ====================
    16 -----2------
    17 -----3------
    18 -----1------
    19 3
    20 ====================
    21 -----2------
    22 -----3------
    23 -----1------
    24 5
    25 ====================

     其中方法2创建的生成器可以用for循环迭代取出,并且这样取出的好处就是不会崩

    代码示例:

     1 def creatNum():
     2     print('----start-----')
     3     a,b=0,1
     4     for i in range(5):
     5         print('-----1------')
     6         yield b
     7         print('-----2------')
     8         a,b = b,a+b
     9         print('-----3------')
    10     print('-----stop-----')
    11 x = creatNum()
    12 print(x)
    13 for num in x:
    14     print(num)

    运行结果:

    ----start-----
    -----1------
    1
    -----2------
    -----3------
    -----1------
    1
    -----2------
    -----3------
    -----1------
    2
    -----2------
    -----3------
    -----1------
    3
    -----2------
    -----3------
    -----1------
    5
    -----2------
    -----3------
    -----stop-----

     3:send()方法

    代码示例:

     1 def creatNum():
     2     print('----start-----')
     3     a,b=0,1
     4     for i in range(5):
     5         print('-----1------')
     6         temp=yield b #用temp接收yield的值
     7         print(temp)
     8         print('-----2------')
     9         a,b = b,a+b
    10         print('-----3------')
    11     print('-----stop-----')
    12 x = creatNum()
    13 print(x)
    14 x.send(None) #如果上来直接就调用传参数,程序会崩溃,解决方法一:就是先传一个None;方法二:就是先用__next__()方法调用,然后再用send()方法传参数调用
    15 x.send('----send----')
    16 x.send('------hah----')

    运行结果:

     1 <generator object creatNum at 0x0000000002153C50>
     2 ----start-----
     3 -----1------
     4 ----send----
     5 -----2------
     6 -----3------
     7 -----1------
     8 ------hah----
     9 -----2------
    10 -----3------
    11 -----1------

    4:生成器yeild 完成多任务

    示例代码:

     1 def test1():
     2     while True:
     3         print('------1------')
     4         yield None
     5 def test2():
     6     while True:
     7         print('------2-------')
     8         yield None
     9 t1=test1()
    10 t2=test2()
    11 while True:
    12     t1.__next__()
    13     t2.__next__()

    运行结果:

    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------
    ------2-------
    ------1------


    2018-03-23

  • 相关阅读:
    汪博士解读PMP考试
    ASP.NET编程实战宝典(光盘内容另行下载,地址见书封底)
    [模板]tarjan算法求SCC
    [POJ 3071]Football[概率DP]
    [数学]根式有理化[高中数学技巧]
    [平面几何]角格点问题
    [数学]对数均值不等式
    [模板][快速排序&归并排序]
    [POJ]P3126 Prime Path[BFS]
    每日一题_191219
  • 原文地址:https://www.cnblogs.com/qigege1104/p/8627892.html
Copyright © 2011-2022 走看看