python学习笔记:yield“制造”的生成器(generator)

一、语句形式

  • yield < expression / statement >

二、性质

  • yield仅用于生成器的定义函数中,出现yield的函数一定是生成器函数。

三、执行过程

当调用一个包含yield语句的生成器时,返回该迭代器/生成器,具体执行过程分为两种情况:

  • 情况1:当__next__( )、send( )等生成器方法被调用时:

    (1)此时生成器函数开始执行,执行至第一个yield表达式/语句,返回所有语句及yield语句,生成器暂停

    (2)当再次遇到情况1时,生成器从上次暂停的地方继续执行,直至再次遇到yield语句。

       ☆注意:并不是重新调用生成器,而是继续执行函数!

  • 情况2:当生成器被for循环调用时(常用)

    (1)此时生成器函数开始执行,直至生成器抛出stopIteration异常(即生成器函数完全执行结束)。

       也就是说:此情况下输出结果等价于将yield换成return的普通函数执行结果,却可以不受输入量大小的影响,执行时内存消耗低。

##case1
def foo1():
    print(" foo1 is starting...")
    while True:
        res = yield 4   #这里res并未被赋值,可以将yield看作return
        print("res:", res)       

a=foo1()
print(next(a))
>>foo1 is starting...   
  4                    #遇到res= yield 4暂停,返回4
print(next(a))         #继续执行print("res:", res)语句,由于res在此前未被赋值,res=None
>>res: None  
  4                    #遇到res= yield 4暂停,返回4,res仍未被赋值          
print(a.send(7))       #继续执行print("res:", res)语句,并对将7传入此时的local variabl(res)
>>res: 7
  4                    #遇到res= yield 4暂停,返回4,此时res重新为None
##case 2
def foo2(num):
    print("foo2 is staring...")
    while num<5:
        num+=1
        yield num

for i in foo2(0):
    print(i)
>>foo2 is starting...
  1
  2
  3
  4
  5

result=list(foo2(0))  
print result
>>foo2 is starting...
  [1,2,3,4,5] 

 

你可能感兴趣的:(python学习笔记:yield“制造”的生成器(generator))