一、生成器说明
二、创建生成器的方法:
1、将之前所学的列表推导式的中括号改为小括号:
a、列表推导式(占用空间)
示例1:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
nums = [x*2 for x in range(5)]
print(nums)
for num in nums:
print(num)
运行结果:
b、生成器
生成器代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
nums = (x*2 for x in range(5))
print(nums)
for num in nums:
print(num)
运行结果:
2、自定义一个函数,在函数中使用【yield】关键字该函数变为生成器。
斐波那契数列:
a、普通函数(占用空间)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def create_num(all_nums):
a, b = 0, 1
current_num = 0
while current_num < all_nums:
print(a)
a, b = b, a+b
current_num += 1
create_num(10)
运行结果:
0
1
1
2
3
5
8
13
21
34
b、使用生成器
3、生成器执行流程:
a、调用函数后,并且使用for循环对创建的生成器对象进行遍历。
b、第一次开始执行时,程序走到【yield】关键字处,此时程序会暂停执行,
并把【yield】关键字后面的值返回给for循环的变量num中。
c、除了第一次执行时,程序是按从头到尾的顺序执行,
其它次数的执行都是从【yield】关键字处开始执行的。
d、直到生成器中的while循环条件为假时,则取值结束。
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def create_num(all_nums):
a, b = 0, 1
current_num = 0
while current_num < all_nums:
yield a
a, b = b, a+b
current_num += 1
obj = create_num(10) # 无结果,创建了一个生成器对象
for num in obj:
print(num)
运行结果:
三、生成器可以使用【next】方法取出值
即:yield后面的返回值是什么,则通过【next】函数取出来。
1、示例
要求:在斐波那契数列中加入打印功能,查看程序的执行流程。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def create_num(all_nums):
print("-----1-----")
a, b = 0, 1
current_num = 0
while current_num < all_nums:
print("-----2-----")
yield a
print("-----3-----")
a, b = b, a+b
current_num += 1
print("-----4-----")
obj = create_num(10) # 无结果,创建了一个生成器对象
print(next(obj)) # 取第一个值
print(next(obj)) # 取第二个值
运行结果: