(1) 有时候不想让一个函数一下子执行完,比如这个函数很大,把ui线程卡了;又比如这个函数占了很多内存,想用一点释放一点。这就需要分步地执行这个函数。
(2)既然要分步,就得有断点。用yield关键字来作为断点。
(3)本来 分布函数() 这么一写,就该执行了;但是有了yield关键字,处理方式改了。
现在改成,调用了 函数实例.__next__() 或 next(函数实例) ,才执行一小段。
(4)就算只执行了一小段,也得有输入、输出
yield后面的东西,就是输出。
至于yield的输入,默认是None。通过 函数实例.send(输入) ,来把输入赋给yield。(注:这个send还会默认调用__next__)
def 分步函数():
print("开始执行")
print("1")
yield "这里是第一个断点"
print("2")
yield "第二个断点"
print("3")
yield "第三个断点"
print("4")
return "next方法会一直运行到下一个yield, 找不到就报错。return的内容就是报错信息"
a = 分步函数()
rst = a.__next__()
print(rst)
print()
rst = next(a)
print(rst)
print()
rst = next(a)
print(rst)
print()
try:
rst = next(a)
print(rst)
print()
except:
import traceback
print(f"异常:{traceback.format_exc()}")
# for循环默认捕获了异常,并作为结束条件
# a = 分步函数()
# 执行次数 = 0
# for i in a:
# 执行次数+=1
# print(f"------ {执行次数}")
有yield关键字的函数就是生成器。
把这分步函数每一步的返回值,改成更有意义的东西(像是连续数字之类的)。这样,就是一般所说的生成器了。