Study notes (37): Python programming -yield achieve actual generator

Learning immediately: https://edu.csdn.net/course/play/19711/255579?utm_source=blogtoedu

 1.yield = return + generator

a yield is returned is a generated object, the function is iterated again and again by the next function to obtain a result, and after the sucked return function returns a result, there is no relationship with the function

# #单步生成
#
def gererator():#由于yield的存在,使得这个函数是一个生成器
    print('[gererator]yield执行前')
    yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错
    print('[gererator]yield执行后')

def main():

    res = gererator()#获取生成器对象
    print(res)#<generator object gererator at 0x0000018503A15930>
    print(next(res))#运行生成器函数,打印返回的数据

if __name__ == '__main__':
    main()
'''
<generator object gererator at 0x0000016197635930>
[gererator]yield执行前
iterm = 1

'''


# #错误的示例
def gererator():#由于yield的存在,使得这个函数是一个生成器
    print('[gererator]yield执行前')
    yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错
    print('[gererator]yield执行后')

def main():

    res = gererator()#获取生成器对象
    print(res)#<generator object gererator at 0x0000018503A15930>
    print(next(res))#运行生成器函数,打印返回的数据
    print(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错
    print('*****************')

if __name__ == '__main__':
    main()

'''
    从运行的结果可以看出,两次使用next函数,第一次运行函数,遇到yield停止,第二次继续在yield处开始运行,但是因为没有返回,所以代码停在了生成器中,即停止了迭代,进而在main函数中的 print('*****************')代码也没有执行就直接报错了

<generator object gererator at 0x0000019059B95480>
Traceback (most recent call last):
[gererator]yield执行前
  File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 39, in <module>
iterm = 1
    main()
[gererator]yield执行后
  File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 35, in main
    print(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错
StopIteration
'''

# 错误的示例修正+send函数使用,send函数可以向生成器中发送数据,由yield接收
def gererator():#由于yield的存在,使得这个函数是一个生成器
    print('[gererator]yield执行前')
    res = yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错
    print('[gererator]yield执行后')
    print('[generetor]%s'%res)
    yield

def main():

    res = gererator()#获取生成器对象
    print(res)#<generator object gererator at 0x0000018503A15930>
    print(next(res))#运行生成器函数,打印返回的数据
    res.send("【main】这是由send发送给生成器的数据")
    print('*****************')


if __name__ == '__main__':
    main()

'''
<generator object gererator at 0x0000021F62065480>
[gererator]yield执行前
iterm = 1
[gererator]yield执行后
[generetor]【main】这是由send发送给生成器的数据
*****************
'''

import time
#指定迭代的最大次数,可以减少内存的占用
def gererator(maxnum):#由于yield的存在,使得这个函数是一个生成器
    for i in range(1,maxnum):
        print('************start*****************')
        yield ('迭代数据%s'%i)
        print('************end*****************\n\n')
        time.sleep(0.5)

def main():
    for i in gererator(50):
        print(i)


if __name__ == '__main__':
    main()
'''
************start*****************
迭代数据1
************end*****************


************start*****************
迭代数据2
************end*****************


************start*****************
迭代数据3
************end*****************


************start*****************
迭代数据4
************end*****************


************start*****************
迭代数据5
************end*****************


************start*****************
迭代数据6
************end*****************


************start*****************
迭代数据7
************end*****************


************start*****************
迭代数据8
************end*****************


************start*****************
迭代数据9
************end*****************


************start*****************
迭代数据10
************end*****************
'''

 

2.yield from itermable: generating constructed by iterables, iterables generally: a list of tuples, generators, etc.

def iterator(n=101):#迭代器,生成一个列表,作为可迭代的对象
    a = []
    for i in range(1,n):
        a.append(i)
    return a

def generator():#生成器,根据列表这个可迭代对象来创建生成器
    a_list = iterator()
    yield from a_list

def main():#从生成器中打印出数据
    for i in generator():
        print(i,end='、')


if __name__ == '__main__':
    main()

 

Published 61 original articles · won praise 11 · views 890

Guess you like

Origin blog.csdn.net/qq_45769063/article/details/105171104