前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python入门到放弃 | 超简单 跟我学(十一)

Python入门到放弃 | 超简单 跟我学(十一)

作者头像
剑指工控
发布2021-11-09 15:41:54
3980
发布2021-11-09 15:41:54
举报
文章被收录于专栏:剑指工控

JZGKCHINA

工控技术分享平台

尊重原创 勿抄袭

勿私放其他平台

「人生苦短,我用 Python」

Python 诞生之初就被誉为最容易上手的编程语言。进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言。

从上周开始,我们带给剑指工控的网友们带来一个完全免费的福利——超简单 跟我学Python,每周一期,由剑指工控大神剑思庭主讲哦!

来吧!一起学起来!

01

安装Python(点击跳转学习)

02

Python 解释器的交互模式

03

编写 Python 代码的工具

04

基础知识 (点击跳转学习)

05

运算符与表达式

06

控制流(点击跳转学习)

07

函数(点击跳转学习)

08

模块(点击跳转学习)

09

数据结构(点击跳转学习)

10

面向对象编程

说明:

Python 3.9 是当前可用的最新版本 Python,因此,我们将在以下说明中引用该版本。此外,这些说明专用于 Windows 10。如果使用以前版本的 Windows,则基本说明是相同的,不过某些步骤中的过程可能略有不同。

第十一讲

异 常

当意外的情况在你的程序中发生时就会产生异常。例如,当你尝试读取一个文件但它并不存在时,会发生什么?或者,当程序还在运行的时候,你删除了它会怎么样?这类情况会通过引发异常来处理。

相似地,如果你的程序有一些无效的语句会发生什么?这由 Python 进行处理,它会举手并告诉你这里有一个错误。

错误

考虑一个简单的 print 函数调用。当 print 被错误拼写成 Print 会发生什么?注意字母大写。这种情况下, Python 将会 引发( raise ) 一个语法错误。

代码语言:javascript
复制
>>> Print("Hello World")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Print' is not defined
>>> print("Hello World")
代码语言:javascript
复制
Hello World

对这个错误的处理是,观察到 NameError 错误被引发并打印出这个错误发生的位置。

异常

我们将尝试读取用户的输入。我们输入下面的第一行代码并按下 Enter 执行。当你的计算机提示你输入时,在 Mac 上按下 [ctrl-d] 或者在 Windows 上按下 [ctrl-z] 来观察会发生什么(如果你使用的是 Windows 系统而以上两个选择都无效时,你可以尝试在命令行窗口使用 [ctrl-c] 来产生 KeyboardInterrupt 错误)。

代码语言:javascript
复制
>>> s = input('Enter something --> ')
Enter something --> 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
代码语言:javascript
复制
EOFError

Python 引发了一个名为 EOFError 的错误,它的意思是发现了一个不该出现的 文件末尾( end of file) 符号(可以用 ctrl-d 表示)。

处理异常

我们可以用 try..except 语句来处理异常。我们简单地把正常语句放入 try 语句块,并把所有错误处理程序放入 except 语句块。

代码语言:javascript
复制
示例(保存为 exceptions_handle.py ):

try:
    text = input('Enter something --> ')
except EOFError:
    print('Why did you do an EOF on me?')
except KeyboardInterrupt:
    print('You cancelled the operation.')
else:
    print('You entered {}'.format(text))

输出:

代码语言:javascript
复制
# 按下 ctrl + d
$ python exceptions_handle.py
Enter something --> Why did you do an EOF on me?

# 按下 ctrl + c
$ python exceptions_handle.py
Enter something --> ^CYou cancelled the operation.

$ python exceptions_handle.py
Enter something --> No exceptions
You entered No exceptions

工作原理

我们将所有可能引发异常或错误的语句放入 try 语句块中,然后将对应错误或异常的处理程序放入 except 子句(程序块)中。except 子句会处理单个特定的错误或异常,或是一个带括号的错误或异常列表。如果没有提供错误或异常的名字, 它将处理 所有的 错误和异常。

请注意,每个 try 子句之后,至少要有一个与之关联的 except 子句。否则, 一个单独的 try 语句块有什么意义?

如果有任何未处理的错误和异常,默认的 Python 处理程序将被调用,它只会终止程序运行并打印出一条异常信息。我们在之前的操作中已经见过了。

你可以使用一个与 try..except 语句块关联的 else 子句。else 子句在没有错误发生时将会执行。

