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,则表示异常已被处理,不会继续传播;返回 FalseNone,异常会继续向外传播。(不懂)

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()

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

相关推荐
傻童:CPU6 小时前
C语言需要掌握的基础知识点之递归
c语言·开发语言
黑金IT6 小时前
PHP 后台通过权限精制飞书多维表格
开发语言·php·飞书
Mrliu__6 小时前
Python数据结构(七):Python 高级排序算法:希尔 快速 归并
数据结构·python·排序算法
C嘎嘎嵌入式开发6 小时前
(22)100天python从入门到拿捏《【网络爬虫】网络基础与HTTP协议》
网络·爬虫·python
脚踏实地的大梦想家6 小时前
【Go】P11 掌握 Go 语言函数(二):进阶玩转高阶函数、闭包与 Defer/Panic/Recover
开发语言·后端·golang
秋空樱雨6 小时前
C++入门
开发语言·c++
咬_咬7 小时前
C++仿mudo库高并发服务器项目:Buffer模块
服务器·开发语言·c++·缓冲区·buffer·muduo库
江公望7 小时前
Qt qmlplugindump浅谈
开发语言·qt·qml
曦樂~7 小时前
【Qt】文件操作/事件--mainwindow做编辑器
开发语言·qt