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

python-day8

迭代器与生成器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住的内容的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完成结束。迭代器只能往前不会后退

迭代器有两个基本的方法:iter()next()

字符串,列表或元组对象都可用于创建迭代器:

eg:

list = [1,2,3,4,5,6];
it = iter(list);#创建迭代器
print(next(it));#获取迭代器的第一个元素
print(next(it));#获取迭代器的第二个元素
print(it);
print(next(it));
print(it);
print(next(it));
print(next(it));
print(it);

运行结果:

打印 it(迭代器),打印的是对象的地址,但不知道是什么的地址,这个搞不懂到底是啥。

迭代器也有使用常规的for循环遍历;

eg:

list =[1,2,3,4,5,6];
it  = iter(list);
for x in it:print(x,end=",");print("\n");
for x in list:#也可以遍历list,忘了之前试过没有了,现在试试print(x,end=",");

运行结果:

迭代器与生成器看的云里雾里,暂时搞不明白,先留下来,后面再学。

with 关键字

在 Python 编程中,资源管理是一个重要但容易被忽视的环节。with 关键字为我们提供了一种优雅的方式来处理文件操作、数据库连接等需要明确释放资源的场景。

with 是 Python 中的一个关键字,用于上下文管理协议(Context Management Protocol)。它简化了资源管理代码,特别是那些需要明确释放或清理的资源(如文件、网络连接、数据库连接等)

为什么要有with语句

先看一个传统资源管理对文件的操作:

eg:

file  = open("d:\Desktop\hh.txt","r");
#打开文件,r表示读模式,如果是w表示写模式,前面的d:\Desktop是文件路径,后面的hh.txt是文件名,就是我电脑上的一个文件地址try:content = file.read();#读取文件内容print(content);
finally:file.close();#关闭文件

 运行结果:

下面这个是我文本内容,但输入好像不是很理想,不过最起码还是输入出来了,word的输入不出来,我问ai好像要python安装额外的库才能识别。

传统的这种写法存在几个问题:

  1. 容易忘记关闭资源:如果没有 try-finally 块,可能会忘记调用 close()
  2. 代码冗长:简单的文件操作需要多行代码
  3. 异常处理复杂:需要手动处理可能出现的异常

 try-finally 块:用来异常处理

try:开始执行一个代码块,尝试执行其中的代码;

finally:无论try中的块是否成功,都会运行它的代码块;

上面的代码没有try - finally块 应该是也可以执行的,try - finally块是为了异常处理,防止文件最后没有关闭。

with 语句的优势

with 语句通过上下文管理协议(Context Management Protocol)解决了这些问题:

  1. 自动资源释放:确保资源在使用后被正确关闭
  2. 代码简洁:减少样板代码
  3. 异常安全:即使在代码块中发生异常,资源也会被正确释放
  4. 可读性强:明确标识资源的作用域

下面上实战对比一下,比较好;

with 语句

语法格式:

with expression [as variable]:# 代码块
  • expression 返回一个支持上下文管理协议的对象,就是刚刚上面的那个打开文件,然后只读那部分 open("d:\Desktop\hh.txt","r")
  • as variable 是可选的,用于将表达式结果赋值给变量
  • 代码块执行完毕后,自动调用清理方法;

eg:就是上面传统方式的同等效果

with open("d:\Desktop\hh.txt","r") as file:#open函数返回一个文件对象,用as关键字用来给文件对象命名,将文件对象赋值给变量file,方便后续使用。content = file.read();#读取文件内容print(content);
#with语句会自动调用文件对象的close()方法,确保文件被正确关闭,避免资源泄露。

运行结果:

可以和传统的文件操作对比一下,感觉一下差别。

工作原理:上下文管理协议

with 语句背后是 Python 的上下文管理协议,该协议要求对象实现两个方法:

  1. __enter__()进入上下文时调用,返回值赋给 as 后的变量
  2. __exit__()退出上下文时调用,处理清理工作

