找回密码
 会员注册
查看: 15|回复: 0

关于“Python”的核心知识点整理大全25

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
68585
发表于 2024-9-10 22:18:57 | 显示全部楼层 |阅读模式
目录10.3.4else代码块、10.3.5处理FileNotFoundError异常alice.py在这个示例中,try代码块引发FileNotFoundError异常,因此Python找出与该错误匹配的except代码块,并运行其中的代码。最终的结果是显示一条友好的错误消息,而不是traceback:10.3.6分析文本10.3.7使用多个文件word_count.py10.3.8失败时一声不吭关于“Python”的核心知识点整理大全24-CSDN博客往期快速传送门👆(在文章最后):感谢大家的支持!欢迎订阅收藏!专栏将持续更新!10.3.4else代码块、通过将可能引发错误的代码放在try-except代码块中,可提高这个程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此我们需要将它放到try-except代码块中。这个示例还包含一个else代码块;依赖于try代码块成功执行的代码都应放到else代码块中:print("Givemetwonumbers,andI'lldividethem.")print("Enter'q'toquit.")whileTrue:first_number=input("\nFirstnumber:")iffirst_number=='q':breaksecond_number=input("Secondnumber:")1try:answer=int(first_number)/int(second_number)2exceptZeroDivisionError:print("Youcan'tdivideby0!")3else:print(answer)我们让Python尝试执行try代码块中的除法运算(见1),这个代码块只包含可能导致错误的代码。依赖于try代码块成功执行的代码都放在else代码块中;在这个示例中,如果除法运算成功,我们就使用else代码块来打印结果(见2)。except代码块告诉Python,出现ZeroDivisionError异常时该怎么办(见3)。如果try代码块因除零错误而失败,我们就打印一条友好的消息,告诉用户如何避免这种错误。程序将继续运行,用户根本看不到traceback:Givemetwonumbers,andI'lldividethem.Enter'q'toquit.Firstnumber:5Secondnumber:0Youcan'tdivideby0!Firstnumber:5Secondnumber:22.5Firstnumber:qtry-except-else代码块的工作原理大致如下:Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码;这些代码应放在else代码块中。except代码块告诉Python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。通过预测可能发生错误的代码,可编写健壮的程序,它们即便面临无效数据或缺少资源,也能继续运行,从而能够抵御无意的用户错误和恶意的攻击。10.3.5处理FileNotFoundError异常使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本就不存在。对于所有这些情形,都可使用try-except代码块以直观的方式进行处理。我们来尝试读取一个不存在的文件。下面的程序尝试读取文件alice.txt的内容,但我没有将这个文件存储在alice.py所在的目录中:alice.pyfilename='alice.txt'withopen(filename)asf_obj:contents=f_obj.read()Python无法读取不存在的文件,因此它引发一个异常:Traceback(mostrecentcalllast):File"alice.py",line3,inwithopen(filename)asf_obj:FileNotFoundError:[Errno2]Nosuchfileordirectory:'alice.txt'在上述traceback中,最后一行报告了FileNotFoundError异常,这是Python找不到要打开的文件时创建的异常。在这个示例中,这个错误是函数open()导致的,因此要处理这个错误,必须将try语句放在包含open()的代码行之前:filename='alice.txt'try:withopen(filename)asf_obj:contents=f_obj.read()exceptFileNotFoundError:msg="Sorry,thefile"+filename+"doesnotexist."print(msg)在这个示例中,try代码块引发FileNotFoundError异常,因此Python找出与该错误匹配的except代码块,并运行其中的代码。最终的结果是显示一条友好的错误消息,而不是traceback:Sorry,thefilealice.txtdoesnotexist.如果文件不存在,这个程序什么都不做,因此错误处理代码的意义不大。下面来扩展这个示例,看看在你使用多个文件时,异常处理可提供什么样的帮助。10.3.6分析文本你可以分析包含整本书的文本文件。很多经典文学作品都是以简单文本文件的方式提供的,因为它们不受版权限制。本节使用的文本来自项目Gutenberg(http://gutenberg.org/),这个项目提供了一系列不受版权限制的文学作品,如果你要在编程项目中使用文学文本,这是一个很不错的资源。下面来提取童话AliceinWonderland的文本,并尝试计算它包含多少个单词。我们将使用方法split(),它根据一个字符串创建一个单词列表。下面是对只包含童话名"AliceinWonderland"的字符串调用方法split()的结果:>>>title="AliceinWonderland">>>title.split()['Alice','in','Wonderland']方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点。为计算AliceinWonderland包含多少个单词,我们将对整篇小说调用split(),再计算得到的列表包含多少个元素,从而确定整篇童话大致包含多少个单词:filename='alice.txt'try:withopen(filename)asf_obj:contents=f_obj.read()exceptFileNotFoundError:msg="Sorry,thefile"+filename+"doesnotexist."print(msg)else:#计算文件大致包含多少个单词1words=contents.split()2num_words=len(words)3print("Thefile"+filename+"hasabout"+str(num_words)+"words.")我们把文件alice.txt移到了正确的目录中,让try代码块能够成功地执行。在Ø处,我们对变量contents(它现在是一个长长的字符串,包含童话AliceinWonderland的全部文本)调用方法split(),以生成一个列表,其中包含这部童话中的所有单词。当我们使用len()来确定这个列表的长度时,就知道了原始字符串大致包含多少个单词(见)。在处,我们打印一条消息,指出文件包含多少个单词。这些代码都放在else代码块中,因为仅当try代码块成功执行时才执行它们。输出指出了文件alice.txt包含多少个单词:Thefilealice.txthasabout29461words.这个数字有点大,因为这里使用的文本文件包含出版商提供的额外信息,但与童话AliceinWonderland的长度相当一致。10.3.7使用多个文件下面多分析几本书。这样做之前,我们先将这个程序的大部分代码移到一个名为count_words()的函数中,这样对多本书进行分析时将更容易:word_count.pydefcount_words(filename):1"""计算一个文件大致包含多少个单词"""try:withopen(filename)asf_obj:contents=f_obj.read()exceptFileNotFoundError:msg="Sorry,thefile"+filename+"doesnotexist."print(msg)else:#计算文件大致包含多少个单词words=contents.split()num_words=len(words)print("Thefile"+filename+"hasabout"+str(num_words)+"words.")filename='alice.txt'count_words(filename)这些代码大都与原来一样,我们只是将它们移到了函数count_words()中,并增加了缩进量。修改程序的同时更新注释是个不错的习惯,因此我们将注释改成了文档字符串,并稍微调整了一下措辞(见1)。现在可以编写一个简单的循环,计算要分析的任何文本包含多少个单词了。为此,我们将要分析的文件的名称存储在一个列表中,然后对列表中的每个文件都调用count_words()。我们将尝试计算AliceinWonderland、Siddhartha、MobyDick和LittleWomen分别包含多少个单词,它们都不受版权限制。我故意没有将siddhartha.txt放到word_count.py所在的目录中,让你能够看到这个程序在文件不存在时处理得有多出色:defcount_words(filename):--snip--filenames=['alice.txt','siddhartha.txt','moby_dick.txt','little_women.txt']forfilenameinfilenames:count_words(filename)文件siddhartha.txt不存在,但这丝毫不影响这个程序处理其他文件:Thefilealice.txthasabout29461words.Sorry,thefilesiddhartha.txtdoesnotexist.Thefilemoby_dick.txthasabout215136words.Thefilelittle_women.txthasabout189079words.在这个示例中,使用try-except代码块提供了两个重要的优点:避免让用户看到traceback;让程序能够继续分析能够找到的其他文件。如果不捕获因找不到siddhartha.txt而引发的FileNotFoundError异常,用户将看到完整的traceback,而程序将在尝试分析Siddhartha后停止运行——根本不分析MobyDick和LittleWomen。10.3.8失败时一声不吭在前一个示例中,我们告诉用户有一个文件找不到。但并非每次捕获到异常时都需要告诉用户,有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。要让程序在失败时一声不吭,可像通常那样编写try代码块,但在except代码块中明确地告诉Python什么都不要做。Python有一个pass语句,可在代码块中使用它来让Python什么都不要做:defcount_words(filename):"""计算一个文件大致包含多少个单词"""try:--snip--exceptFileNotFoundError:1passelse:--snip--filenames=['alice.txt','siddhartha.txt','moby_dick.txt','little_women.txt']forfilenameinfilenames:count_words(filename)相比于前一个程序,这个程序唯一不同的地方是Ø处的pass语句。现在,出现FileNotFoundError异常时,将执行except代码块中的代码,但什么都不会发生。这种错误发生时,不会出现traceback,也没有任何输出。用户将看到存在的每个文件包含多少个单词,但没有任何迹象表明有一个文件未找到:Thefilealice.txthasabout29461words.Thefilemoby_dick.txthasabout215136words.Thefilelittle_women.txthasabout189079words.pass语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这里做些什么。例如,在这个程序中,我们可能决定将找不到的文件的名称写入到文件missing_files.txt中。用户看不到这个文件,但我们可以读取这个文件,进而处理所有文件找不到的问题。关于“Python”的核心知识点整理大全24-CSDN博客关于“Python”的核心知识点整理大全23-CSDN博客关于“Python”的核心知识点整理大全22-CSDN博客关于“Python”的核心知识点整理大全21-CSDN博客关于“Python”的核心知识点整理大全20-CSDN博客关于“Python”的核心知识点整理大全19-CSDN博客关于“Python”的核心知识点整理大全18-CSDN博客关于“Python”的核心知识点整理大全17-CSDN博客Python:核心知识点整理大全16-笔记-CSDN博客关于“Python”的核心知识点整理大全15-CSDN博客关于“Python”的核心知识点整理大全14-CSDN博客关于“Python”的核心知识点整理大全13-CSDN博客关于“Python”的核心知识点整理大全12-CSDN博客往期快速传送门👆(在文章最后):感谢大家的支持!欢迎订阅收藏!专栏将持续更新!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-5 09:18 , Processed in 1.777273 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表