在下一个例子中,我们将会看到如何获取一个异常对象,这样我们就可以获得额外的异常信息。

引发异常

你可以用 raise 语句 引发( raise ) 异常,需要提供错误或异常的名字以及被 抛出( thrown ) 的异常对象。

你用于引发异常的错误和异常应该是一个直接或间接地派生自 Exception 类的类。

代码语言:javascript
复制
示例(保存为 exceptions_raise.py ):

class ShortInputException(Exception):
    '''用户定义的异常对象'''
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast

try:
    text = input('Enter something --> ')
    if len(text) < 3:
        raise ShortInputException(len(text), 3)
    # 其他程序可以在这里正常执行
except EOFError:
    print('Why did you do an EOF on me?')
except ShortInputException as ex:
    print(('ShortInputException: The input was ' +
           '{0} long, expected at least {1}')
          .format(ex.length, ex.atleast))
else:
    print('No exception was raised.')

输出:

代码语言:javascript
复制
$ python exceptions_raise.py
Enter something --> a
ShortInputException: The input was 1 long, expected at least 3

$ python exceptions_raise.py
Enter something --> abc
No exception was raised.

工作原理

这里,我们创建了一个我们自己的异常类型这个新的异常类型被命名为 ShortInputException 。它有两个字段, length 是给出输入的长度, atleast 是程序所期望的最小长度。

在 except 子句中,我们注意到错误的类通过 as 把错误或异常对应的对象储存到了命名的变量中。这类似于函数调用中的变量和参数。在特定的 except 子句中,我们用异常对象的 length 和 atleast 字段向用户输出适当的信息。

Try … Finally

假设你要在你的程序中读取一个文件。如何保证无论是否引发错误,文件对象都被正确关闭?可以使用 finally 语句块来完成。

代码语言:javascript
复制
把这段程序保存为 exceptions_finally.py :

import sys
import time

f = None
try:
    f = open("poem.txt")
    # 我们通常读取文件的语句
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print(line, end='')
        sys.stdout.flush()
        print("Press ctrl+c now")
        # 让程序保持运行一段时间
        time.sleep(2)
except IOError:
    print("Could not find file poem.txt")
except KeyboardInterrupt:
    print("!! You cancelled the reading from the file.")
finally:
    if f:
        f.close()
    print("(Cleaning up: Closed the file)")

输出:

代码语言:javascript
复制
$ python exceptions_finally.py
Programming is fun
Press ctrl+c now
^C!! You cancelled the reading from the file.
(Cleaning up: Closed the file)

工作原理

我们做了正常的文件读取,但我们在每行输出之后用 time.sleep 函数特意加入了 2 秒的休眠,这样程序就会缓慢运行(通常 Python 运行很快)。当程序还在运行时,按下 ctrl + c 来终止或取消程序运行。.

观察到 KeyboardInterrupt 异常被抛出以及程序退出。但是,在程序退出前, finally 子句被执行,文件对象总是被正确关闭。

请注意, Python 将变量中的 0 、 None 、空数组和空集合都视为 False 。这就是为什么我们可以在上面的代码中使用 if f: 。

还要注意,我们在 print 之后使用 sys.stdout.flush() ,这样就可以立刻输出到屏幕上。

with 语句

在 try 语句块中获取资源,并最终在 finally 语句块中释放资源是一种常见做法。因此使用 with 语句可以以更清晰的代码风格实现以上过程:

代码语言:javascript
复制
保存为 exceptions_using_with.py :

with open("poem.txt") as f:
    for line in f:
        print(line, end='')

工作原理

输出应该与之前一个示例相同。这里的不同点是,我们将 with 语句和 open 函数一起使用 —— 我们让 with open 自动完成文件关闭。

with 语句隐藏地使用了一个规则。它获取了 open 语句返回的对象,这里我们称之为 “thefile” 。

它开始它下面的这个代码块前 总是 调用 thefile.__enter__ 函数,在离开这个代码块后 总是 调用 thefile.__exit__ 。

因此,被我们写入 finally 语句块的代码会被 __exit__ 方法自动完成。这避免我们重复地显示使用 try..finally 语句。

小结

我们已经讨论了 try..except 语句和 try..finally 语句的用法。我们看到了怎样创建一个我们自己的异常类型以及怎样引发一个异常。

就这么简单,下周四见!

作者简介:

剑思庭,工业网络安全研究员,研究方向为工业网络渗透与防御建设,专注于红队攻击链打造。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档