当前位置: 首页 > news >正文

python基础---生成器

生成器

这个老师的课
这个老师的网页

获取系列有规律但是个数不确定的数据

使用迭代器的时候可以使用一个不会产生异常的迭代器, 实际记录的是生成的数据的方式, 不是实际的数据

使用迭代器的时候这一个规则的改变不方便, 需要加一个专门的方法

还有就是如果需要大量的数据, 而实际使用的时候只用其中一部分, 会浪费大量的空间

生成器是一个记录生成数据的方式, 而不是实际的数据的方式, 实际是一个特殊的迭代器

实际定义

方法一

只需要把一个列表的生成[]改为()

nums = [x for x in range(5)]
nums2 = (x for x in range(5))print(type(nums))
print(type(nums2))print(nums)
print(nums2)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py"
<class 'list'>
<class 'generator'>
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x000002431C7B2110>

方法二

有时候这一个推导比较复杂, 不能使用for循环实现

这时候可以使用一个函数生成一个生成器

这一个函数返回的时候使用的不是return, 而是使用yeild, 下一次调用的时候会从yeild返回的位置

def fib_generator():num1 = 1num2 = 1while True:temp_num = num1num1, num2 = num2, num1 + num2yield temp_num

这个代码块的返回值是一个生成器, 这一个生成器第一次执行会从def开始直到yield, 调用next的时候会返回yield后面的数值

fib = fib_generator()print(fib)
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
<generator object fib_generator at 0x000002342F7D2110>
1
1
2
3
5

这一个迭代器执行结束的时候会产生一个异常StopIteration, 如果是使用一个return, 返回的值会成为这一个异常的参数, 可以使用try语句进行捕获

def fib_generator():num1 = 1num2 = 2temp_num = num1num1, num2 = num2, num1 + num2yield temp_numtemp_num = num1num1, num2 = num2, num1 + num2yield temp_numtemp_num = num1num1, num2 = num2, num1 + num2yield temp_numreturn "结束了!!!"fib = fib_generator()print(next(fib))
print(next(fib))
print(next(fib))
try:print(next(fib))
except StopIteration as ret:print(ret.value)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py"
1
2
3
结束了!!!

send唤醒

除了使用next还可以使用send发送一个数据给迭代器

def fib_generator():num1 = 1num2 = 2temp_num = num1num1, num2 = num2, num1 + num2num = yield temp_numprint("get ", num)temp_num = num1num1, num2 = num2, num1 + num2num = yield temp_numprint("get ", num)temp_num = num1num1, num2 = num2, num1 + num2num = yield temp_numprint("get ", num)return "结束了!!!"fib = fib_generator()print(fib.send(None))
print(fib.send(2))
print(fib.send(3))
try:print(fib.send(4))
except StopIteration as ret:print(ret.value)
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py"
1
get  2
2
get  3
3
get  4
结束了!!!
http://www.lryc.cn/news/342221.html

相关文章:

  • wangEditor 富文本详解
  • 文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测
  • Java多线程:常见的线程的创建方法及Thread类详解
  • 一招搞定生产管理
  • 学习CSS3,实现红色心形loading特效
  • 深度学习之基于Matlab神经网络的活体人脸和视频人脸识别系统
  • 充电桩测试:负载箱的重要性
  • 贪心算法、Dijkstra和A*类路径搜索算法
  • Debian是什么?有哪些常用命令
  • 万兴PDF专家 PDFelement Pro v10.3.8 破姐版!
  • Ubuntu22.04 私钥登录
  • Java_JVM_JVMs
  • Linux系统编程之基本指令
  • [1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 【Flask 系统教程 3】请求与响应
  • jsp校园商城派送系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 【Linux】System V 共享内存
  • 拼多多标准推广怎么玩
  • HFSS学习-day2-T形波导的优化设计
  • 贪吃蛇小游戏(c语言)
  • 多商户Docker Supervisor进程管理器部署
  • Vue--》从零开始打造交互体验一流的电商平台(一)
  • uniapp 自定义相机插件(组件版、缩放、裁剪)组件 Ba-CameraView
  • 如何在Python中生成随机密码?
  • 【Git管理工具】使用Docker+浪浪云服务器部署GitLab服务器
  • 速盾:什么是cdn架构
  • spring高级篇(十)
  • map、set底层封装模拟实现(红黑树)
  • PHP8.2-xlswriter 扩展
  • imx6ull开发板设置SD卡启动,SD卡中烧写uboot,kernel,设备树,根文件系统fs