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 []          #验证每个生成器只能被取一次

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

  • 相关阅读:
    ES6之主要知识点(二) 变量的解构赋值。默认值
    ES6之主要知识点(一)
    前后端通信
    js 面向对象类
    typeof 、Object.prototype.toString和 instanceof
    原型链 之 对象的创建
    Ueditor1.4.3.3+springMvc+maven 实现图片上传
    Hibernate 根据实体名称得到DB表名以及表对应的Sequence name
    第三章:对象的共享——java并发编程实战
    第二章:线程安全性——java并发编程实战
  • 原文地址:https://www.cnblogs.com/NoteBook3013/p/10253709.html
Copyright © 2011-2022 走看看