使用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

使用send给生成器注入数据相关推荐

  1. SpringBoot注入数据的方式

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:胖先森 juejin.im/post/5c1f119ee51 ...

  2. 基于注解的 IOC 配置——创建对象(Component、Controller、Service、Repository)注入数据(Autowired、Qualifier、Resource、Value)

    基于注解的 IOC 配置 注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. XML的配置: 用于创建对象的 用于注入数据的 用于改变作用范围的 生命周期相 ...

  3. mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...

    1.什么是生成器 我们可以把生成器理解为一个高端的列表.生成器就是一个集算法和列表还有依次读取于一体的功能.因为如果列表存储的内容过多就会造成内存的浪费.但是如果"列表"内的元素可 ...

  4. PB Send()函数应用有关数据整理

    PB Send()函数应用有关数据整理 Send()函数定义:Send(handle,message#,lowword,long) 其中的message#是一个UnsignedIntege,就是WM_ ...

  5. python3 生成器的send_Python3基础 yield send 获得生成器后,需要先启动一次

    ? ???????Python : 3.7.3 ?????????OS : Ubuntu 18.04.2 LTS ????????IDE : pycharm-community-2019.1.3 ?? ...

  6. uid 生成器(数据区主键)

    /*** uid 生成器* uid作为数据库主键 最好有序递增*/ public class IdProvider {// id类型 0-99public enum IdType {PRINCE(1) ...

  7. php. 生成器 send,PHP生成器细说

    之前写过关于生成器的文章,可能还不够详细,正好群里有朋友在讨论.觉得还是有必要再细说下,如果大家做过Python或者其他语言的,对于生成器应该不陌生.生成器是PHP 5.5.才引入的功能,也许大家觉得 ...

  8. 【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入

  9. 写出高效率python的90个方法,附案例(python3经典编程案例)

    Effective Python摘录. 一. 培养Pythonic思维 1. 查询自己使用的python版本 import sys print(sys.version_info) print(sys. ...

最新文章

  1. 集合论在图论中的应用的约束描述
  2. 局域网中设备的管理之StackCluster
  3. neo4j 返回 return
  4. MathType中公式不对齐怎么办
  5. 安装multisim后汉化过程中,无法创建文件夹拒绝访问怎么办
  6. python zemax_最新Python中文版发布,跨界程序员零压力学Python之道!(附下载)
  7. c语言链表详解(超详细)
  8. 清除浏览器缓存(js、css等)
  9. win10安装mongoDB
  10. 这是一份普通的cpp答卷,可能有错
  11. 图书馆管理系统的数据库设计
  12. 【我的渲染技术进阶之旅】关于C++轻量级界面开发框架Dear ImGui介绍
  13. 简单电话簿管理系统(C语言)
  14. 氚云CRM管理员手册
  15. [笔记]Open3D基础知识及例程demo
  16. java基于Springboot+vue的宠物销售商城网站 elementui
  17. 李航老师《统计学习方法》第二版第二章答案
  18. php课设源代码网站,php精品课程教学网站在线发布系统
  19. 老油条用什么工具写文档?
  20. ESP-01S开发环境搭建及新手教程点灯教程全解详细配图(ESP8266-01s)

热门文章

  1. 主权数字货币技术设计方案理解
  2. npm install卡住
  3. Linux typeset用法
  4. 利用ffmpeg将.m4s的视频格式转换成.mp4
  5. css3滚动倾斜,CSS3实现倾斜和旋转动画效果
  6. Codeforces Round #645 (Div. 2) E - Are You Fired? 题解(思维)
  7. AIGW40N65H5英飞凌车规MOS管\原装现货\ASEMI代理
  8. 支付宝小程序 定位用户所在的城市
  9. 从离岛大屿山到香港岛中环街市,万豪旅享家以七种全新视角重新探索香港
  10. msf 生成.wsf 木马