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安装额外的库才能识别。
传统的这种写法存在几个问题:
- 容易忘记关闭资源:如果没有
try-finally
块,可能会忘记调用close()
- 代码冗长:简单的文件操作需要多行代码
- 异常处理复杂:需要手动处理可能出现的异常
try-finally
块:用来异常处理
try:开始执行一个代码块,尝试执行其中的代码;
finally:无论try中的块是否成功,都会运行它的代码块;
上面的代码没有try - finally块 应该是也可以执行的,try - finally块是为了异常处理,防止文件最后没有关闭。
with 语句的优势
with
语句通过上下文管理协议(Context Management Protocol)解决了这些问题:
- 自动资源释放:确保资源在使用后被正确关闭
- 代码简洁:减少样板代码
- 异常安全:即使在代码块中发生异常,资源也会被正确释放
- 可读性强:明确标识资源的作用域
下面上实战对比一下,比较好;
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 的上下文管理协议,该协议要求对象实现两个方法:
__enter__()
:进入上下文时调用,返回值赋给as
后的变量__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()。
如有错误,欢迎指正,还有我上面那个不理解的迭代器和生成器。