1 yield 用法理解
带yield 的函数是一个生成器, 想要调用函数必须使用 next() 函数调用, 单纯的使用 t = test() 并不会使程序执行 (含有yield 关键字的函数不能当作函数来使用)
yield 相当于 return, 会返回一个值, 同时后面的函数不在执行
当使用 next() 时, 函数会接着 yield 后面的程序继续执行
2 示例
def test():
print("--------Test starting------")
while True:
a = "a is unassigned!!!"
print(a)
a = yield "--------Test over----------"
print(a)
t = test()
print(next(t))
print("*" * 20)
print(next(t))
>>> --------Test starting------
>>> a is unassigned!!!
>>> --------Test over----------
>>> ********************
>>> None
>>> a is unassigned!!!
>>> --------Test over----------
由上面程序可知, 调用 next() 使生成器执行, 遇到 yield 关键字时返回对应参数, 并停止, 再次调用 next() 程序继续接着 yield 后面的语句执行, 但是 a 并没有被赋值
def test():
print("--------Test starting------")
while True:
a = "a is unassigned!!!"
print(a)
a = yield "--------Test over----------"
print(a)
t = test()
print(next(t))
print("*" * 20)
print(t.send("a is assigned!!!"))
>>> --------Test starting------
>>> a is unassigned!!!
>>> --------Test over----------
>>> ********************
>>> a is assigned!!!
>>> a is unassigned!!!
>>> --------Test over----------
通过 send() 对 a 进行赋值同时生成器继续执行, 即先对 a 赋值, 再调用 next()
3 优点
相比与 list[1, 2, ..., 9999] 来说节省内存