生成器generator
1. 定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
2. 作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间。数据量越大,优势越明显。
3. 以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才计算结果,而不是一次构建出所有结果。
生成器函数
1. 定义:含有yield语句的函数,返回值为生成器对象。
2. 语法
– 创建:
def 函数名():
…
yield 数据
…
– 调用:
for 变量名 in 函数名():
语句
3. 说明:
– 调用生成器函数将返回一个生成器对象,不执行函数体。
– yield翻译为”产生”或”生成”
4. 执行过程:
(1) 调用生成器函数会自动创建迭代器对象。
(2) 调用迭代器对象的__next__()方法时才执行生成器函数。
(3) 每次执行到yield语句时返回数据,暂时离开。
(4) 待下次调用__next__()方法时继续从离开处继续执行。
5. 原理:生成迭代器对象的大致规则如下
– 将yield关键字以前的代码放在next方法中。
– 将yield关键字后面的数据作为next方法的返回值。
“”"
yield
练习:exercise01
"""
class MyRange:
"""
可迭代对象
"""
def __init__(self, stop):
self.__stop = stop
# 程序执行过程:
# 调用不执行
# 调用__next__才执行
# 到yield暂时离开
# 再次调用__next__继续执行
# ...
# 程序执行原理: "你看见的代码,实际不是这个样子"
# 将yield关键字以前的代码定义到next方法中
# 将yield关键字以后的数据作为next方法返回值
# def __iter__(self):
# print("准备数据")
# yield 0
#
# print("准备数据")
# yield 1
#
# print("准备数据")
# yield 2
#
# print("准备数据")
# yield 3
#
# print("准备数据")
# yield 4
def __iter__(self):
begin = 0
while begin < self.__stop:
yield begin# 暂时离开,再次调用继续执行
begin += 1
mr = MyRange(10)
iterator = mr.__iter__()
while True:
try:
# 2. 获取下一个元素
item = iterator.__next__()
print(item)
# 3. 如果没有元素则结束循环
except StopIteration:
break
# for item in MyRange(5):
# print(item) # 0 1 2 3 4
# 循环一次 计算一个 返回一个
# for item in MyRange(99999999999999999999999999999999999999999):
# print(item)
"""
生成器表达式
练习:exercise05
"""
list01 = [43, 4, 54, 5, 66, 77]
# 将list01中所有元素增加10之后,存入list02
# list02 = []
# for item in list01:
# list02.append(item + 10)
list02 = [item + 10 for item in list01]
# for item in list02:
# print(item)
# -------------------------------------------------
# -------------------------------------------------
# def get_elements():
# for item in list01:
# yield item + 10
# generate01 = (item + 10 for item in list01)
# for item in generate01:
# print(item)
for item in (item + 10 for item in list01 if item % 2):
print(item)