Python数据分析基础
上QQ阅读APP看书,第一时间看更新

1.3 与命令行进行交互的几项技巧

下面是与命令行进行交互的几项技巧。

使用向上箭头键得到以前的命令

命令行窗口和终端窗口的一个美妙功能是,你可以通过按向上箭头键找到以前输入的命令。试着在命令行窗口或终端窗口中按一下向上箭头键,找到你以前输入的命令,在Windows系统中是python first_script.py,在Mac系统中是./first_script.py。

这个功能非常方便,可以减少每次运行Python脚本时必需的输入量,特别是当Python脚本的文件名特别长或需要在命令行上提供额外的参数(比如输入文件名或输出文件名)的时候。

用Ctrl+c停止脚本

既然你已经学会了运行脚本,那么是时候学习一下如何中断和停止Python脚本了。在相当多的情况下,你应该知道如何停止脚本。例如,你可能会写出死循环代码,这样脚本就永远不会停止运行。另外一种情况是,你编写的代码可能需要很长时间才能执行完毕,如果你在代码中包含了print语句,并由此发现脚本不会生成需要的输出,这时就应该提前终止脚本。

在脚本开始运行之后,如果想随时中断或停止脚本,可以按Ctrl+c(Windows)或Control+c(macOS)。这会停止通过命令开始的进程。你不用太在意这项技术的细节,只要知道进程是计算机对一系列命令的处理过程就可以了。你编写了一个脚本程序,计算机将它解释成一个进程,如果这个程序非常复杂,就解释成一系列进程,这些进程或者顺序执行,或者并发执行。

读懂出错信息并找到解决方案

这部分的主题是如何处理比较麻烦的脚本,也简单说一下遇到以下问题应该如何解决。当你输入了./python first_script.py,或者试图运行任何一个Python脚本的时候,脚本没有正确运行,命令行窗口或终端窗口显示了出错信息。首先不要慌张,先读懂出错信息。某些情况下,出错信息中明确指出了代码中出现错误的行,你可以将精力集中在这一行上来纠正错误(你的文本编辑器或IDE应该设置成显示行号;如果不自动显示行号,请在菜单中找一下或在网上快速搜索一下,弄清楚如何显示行号)。重要的是要知道出错信息也是编程的一部分,学会编码也包括学会如何有效地调试程序错误。

更重要的是,因为出错信息是通用的,所以通常很容易学会如何调试程序错误。你很可能不是第一个遇到这种错误并在网上搜索解决方案的人。最好的做法是将整个错误信息(至少是信息的主要部分)复制到搜索引擎(例如:Google或者Bing)上,然后在搜索结果中仔细研究其他人是如何调试这种错误的。

熟悉Python内置的异常对象也是非常有帮助的,这样你就可以识别出标准的出错信息并知道如何改正错误。你可以在Python标准库页面(http://docs.python.org/3/library/exceptions.html)找到Python内置的异常,但是在网上通过出错信息搜索其他人的解决方案也是非常有用的。

向first_script.py添加更多的代码

现在,为了更熟练地编写Python代码和运行Python脚本,试着对first_script.py进行编辑,添加更多的代码,然后重新运行脚本。在进行新的练习时,可以把本章提供的代码段添加到脚本中原来代码的下方,保存脚本,然后重新运行。

举个例子,将下面的两段代码添加到原有的print语句下面,然后保存脚本并重新运行(请记住,如果你使用的是命令行窗口或终端窗口,在将这些代码添加到first_script.py并重新保存脚本之后,可以按向上箭头键,找到你用来运行脚本的命令,不需要将命令重新输入一遍):

# 两个数值相加
x = 4
y = 5
z = x + y
print("Output #2: Four plus five equals {0:d}.".format(z))
 
# 两个列表相加
a = [1, 2, 3, 4]
b = ["first", "second", "third", "fourth"]
c = a + b
print("Output #3: {0}, {1}, {2}".format(a, b, c))

 以#开头的行是注释,用来解释代码,描述代码的用途和目的。

第一个示例展示了将数值赋给变量、变量相加和格式化print语句的方法。这里详细说明一下print语句中的语法"{0:d}".format(z)。花括号({})是一个占位符,表示这里将要传入print语句一个具体的值,这里就是变量z的值。0指向format()方法中的第一个参数,在这里,只包含一个参数z,所以0就指向这个值;相反,如果有多个参数,0就确定地表示传入第一个参数。

冒号(:)用来分隔传入的值和它的格式。d表示这个值应该被格式化为整数,没有小数部分。在下一节中,你将会学习如何设定小数位数来显示浮点数。

第二个示例展示了创建列表、列表相加和将列表中的值以逗号分隔打印在屏幕上的方法。看一下print语句中的语法"{0},{1},{2}".format(a, b, c),它说明了如何在print语句中包含多个值。a被传给{0},b被传给{1},c被传给{2}。因为这3个值都是列表,不是数值,所以不设置数值格式。本章后面的小节会对这部分内容进行更深入的讨论。

为什么要在打印时使用.format

Python并不要求每条print语句都必须使.format,但是.format确实功能强大,可以为你节省很多输入。在上面的示例中,注意print("Output #3:{0},{1},{2}".format(a, b, c))的最终结果是用逗号分隔的3个变量。如果你想在不使用.format的情况下得到同样的结果,那么就应该这样写:print("Output #3: ",a,", ",b,", ",c),但这是一段非常容易出现输入错误的代码。后面还会介绍.format的其他用法,但是从现在开始,你就应该熟练掌握它的用法,以便在需要的时候加以使用。

图1-7和图1-8展示了在Anaconda Spyder和Notepad++中添加新代码的界面。

图1-7:在Anaconda Spyder中为first_script.py添加新代码

图1-8:在Notepad++(Windows)中为first_script.py添加新代码

如果你将前面的代码添加到了first_script.py中,那么当你保存并且重新运行脚本之后,会看到屏幕中有如下输出(参见图1-9):

Output #1: I'm excited to learn Python.
Output #2: Four plus five equals 9.
Output #3: [1, 2, 3, 4], ['first', 'second', 'third', 'fourth'],
[1, 2, 3, 4, 'first', 'second', 'third', 'fourth']

图1-9:在命令行窗口中运行添加了代码之后的first_script.py