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

python进阶七 Python其他高级语法

一 With语句和上下文管理器

1.1 with语句

文件操作回顾

# 1、以写的方式打开文件f=open("1.txt","w")# 2、写入文件内容f.write("hello world")# 3、关闭文件f.close()

代码说明: 文件使用完后必须关闭,因文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

这种写法可能出现一定的安全隐患,错误代码如下:

# 1、以读的方式打开文件f=open("1.txt","r")# 2、写入文件内容f.write("hello world")# 3、关闭文件f.close()

运行结果:

① 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。
② 为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来解决

try…except…finally解决文件操作异常

安全写法, 代码如下:

try:# 1、以读的方式打开文件f=open("1.txt","r")# 2、读取文件内容f.write("xxxxx")exceptIOErrorase:print("文件操作出错",e)finally:# 3、关闭文件f.close()

结果:

with语句

try-except-finally语句缺点:代码过于冗长, 不易用,易忘

上下文管理器with语句:该机制简单、更安全的处理资源和异常
特点:with 语句执行完成后,自动调用关闭文件操作,即使出现异常也会自动调用关闭文件操作

实例代码:# 1、以写的方式打开文件withopen("1.txt","w")asf:# 2、读取文件内容f.write("hello world")

1.2 上下文管理器

  • 一个类只要实现了__enter__()和__exit__()这个两个方法,通过该类创建的对象我们就称之为上下文管理器

  • 上下文管理器可以使用 with 语句

    • with语句之所以这么强大,背后是由上下文管理器做支撑的
    • 刚才使用 open 函数创建的文件对象就是就是一个上下文管理器对象
    • 大白话:with 管理的对象就是上下文管理器; with xxx as 后面的操作的对象就是被管理的对象

定义上下文管理器类,模拟文件操作

  • 定义一个File类,实现enter() 和exit()方法
  • 然后使用 with 语句来完成操作文件
classMyFile(object):def__init__(self,file_name,file_model):self.file_name=file_name self.file_model=file_model self.fp=None# 文件句柄def__enter__(self):print('这是上文')self.fp=open(self.file_name,self.file_model)returnself.fpdef__exit__(self,exc_type,exc_val,exc_tb):print('这是下文')self.fp.close()# 0 什么是上下文管理器? with 管理的对象就是上下文管理器# 1 定义一个File类# 2 重写魔法方法 __enter__() 和 __exit__()方法# 3 然后使用 with 语句来完成操作文件if__name__=='__main__':# myobj = MyFile('./1.txt', 'r')withMyFile('./1.txt','r')asf:filedata=f.read()print('filedata-->',filedata)
  • 一个类只要实现了__enter__()和__exit__()这个两个方法,通过该类创建的对象我们就称之为上下文管理器
  • __enter__表示上文方法,需要返回一个操作文件对象
  • __exit__表示下文方法,with语句执行完成会自动执行,即使出现异常也会执行该方法

二 Python生成器

2.1 什么是生成器

根据程序员制定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生成出来,而是使用一个,再生成一个,可以节约大量的内存。

创建生成器的方式:① 生成器推导式 ② yield 关键字

2.2 生成器推导式

创建生成器

# 注意1:括号()代表 这是一个生成器,不是元组# 注意2:括号()里面写的是数据的生成规则,返回一个对象,# 对象内不是存的数据,而是产生数据的规则my_generator=(i*2foriinrange(5))# 根据注意2print(my_generator)# next获取生成器下一个值# value = next(my_generator)# print(value)# 遍历生成器forvalueinmy_generator:print(value)

生成器相关函数:

  • next 函数获取生成器中的下一个值
  • for 循环遍历生成器中的每一个值

2.3 yield生成器

只要在def函数里面看到有 yield 关键字那么就是生成器

defmygenerater(n):foriinrange(n):print('开始生成...')yieldiprint('完成一次...')if__name__=='__main__':g=mygenerater(2)# 获取生成器中下一个值# result = next(g)# print(result)# while True:# try:# result = next(g)# print(result)# except StopIteration as e:# break# # for遍历生成器, for 循环内部自动处理了停止迭代异常,使用起来更加方便foriing:print(i)

