目录
- 一、生成器
- yield关键字
- 使用生成器自定制一个range方法
- 二、生成器表达式
一、生成器
生成器: 是自定义的迭代器,生成器就是迭代器(自己造出来的)
生成器必须使用yield关键字
yield关键字
yield的三个特性:
- yield可以把 函数 变成生成器(自定制的迭代器对象,具有
__iter__
和__next__
方法) - yield可以停止函数,再下一次next再次运行yield下面的代码
- 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错
例子:(请仔细观看打印结果)
# 例子
def func():
yield [1,1,23] # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 101112 # 一个yield对应一个next
print(131415)
f = func() # 调用func()函数 会得到生成器对象
try:
print("执行一次__next__会运行一次yield之前的代码",f.__next__()) # [1, 1, 23]
print("停止迭代")
print("执行一次__next__会运行一次yield之前的代码",f.__next__()) # 101112
print("停止迭代")
print("继续__next__,会执行上一次yield后的代码",f.__next__()) # 直到它遇到 StopIteration 异常为止。
except:
print("遇到异常了")
执行一次__next__
会运行一次yield之前的代码 [1, 1, 23]
停止迭代
789
执行一次__next__
会运行一次yield之前的代码 101112
停止迭代
131415
遇到异常了
使用for循环的例子:
牢记:生成器 就是 (自定制的迭代器对象)
# 例子
def func():
yield [1,1,23] # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 101112 # 一个yield对应一个next
print(131415)
# 还记得for循环原理。使用for循环原理进行循环迭代器对象。异常就退出
for i in func(): # 使用for循环迭代生成器(自定制的迭代器对象)
print(i)
使用生成器自定制一个range方法
# 用生成器自定制一个range方法
def func(*args):
step = 1 # 步长
start = 0 # 起始
end = 0 # 范围
if len(args) == 1:
start = 0
end = args[0]
elif len(args) == 2:
start = args[0]
end = args[1]
elif len(args) == 3:
start = args[0]
end = args[1]
step = args[2]
while start < end:
yield start
start += step
for i in func(10): # 自己实现的range方法,可以实现3个可变长位置参数。
print(i)
二、生成器表达式
生成器表达式就是:把列表推导式的[]换成()
用法:
lt = (i for i in range(100)) # 生成器表达式
print(lt) # 生成器对象
print(lt.__next__()) # 迭代一次迭代器()
# 使用for循环迭代生成器对象
for i in lt: # 因为next方法迭代了一次.就会从1开始
print(i)