1. yield 中 send 用法
- send 作用
-- 生成器函数返回值给调用方;
-- 调用方通过 send 传入值给生成器函数; - 示例:
>>> def name_func():
... yield_result = 0
... while 1:
... yield_result += 1
... send_value = yield yield_result # 这一句是关键!!!
... print(f"func has been sent value : {send_value}")
...
>>>
>>> gen = name_func()
>>> # print(next(gen))
... print("yield_result : ", gen.send(None)) # 第一次调用, send 传入 None
yield_result : 1
>>> print("yield_result : ", gen.send("lavra"))
func has been sent value : lavra
yield_result : 2
>>> print("yield_result : ", gen.send("hiton"))
func has been sent value : hiton
yield_result : 3
上面的代码示例中,最关键的一句是:send_value = yield yield_result,其中:
-- send_value 是被 send 传入函数的值;
-- yield_result 是返回给调用方 gen 的值;
next 和 send 的区别:
-- next 只能取值;
-- send 能取本次yield的返回值,也能给上次yield传入值;send 注意点:
-- 第一个 send 不能给 yield 传值,必须要 send None,这一步不能省!应用示例
>>> def url_repository():
... url_list = []
... while True:
... # _url 是 send 发送给 yield 的参数值,在接下来的语句中使用,
... _url = yield url_list # url_list是 yield 的返回值
... url_list.append(_url)
... print(f"ADD URL : {_url}")
...
>>>
>>> g = url_repository() # 实例化生成器函数
>>> g.send(None) # 第一次调用, send 传入 None
[]
>>> print("URL REPO : ", g.send('url_1')) # g.send() 返回 url_list
ADD URL : url_1
URL REPO : ['url_1'] # 打印 yield 返回的 url_list
>>> print("URL REPO : ", g.send('url_2'))
ADD URL : url_2
URL REPO : ['url_1', 'url_2']
>>> print("URL REPO : ", g.send('url_3'))
ADD URL : url_3
URL REPO : ['url_1', 'url_2', 'url_3']
2. yiled from 用法
- 下面是一个 yiled 生成器:
>>> def func():
... for num in range(0, 5):
... yield num
...
>>>
>>> g = func()
>>> print(next(g))
0
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
3
>>> print(next(g))
4
>>> print(next(g))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
- 我们可以将其改成如下代码:
>>> def func():
... yield from range(5)
...
>>>
>>> g = func()
>>> print(next(g))
0
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
3
>>> print(next(g))
4
>>> print(next(g))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration