生成器
一、什么是生成器
生成器本质上就是迭代器,同时也不仅仅是迭代器,除了迭代器其他用途也不是很多,所以他其实就是一个自定义迭代器
二、yield关键字
在这之前我们先来看看什么是迭代器对象,也就是迭代器对象具有
具有__iter__
, __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__())
print(f_iter.__next__())
print(f_iter.__next__())
这就表现出了return
和yield
的区别
二、yield和return的区别
yield的三个特性
1.yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__
和__next__
方法)
2.yield可以停止函数,下一次next再次运行yield下面的代码
3.有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错
return的特性
1.返回值
2.终止函数
二、用生成器自定制一个range方法
- 生成一个可迭代器对象 --- 》 我要把我的range函数变成一个可迭代对象(迭代器对象)
- 丢一个10进去,然后通过for循环的迭代next会丢出0,1,2,3,4,5,6,7,8,9
def range(x):
count = 0
while count < x:
yield count
count += 1
for i in range(10):
print(i)
def range (start,end,step): #有三个参数的range循环
start = 0
while start<end:
yield start
start +=step
for i in range(1,20,2):
print(i)