机器学习入门:Python语言实现
上QQ阅读APP看书,第一时间看更新

1.4 Python中的异常处理

与JavaScript不同,你无法在Python中将一个数字和一个字符串相加。但你可以使用Python中的try/except结构检测到非法操作,这类似于JavaScript和Java等语言中的try/catch结构。

try/except的代码块示例如下:

030-03

Python在运行上面代码时,将执行except代码块中的print语句,因为xy的变量类型不兼容。

在本章的前面,你看到过两个字符串相减会引发异常:

030-04

处理异常的一种简单方法是使用try/except代码块:

030-05

上述代码的输出如下:

031-01

如你所见,上述的代码块定义了名为TypeError的更细粒度的异常,其后跟一个except代码块,用来处理Python代码执行中可能会发生的所有其他异常。这种风格类似于Java代码中的异常处理。

清单1.10的Exception1.py说明了如何处理各种类型的异常。

清单1.10 Exception1.py

031-02

清单1.10包含一个try代码块,其后跟三个except语句。如果try代码块发生错误,第一个except语句会与产生的异常类型进行比较。如果存在匹配项,则执行随后的print语句,然后程序终止。如果不存在匹配项,则对第二个except语句执行类似的测试。如果两个except语句都不匹配该异常,则由第三个except语句处理该异常,会在打印一条消息后“引发”异常。

请注意,你还可以在单个语句中指定多种异常类型,如下所示:

031-03

这种代码块更紧凑,但是你不知道发生了三种错误类型中的哪一种。Python允许自定义异常,但是这部分不在本书的讨论范围之内。

1.4.1 处理用户输入

Python允许通过input()函数或raw_input()函数从命令行读取用户输入。一般来说,将用户输入赋值给变量,该变量会包含用户从键盘输入的所有字符。当用户按下<return>键(包括在输入字符中)时,标志着用户输入结束。清单1.11的UserInput1.py提示用户输入名称,然后使用该输入作为响应。

清单1.11 UserInput1.py

031-04

清单1.11的输出如下所示(假设用户输入了单词Dave):

032-01

清单1.11中的print语句通过%s插入字符串,具体字符用%符号后的变量值代替。当具体内容在运行时才能明确时,此功能是十分有用的。

用户输入可能会导致异常(这取决于代码执行的操作),因此代码中包含异常处理是非常重要的。

清单1.12的UserInput2.py,脚本内容提示用户输入字符串,并尝试在try/except代码块中将字符串转换为数字。

清单1.12 UserInput2.py

032-02

清单1.12将数字0加到了用户输入的转换为数字的结果中。如果转换成功,则会显示一条带有用户输入的消息。如果转换失败,则expect代码块中的print语句会打印一条消息。

注意:此代码示例使用eval()函数。但其实应避免使用eval()函数,这样你的代码才不会执行任何强制(可能是破坏性的)命令。

清单1.13的UserInput3.py脚本内容提示用户输入两个数字,并尝试在一组try/except代码块中计算其总和。

清单1.13 UserInput3.py

032-03

清单1.13包含两个try代码块,每个try代码块后面都有一个except语句。第一个try代码块尝试将第一个用户提供的数字添加到变量sum中,第二个try代码块尝试将第二个用户提供的数字添加到先前输入的数字中。如果其中任何一个输入字符串不是有效数字,则会出现一条错误消息。如果两者都是有效数字,则显示的消息就会包含输入的数字及其总和。请务必阅读前面提到的eval()函数的警告。

1.4.2 命令行参数

Python提供了一个getopt模块来解析命令行选项和参数,而Python sys模块通过sys.argv可访问任何命令行参数。这提供了两种用途:

  • sys.argv显示命令行参数列表。
  • len(sys.argv)显示命令行参数的数量。

sys.argv[0]是程序名称,所以如果Python程序名为test.py,那么它与sys.argv[0]的值可以匹配。

现在,你可以不用通过提示用户,而直接在命令行上为Python程序提供输入值。

作为例子,考虑如下所示的test.py脚本:

033-01

现在,按如下所示运行上述脚本:

033-02

输出结果如下:

033-03

从命令行指定输入值的功能非常有用。例如,假设你有一个自定义Python类,其中包含addsubtract方法对一组数字进行加和减。

你可以使用命令行参数来指定对一组数字执行何种方法,如下所示:

033-04

此功能非常有用,因为你可以在Python类中以编程方式执行不同的方法,同时也意味着可以为代码编写单元测试。附录B将会介绍如何创建自定义Python类。

清单1.14的Hello.py说明了如何使用sys.argv检查命令行形参的数量。

清单1.14 Hello.py

033-05

代码清单1.14定义了main()函数,该函数检查命令行形参的数量:如果该值大于等于2,则为变量名分配第二个形参的值(第一个形参为Hello.py),否则Hello将作为变量值分配给name。然后,print语句打印变量name的值。

代码清单1.14的最后部分使用条件逻辑来确定是否执行main()函数。