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

    函数中,只要出现yield就是一个生成器:

    1 def func(a,b):
    2 
    3     if a<b:                      #有yield的函数就会形成一个生成器,不是函数!!!
    4         yield  5                 #yield可以返回后面的值,但是每碰执行一个__next__才会返回
    5     else:
    6         return "没了"            #有yield的函数,即便有return也不会执行.要不走yield或者报错,StopIteration
    7 print(func(1,3))
    8 print(func(3,1))
    9 print(func(1,3).__next__())

    结果对照:

    1 <generator object func at 0x00000149171421B0>
    2 <generator object func at 0x00000149171421B0>
    3 5
    1 def func(a,b):
    2 
    3     if a<b:                      #有yield的函数就会形成一个生成器,不是函数!!!
    4         yield  5                 #yield可以返回后面的值,但是每碰执行一个__next__才会返回
    5     else:
    6         return "没了"            #有yield的函数,即便有return也不会执行.要不走yield或者报错,StopIteration
    7 print(func(1,3))
    8 print(func(3,1))
    9 print(func(3,1).__next__())

    结果对照:

    1 <generator object func at 0x00000233FCD221B0>
    2     print(func(3,1).__next__())
    3 StopIteration: 没了

     __next__与send()的区别:

    1 def func():
    2     print(44)
    3     l = yield 89                #将898值返回出去,但不继续执行
    4     print(l)
    5     yield 99
    6 s = func()
    7 print(s.send(None))             #send可以做第一次__next__,但是参数必须是None否则会报错
    8 print(s.__next__())      

    结果对照:

    1 44
    2 89
    3 None
    4 99

     总结:

    #程序执行yield时候,先将右侧返回,但不向下继续执行..可以理解return是返回后结束,yield是返回后暂停,yield后面没有值也默认返回None
    #__next__和send(None)是一样的,__next__默认是send()参数是传None
    1 def func():
    2     for i in range(4):
    3         yield i
    4 g = func()
    5 print(g.__next__())             #从生成器g中取出一个值
    6 print(list(func()))             #这步重新生成一个生成器
    7 for i in g:
    8     print(i)                   #
    9 print(list(g))                 #再次看一下生成器g

    结果对照:

    1 0
    2 [0, 1, 2, 3]
    3 1
    4 2
    5 3
    6 []          #验证每个生成器只能被取一次

    生成器具有,惰性机制,不使用就不会干活..并且每个生成器只能一个一个取,只取一次

  • 相关阅读:
    360浏览器自动填写用户名和密码、下拉框解决办法
    实用JAVA工具类网站
    JQuery中ajaxSubmit,在ie或360兼容,提交后台不能获得参数
    java中形参的可变参数的定义(如String... args) .
    用sqldeveloper连接数据库
    ORA-12541:TNS:无监听程序问题
    小工具:生成半透明背景色的 CSS 代码,不影响子元素透明度
    JQuery使用小结
    ajaxSubmit 在ie9或360兼容中,form下是空的
    ajax 跨域请求数据 jsonp 示例
  • 原文地址:https://www.cnblogs.com/NoteBook3013/p/10253709.html
Copyright © 2011-2022 走看看