2.4 生成器的应用场景 – 数据迭代器dataloader的封装

importmathdefdataset_loader(bath_size):# 1 读歌词withopen('./jaychou_lyrics.txt','r')asfile:lines=file.readlines()# 2 统计共有多少条歌词lyrics_number=len(lines)# 3 计算共有多少个批次 math.ceil向上取整 math.floor向下取整batch_number=math.ceil(lyrics_number/bath_size)# 4 遍历每一个 batchforidxinrange(batch_number):yieldlines[idx*bath_size:idx*bath_size+bath_size]if__name__=='__main__':dataloader=dataset_loader(8)fordataindataloader:print(data)print('创建生成器(数据加载器) 为AI专业课做准备 End')

很多模型都是一个批次一个批次的给模型喂数据,来训练模型的。
构建数据迭代器每8个条数据(8个样本)8个数据的给模型喂数据

http://www.jsqmd.com/news/669918/

相关文章:

  • BGE-Large-Zh惊艳效果:支持数字敏感查询(如‘2024年GDP增长率’)精准定位
  • use-http Provider模式详解:全局配置与局部覆盖的灵活运用
  • 从Transformer到零碳架构:SITS2026现场拆解华为昇腾+寒武纪稀疏计算实测——功耗直降63.8%的7个硬件协同开关
  • 如何参与tbls开源项目:从零开始的数据库文档工具贡献指南
  • 如何快速解压Wallpaper Engine资源:RePKG终极指南
  • 4艘无人艇分布式编队控制、集中式控制+集中式距离跟踪程序
  • 基于vue的突发事件下应急药品管理系统[vue]-计算机毕业设计源码+LW文档
  • 黑丝空姐-造相Z-Turbo开发环境搭建:IntelliJ IDEA集成与调试技巧
  • 码上去学海南公司:C语言到底能干什么?我列举了8种经典案例
  • waymore Docker部署指南:在容器环境中运行完整流程
  • Tacotron-2性能优化技巧:减少推理时间并提升语音自然度的7种方法
  • vue-pdf 疑难解答:常见问题排查与解决方案汇总
  • script.aculo.us实战案例:10个经典交互效果实现代码详解
  • 读2025世界前沿技术发展报告47生物技术发展(下)
  • 实时手机检测-通用惊艳案例分享:暗光/运动模糊/密集堆叠场景检测效果
  • Graphormer分子建模效果展示:乙醇、苯、甲醛等10种分子SMILES实测
  • 2026年纠结降AI率工具哪个好?这份选择攻略让你1分钟决策
  • 实测ClearerVoice-Studio三大功能:语音增强、分离、提取到底有多强?
  • RAG-cookbooks在企业中的应用:金融、医疗、教育三大场景深度解析
  • Phi-4-mini-reasoning效果展示:同一数学题多种解法路径的收敛性验证
  • python进阶六 正则表达式
  • 嘎嘎降AI、比话降AI、率零哪个好?花了300块测完告诉你
  • 【VScode切换覆盖模式和插入模式——解决误用问题】
  • 2026年国内回头客多的网红集装箱价格选哪家,集成房屋设计/集装箱设计/集装箱办公/集装箱销售,网红集装箱定制怎么选择 - 品牌推荐师
  • Qwen3-VL-8B创意编程:用AI解读并生成Processing艺术代码
  • Starry Night Art Gallery实战案例:非遗传承人AI辅助纹样创新设计
  • Claude API 报错 429 怎么办?4 种方案实测,最后一种改一行代码就搞定
  • spring boot 3.5+flowable7+java 21流程引擎测试程序
  • TVA在精密制造领域的应用案例(11)
  • LFM2.5-1.2B-Thinking-GGUF惊艳效果:在无微调条件下,对半导体工艺术语解释准确率达91.7%