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

    1 def sub_generator():
    2     yield 1
    3     yield 2
    4     for i in range(3,10) : yield i
    5 
    6 a = sub_generator()
    7 print(next(a))
    8 
    9 <<<1

    上述代码就是一个经典的生成器,也就是函数里边加入了yield。(在python2中 是a.next(),而在3中,则是next(a)这种调用方法。)

    注意生成器里边是不会return回值的,如果你写了return只会是输出到边界时候出现的错误会返回你要return的值。

    还有一个需要注意的是send函数。

     1 def gen():
     2     value=0
     3     while True:
     4         receive=yield value
     5         if receive=='e':
     6             break
     7         value = 'got: %s' % receive
     8  
     9 g=gen()
    10 print(g.send(None))     
    11 print(g.send('aaa'))
    12 print(g.send(3))
    13 print(g.send('e'))
    14 
    15 输出为:
    16 0
    17 got: aaa
    18 got: 3
    19 Traceback (most recent call last):
    20 File "h.py", line 14, in <module>
    21   print(g.send('e'))
    22 StopIteration
    1. 通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。
    2. 通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。
    3. 通过g.send(3),会重复第2步,最后输出结果为”got: 3″
    4. 当我们g.send(‘e’)时,程序会执行break然后推出循环,最后整个函数执行完毕,所以会得到StopIteration异常。

    另外还有一个close()函数,使用生成器调用之后就会关闭,继续next就会抛出错误。

  • 相关阅读:
    tee & vim
    xml ui
    Maven多模块项目打包前的一些注意事项(打包失败)
    jdk11+ spring5+ 报反射错误的屏蔽方法
    Plugin 'org.springframework.boot:spring-boot-maven-plugin:' not found 用IDEA创建springboot项目的时候遇到的一些坑
    如何在Zynq-7000上烧写PL Image
    python3 使用ssl安全连接发送邮件
    Centos7 启动指定docker容器报错
    Linux下多进程编程
    make的变量及赋值运算
  • 原文地址:https://www.cnblogs.com/lixiaofou/p/7814606.html
Copyright © 2011-2022 走看看