二、生成器:是一个特殊的迭代器
(2.1) 列表推导式和for循环迭代
# #列表推导式
list1=[i for i in range(1,11)]
print(list1)
#for循环迭代
for i in list1:
print(i)
(2.2)生成器的第一种: 列表推导式外面的中括号改成括号
list2=(i for i in range(1,101))
print(list2) #不是元组,而是一个生成器对象.
#for循环迭代
for i in list2:
print(i)
(2.3)生成器的第二种: 一个函数里面拥有一个关键字 yield
def
-函数 : 不在类里面,然后内部代码没有关键字yield
-方法 : 在类里面是方法
-生成器模板: 只需要内部拥有关键字yield,就成了生成器模板
案例:使用生成器模板演示斐波那契数列:1,1,2,3,5,8,13,21,34,55,89....
def fun_bo(position): #想拿第几位参数;
#初始化值
a,b=1,1
#循环变量
i=0
#while循环
while i<position:
# print(a) #打印
return a
a,b=b,a+b #赋值
i+=1 #改变初值
print(fun_bo(10))
说明:修改返回return, 但只返回1 、 原因:return: 一旦被执行, 整个函数直接结束
解决:使用生成器模板来解决这个问题
# 生成器模板
def fun_bo(position): #想拿第几位参数;
#初始化值
a,b=1,1
#循环变量
i=0
#while循环
while i<position:
# return a
#换成yield
yield a
a,b=b,a+b #赋值
i+=1 #改变初值
#生成器对象
result=fun_bo(10)
# for循环迭代取值 next函数 >>> __next__方法得到他的返回值
f1=next(result)
f2=next(result)
f3=next(result)
print(f1,f2,f3)
print('-'*30)
for i in result:
print(i,end=' ')
小结:
迭代器: 模板里面拥有 (1) __iter__方法 (2) __next__方法 生成器: 因为他内部既没有 (1) __iter__ (2) __next__ 但是能够完成迭代器能够做到的事情,所以是特殊的迭代器
(2.4)关键字 yield作用:
1.类似return, 可以返回数据出去。
2.跟return又不同,不会直接结束整个代码的运行
3.执行到yield,会暂停,再次启动的时候,从哪里暂停,就从哪里开始
4.用next函数去触发生成器模板,调用生成器.....
yield可以暂停挂起机制
生成器模板
def fun_bo(position):
print('---------1---------')
a,b=1,1
i=0
while i<position:
print('---------2---------')
yield a # 生成器模板被调用一次,执行了yield的,那么就进行了暂停,
print('---------3---------')
a,b=b,a+b
i+=1
print('---------4---------')
#生成器对象
result = fun_bo(10)
#手动next取值
f1 = next(result) # 第一次启动生成器模板, 在yield执行之后进行了暂停
print(f1)
print("*" *40)
# 第二次调用生成器模板
f2 = next(result) # 第二次启动生成器模板, 在yield执行之后进行了暂停
print(f2)
print("*" *40)
# 第三次调用生成器模板
f3 = next(result) # 第三次启动生成器模板, 在yield执行之后进行了暂停
print(f3)
说明:生成器模板首次被启动,是从头开始执行,在执行了yield之后,暂停挂起 之后再次调用,就从暂停位置开始,不再从头调用.