第八章、生成器
一、什么是生成器
生成器本质是迭代器,不仅仅是迭代器,除了迭代器的作用其他作用也没多少,生成器提供了方便的自定义迭代器的途径。
二、yield关键字
迭代器具有__iter__
h和__next__
的方法
def func():
return 123
f = func():
print(f) #123
#我们调用了func函数,那他当然是123了
然后我们看return和yield有什么区别吧
def func():
yield 456 # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 12345 # 一个yield对应一个next
print(369789)
f = func() #生成器
print(f) # <generator object func at 0x000001F0E44237D8>
f_iter = f.__iter__()
print(f_iter.__next__())#123
print(f_iter.__next__())#12345
print(f_iter.__next__())#报错
#但是这样的话会报错,有多少yield关键字就有多少next,next多了会报错StopIteration
然后总结一下:
yield的三个特性
- yield可以把函数变成生成器(自定制的迭代器对象,具有
__iter__
和__next__
方法) - yield可以停止函数,下一次next再次运行yield下面的代码
- 有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错
return的特性
- 返回值
- 终止函数
三、利用yeild关键字制作生成器制作一个range方法
-
首先要把可迭代对象变成迭代器,即使用yield关键字使让range函数成为生成器
-
丢一个10 通过for 循环把range迭代出(for循环使用了next方法的原理)所有的元素0到9
def range(*args):
if len(args)==3:
a=args[0]
while args[1]>a and a>=args[0]:
yield a
a+=args[2]
elif len(args)==2:
if args[0]<args[1]:
a=args[0]
while a>=args[0] and a<args[1]:
yield a
a+=1
elif args[0]>args[1]:
a = 0
while a >= 0 and a < args[0]:
yield a
a += args[1]
elif len(args) == 1:
a=0
while a<args[0]:
yield a
a+=1
for i in range(3,10,3):
print(i)
#调用一下我自己做的函数(其实是生成器)
for i in range(10,3):
print(i)
#结果正确,完美收场
0
3
6
9