使用send给生成器注入数据
创始人
2024-02-10 17:39:02
0

使用send给生成器注入数据

1.概述

当生成器函数需要接收一个可变的动态的参数来改变函数输出结果时,我们可以考虑使用send方法。

2.send方法介绍

2.1.send方法简介

迭代器有一个send方法,可以将动态的数据注入到生成器函数中。

  • send方法和next方法非常像,他比next方法多了一个传入参数的功能。
  • send方法的参数就是给生成器注入的数据。
  • send方法的返回值是生成器输出的下一个值。

2.2.send方法demo示例

1.没有使用send方法遍历生成器

# 定义生成器函数
def my_generator():received = yield 1print(f'received = {received}')# 调用生成器获取迭代器对象
it = iter(my_generator())
# 获取迭代器值
output = next(it)
print(f'output = {output}')
try:# 因为生成器只输出了一个值,再次获取值时为Nonenext(it)
except StopIteration:pass

运行上面的代码查看结果

output = 1
received = None

2.使用send方法为生成器注入数据

# 定义生成器函数
def my_generator():received = yield 1print(f'received = {received}')# 调用生成器获取迭代器对象
it = iter(my_generator())
# 通过send方法获取生成器的值
output = it.send(None)
print(f'output = {output}')try:# send方法向生成器注入数据,并获取它返回的数据it.send('hello')
except StopIteration:pass

运行上面的代码查看结果,生成器输出了shend方法注入的hello参数。

output = 1
received = hello

3.send方法使用案例

在使用send方法获取生成器值的时候,传入的参数会成为生成器上一条yield表达式的值,生成器拿到这个值后会运行下一条yield表达式哪里。因此刚开始运行生成器的时候,他是从头执行的,这个时候生成器还没有产出数据,所以首次调用send方法时,只能传入None,要是传入其他值,就会抛出异常。

def wave_send(steps):step_size = 2 * math.pi / steps# 接收send方法注入的数据amplitude = yieldfor step in range(steps):radians = step * step_sizefraction = math.sin(radians)output = amplitude * fraction# yield右侧是生成器输出的值,左侧是将send参数赋值给amplitudeamplitude = yield output# 接收wave_send生成器的输出值
def transmit_send(output):if output is None:print(f'Output is None')else:print(f'Output: {output:>5.1f}')# 调用生成器
def run_send(it):amplitudes = [None, 2, 5, 7, 8, 5, 6, 4, 3, 3]for amplitude in amplitudes:# 通过send方法给生成器注入数据,send返回值是生成器输出的值。output = it.send(amplitude)transmit_send(output)run_send(wave_send(12))

运行上面代码,amplitude值动态变化使生成器的结果随之改变。

Output is None
Output:   0.0
Output:   2.5
Output:   6.1
Output:   8.0
Output:   4.3
Output:   3.0
Output:   0.0
Output:  -1.5
Output:  -2.6

4.迭代器替代send向一组生成器注入数据

如果我们需要调用多个生成器时候,是不建议使用send方法,它有两个弊端。

  • 每个生成器开头都会输出none
  • 这些生成器通过send方法传来的值决定这条语句的求值结果,并把结果放在amplitude变量里计算下一次应该输出的值,这时就必须先把该生成器第一条yield语句运行过去,导致后面嵌套的生成器各自从amplitude列表里浪费掉一个值。最后那个嵌套的生成器就要少执行n次。

1.send向一组生成器注入数据示例

def complex_wave_moudulating():# 通过yield from可以将多个生成器连接使用yield from wave_send(3)yield from wave_send(4)yield from wave_send(5)run_send(complex_wave_moudulating())

运行上面的代码,输出结果显示输出了三个None,并且最后一个生成器值丢失。

Output is None
Output:   0.0
Output:   4.3
Output:  -6.1
Output is None
Output:   0.0
Output:   6.0
Output:   0.0
Output:  -3.0
Output is None

2.迭代器替代send

# amplitude_it是一个迭代器
def wave_cascading(amplitude_it, steps):step_size = 2 * math.pi / stepsfor step in range(steps):radians = step * step_sizefraction = math.sin(radians)# 从迭代器中获取一个值amplitude = next(amplitude_it)output =  amplitude * fractionyield outputdef complex_wave_moudulating(amplitude_it):yield from wave_cascading(amplitude_it, 3)yield from wave_cascading(amplitude_it, 4)yield from wave_cascading(amplitude_it, 5)def transmit_moudul(output):if output is None:print(f'Output is None')else:print(f'run_cascading: {output:>5.1f}')
def run_cascading():amplitudes = [2, 5, 7, 8, 5, 6, 4, 3, 3]# 使用iter返回一个迭代器对象it = complex_wave_moudulating(iter(amplitudes))for amplitude in amplitudes:output = next(it)transmit_moudul(output)
run_cascading()

运行上面的代码查看结果

run_cascading:   0.0
run_cascading:   4.3
run_cascading:  -6.1
run_cascading:   0.0
run_cascading:   5.0
run_cascading:   0.0
run_cascading:  -4.0
run_cascading:   0.0
run_cascading:   2.9

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...