生成器
在Python中使用了yield的函数被称为生成器(generator)
当一个列表中包含大量元素时,如果一次性生成这些元素并保存在列表中,将占用大量的内存空间,对于这个问题,我们可以通过生成器(generator)来解决,即根据需要进行计算并获取列表中某个元素的值。
对于生成对象,也可以向其他可迭代对象一样使用for循环遍历对象中的每一个元素。
- 代码:
# -*- coding: utf-8 -*-
"""
功能:生成表达式
作者:小小榕
日期:2022年4月11日
"""
# 例子一
# li = []
# for x in range(1, 11):
# li.append(x * x)
# print(li)
li = [x * x for x in range(1, 11)]
print(li)
# 例子二
# li2 = []
# for x in 'abc':
# for y in '123':
# li2.append(x + y)
# print(li2)
li2 = [x + y for x in 'abc' for y in '123']
print(li2)
将列表表达式中的一对中括号改为小括号即可以得到生成器
- 代码:
# -*- coding: utf-8 -*-
"""
功能:生成器
作者:小小榕
日期:2022年4月11日
"""
a = (x * x for x in range(10))
print('a的类型为:',type(a))
for i in a:
print(i, end=' ')
- 结果
如果生成元素的方法比较复杂,不适合用for循环方法实现,我们还可以借助yield关键字利用函数实现生成器的功能。 - 代码
# -*- coding: utf-8 -*-
"""
功能:生成阶乘
作者:小小榕
日期:2022年4月11日
"""
def faclist(n):
result = 1
for i in range(2, n + 1): # 在2至n范围内依次取值
yield result # 遇到yield即暂停执行并返回result,下次执行时继续从此处开始执行
result *= i # 将i乘到result上
for i in faclist(10): # 遍历faclist并输出每个元素的值
print(i, end=' ')
- 结果
例子:使用yield实现斐波那契数列
- 代码
# -*- coding: utf-8 -*-
"""
功能:斐波那契数列
作者:小小榕
日期:2022年4月11日
"""
import sys
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10)
while True:
try:
print(next(f),end=' ')
except StopIteration:
sys.exit()