上下文

代表一个有限的资源的生命周期,例如文件、网络连接或数据库会话。在这个上下文中,资源被创建、使用并最终释放。就像刚刚的那个代码,上下文指的是从打开文件到读取内容,再到关闭文件的整个过程,file 对象是上下文中管理的资源,在 with 块内,文件是打开的状态,代码块则是关闭的状态。

异常处理机制

__exit__() 方法接收三个参数:

  • exc_type:异常类型
  • exc_val:异常值
  • exc_tb:异常追踪信息

如果 __exit__() 返回 True,则表示异常已被处理,不会继续传播;返回 False 或 None,异常会继续向外传播。(不懂)

eg:

#文件操作:
with open("d:\Desktop\hh.txt","r") as infile,open("d:\Desktop\gg.txt","w") as outfile:#用with语句打开两个文件,infile和outfile,分别表示输入文件和输出文件。infile_content = infile.read();#读取infile的内容。# outfile_content = outfile.read();#读取outfile的内容。。。。。。这里是错的,因为gg.txt打开时是以写模式打开的,所以不能读取内容。print("infile:",infile_content);outfile.write(infile_content.upper());#.upper()方法将字符串转换成大写字母。#用write()方法将infile的内容全部转换成大写字母写入outfile中。

这里是infile里的内容

这个是被写入之后的outfile里的内容,中间的没有成功的,感觉是我这个识别不出来逗号,然后连带这后面的w也识别失败了,然后其他的小写转大写,写入成功了。

记得with语句的格式,然后有了文件对象被赋予变量file之后,读取内容是file.read(),一般是再设置一个变量(比如content),将内容存储到该变量中,file指向的是文件本身,可以对其进行读写操作(如果权限允许的话),content指向的是文件内容,注意区分,然后再记住一个小写转大写的函数  .upper()

如有错误,欢迎指正,还有我上面那个不理解的迭代器和生成器。

http://www.dtcms.com/a/517149.html

相关文章:

  • Metropolis接受准则:随机模拟与优化中的关键基石
  • QuickBI开启了加速引擎,造成数据库满载,如何解决?
  • 公司怎么注册官方网站o2o网站建设效果
  • 左侧导航栏网站石家庄哪里做微网站
  • 上海市浦东新区建设工程安全质量监督站网站wordpress区块编辑无法使用
  • pc网站怎么做适配商城网站建设模板下载
  • 包头建设工程安全监督站网站中国互联网协会12321举报中心
  • 山东小语种网站建设英文域名在哪个网站查询
  • 如何从iPhone提取照片:2025年的6种方法
  • [人工智能-大模型-44]:模型层技术 - 自监督学习 :学习的目标、收敛条件、评估依据、应用到的模型、应用场景 - 通俗易懂。
  • DeepSeek-OCR深度解析:新一代开源OCR模型的技术突破与核心优势
  • 如何在yy做电影网站内蒙古建设住房与城乡厅官方网站
  • 免费建个人网站电脑怎样做轰炸网站
  • 网站续费有什么作用wordpress移动页面插件
  • 【苍穹外卖Day3】AOP落地与boot配置文件
  • 基于python的仓库管理系统
  • 网站短期技能培训娄底seo
  • 网站开发需求文档prd模板万网虚拟机怎么做两个网站
  • vue3使用pinia封装存储数据
  • 菜谱网站 源码可以做烟的网站吗
  • digiCamControl,一款免费开源的专业级 DSLR 远程控制工具
  • 广州网站建设提供商重庆手机网站推广报价
  • CyberSecEval数据集:全面评估大型语言模型安全性的基准测试工具
  • C++文件操作
  • 网站设计三把火科技杭州做网站建设
  • 酒店行业的网站建设制作网站南京
  • 谈谈环境变量
  • Java 序列化和Scala的闭包的区别和注意点
  • 莘庄做网站视频直播怎么赚钱的
  • 南昌网站seo公司电商网站的功能