生成器
- 生成器是可以动态(循环一次计算一次返回一次)提供数据的可迭代对象(所以属于可迭代对象,即有__iter__()和__next__())
- 不必创建容器存储完整的结果,而节省内存空间(延迟/惰性操作)
- 含有yield语句的函数为生成器函数,返回值为生成器对象
普通可迭代对象和生成器对比
定义函数,获取列表中所有偶数
list01 = [4,54,65,6,76,87,9]
#传统方式
def get_even01():
#做一个容器来存储数据
result = []
for item in list01:
if item % 2 == 0:
result.append(item)
return result
re = get_even01()
for item in re:
print(item)
#使用生成器技术
def get_even02():
for item in list01:
if item % 2 == 0:
yield item #yield是生成器的关键词
re = get_even02() #返回一个生成器对象
for item in re: #使用for来迭代re,因为生成器也是可迭代对象(有__iter__()方法)
print(item)
使用生成器的最大作用是节省内存
yield语句
def f1():
for i in range(2):
yield i
g = f1()
print(g.__next__()) #0
print(g.__next__()) #1
print(g.__next__()) #抛出异常StopIteration
#为了不抛出异常,改写上面的代码
def f1():
for i in range(2):
yield i
g = f1()
while True:
try:
print(g.__next__())
except Exception as e: #捕获异常,结束循环
break