第四十六节,生成器函数和迭代器
生成器函数
生成器函数就是通过特殊改装过的函数
yield函数关键字,只要函数里写了yield关键字,这个函数就叫做生成器函数
执行函数内部是一旦遇到yield关键字会自动退出函数
生成器函数返回的是一个生成器对象
#!/usr/bin/env python # -*- coding:utf8 -*- def asd(): print(1) yield 1 print(2) yield 2 print(3) yield 3 print(4) yield 4 a = asd() print(a) # 输出 # <generator object asd at 0x0000008903305990>
__next__()获取生成器方法
功能:__next__()用于执行生成器函数里yield关键字之前的代码,和返回yield关键字的返回值,也就是去函数里找yield关键字来执行yield之前的代码,一旦遇到yield关键字,退出函数返回yield的返回值,如果没有yield则报错,注意函数里有多个yield,只能获取到第一个,因为函数执行内部时一旦遇到yield关键字就会退出函数,再次运用__next__方法时会从上一次yield退出的地方开始执行函数内部,再次遇到yield关键词会再次退出,依次循环, 所以有几个yield关键字,就可以用几个__next__方法来获取和执行函数内部,
#!/usr/bin/env python # -*- coding:utf8 -*- def asd(): print(11) #函数内部代码 yield 1 #yield关键字返回值 print(22) yield 2 print(33) yield 3 print(44) yield 4 a = asd() b = a.__next__() print(b) b = a.__next__() print(b) # 11 函数内部代码 # 1 yield关键字返回值 # 22 函数内部代码 # 2 yield关键字返回值
用生成器函数,生成0到5的数
#!/usr/bin/env python # -*- coding:utf8 -*- def range_1(n): #创建生成器函数 srt = 0 #定义一个值 while True: #循环 if srt > n: #判断定义值大于接收值时 return #定义值大于接收值时退出整个函数 yield srt #yield关键字返回yield值 srt += 1 #每一次循环让定义值加1 a = range_1(5) b1 = a.__next__() #__next__方法获取第一次循环的yield返回值 b2 = a.__next__() #__next__方法获取第二次循环的yield返回值 b3 = a.__next__() #__next__方法获取第三次循环的yield返回值 b4 = a.__next__() #__next__方法获取第四次循环的yield返回值 b5 = a.__next__() #__next__方法获取第五次循环的yield返回值 b6 = a.__next__() #__next__方法获取第六次循环的yield返回值 print(b1,b2,b3,b4,b5,b6) # 输出 # 0 1 2 3 4 5
迭代器
迭代器,就是能用生成器对象,从头到尾迭代执行生成器函数内部得到结果的方法
__next__()方法迭代器
#!/usr/bin/env python # -*- coding:utf8 -*- """生成器""" def range_1(n): #创建生成器函数 srt = 0 #定义一个值 while True: #循环 if srt > n: #判断定义值大于接收值时 return #定义值大于接收值时退出整个函数 yield srt #yield关键字返回yield值 srt += 1 #每一次循环让定义值加1 a = range_1(5) """迭代器""" b1 = a.__next__() #__next__方法获取第一次循环的yield返回值 b2 = a.__next__() #__next__方法获取第二次循环的yield返回值 b3 = a.__next__() #__next__方法获取第三次循环的yield返回值 b4 = a.__next__() #__next__方法获取第四次循环的yield返回值 b5 = a.__next__() #__next__方法获取第五次循环的yield返回值 b6 = a.__next__() #__next__方法获取第六次循环的yield返回值 print(b1,b2,b3,b4,b5,b6) # 输出 # 0 1 2 3 4 5
for循环迭代器
for循环底层封装的也是__next__()方法
#!/usr/bin/env python # -*- coding:utf8 -*- """生成器""" def range_1(n): #创建生成器函数 srt = 0 #定义一个值 while True: #循环 if srt > n: #判断定义值大于接收值时 return #定义值大于接收值时退出整个函数 yield srt #yield关键字返回yield值 srt += 1 #每一次循环让定义值加1 a = range_1(5) """迭代器""" for i in a: #用for迭代循环出生成器对象里的数据 print(i) #每一次循环打印出数据 # 输出 # 0 # 1 # 2 # 3 # 4 # 5