2.生成器
1.什么是生成器?
生成器(generator)是一种特殊的迭代器,比迭代器更优雅,编写更简单,
2.生成器的两中创建方式:
1.简单的生成器实现:
把列表推倒式[]改为()
2.使用yield创建生成器:
1.假如函数中有yield,则不在是函数,而是一个生成器
2.yield会产生一个断点,暂停函数,挂起函数,保存当前状态
3.假如yield后紧跟一个数据,就会把数据返回,作为next函数或for..in ..迭代出下一个值
4.可以通过next()唤醒生成器,让生成器从断点处继续执行
3.yield实现生成器的执行过程:
1.生成器默认是沉睡的,可以通过next()唤醒生成器
2.第一次唤醒生成器是从函数的起始位置开始的,直到遇见下一个yield,就会暂停函数,挂起函数
3.第二次唤醒生成器是从断点开始,直到又遇见yield
4.当生成器没有了yield,再使用next,则会抛出异常StopIteration
4.send与next唤醒生成器的不同
1.generator.send()与next()都可以唤醒生成器,但send可以传值给断点处
2.使用的方式不同:
next(generator):next是内置的函数
generator.send():是生成器中的方法
3.generator.send(None)等价于next(generator)
4.第一次唤醒生成器时,假如使用send,则只能传Nonem,因为刚开始执行生产器时是没有断点的
4.参考代码:
#1.简单的生成器实现:把列表推倒式[]改为()
# l = [x for x in range(5)]
# print(l)#[0, 1, 2, 3, 4]
# l = (x for x in range(5))#这里创建的是一个迭代对象,也叫生成器对象
# print(l)#<generator object <genexpr> at 0x7f13ae310620>,所以打印的是生成器对象的内存地址
"""
2.使用yield创建生成器:
1.假如函数中有yield,则不在是函数,而是一个生成器
2.yield会产生一个断点,暂停函数,挂起函数,保存当前状态
3.假如yield后紧跟一个数据,就会把数据返回,作为next函数或for..in ..迭代出下一个值
4.可以通过next()唤醒生成器,让生成器从断点处继续执行
"""
class feibo(object):
def __init__(self,n):
self.n = n #记录返回的斐波那契数列的数量
self.a,self.b = 0,1#记录前两位的值为0,1
self.position = 0#记录当前迭代的位置,初始为0
def __iter__(self):
return self#返回一个迭代器,返回自己
def __next__(self):
if self.position < self.n:
num = self.a
# self.a,self.b = self.b,self.a+self.b#斐波那契的规律
self.position += 1
return num
else:
raise StopIteration
def fib(n):
print("----")
position = 0
num1,num2 = 0,1
while position<n:
print("---")
yield num1
num1,num2 = num2,num1+num2
position += 1
#创建生成器
gen = fib(5)
print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
# fib = feibo(10)
#当前用这种方式去遍历使无法取到数据的,因为此时生成器默认是沉睡的,
# 需要通过next()去唤醒,遇到yield在沉睡
# for item in gen:
# print(item)
python3 生成器 (自定义生成器)
最新推荐文章于 2024-05-16 18:15:22 发布