1.2.1 IPython控制台

为了让我们的讨论集中在Python,而不是各种平台的细节上,我们假设你在阅读本指南时使用的是Spyder。但这不是必需的!如果你希望从更简单的界面开始,可以在Anaconda Navigator中打开Qt控制台应用程序,并开始输入命令。如果你喜欢笔记本界面,可以使用Jupyter Notebook(参见附录C)。如果你喜欢在命令行中工作,可以从终端启动IPython(见附录B)。不过,在某些情况下,你需要一个IPython解释器和一个文本编辑器。Spyder包含了这两个功能,以及其他一些有用的功能,其界面也是MATLAB用户所熟悉的。使用Python有许多种方法,你可以在学习本书时使用其中任何一种方法。如果你是Python新手,Spyder是一个不错的选择。

现在打开Spyder。启动后,Spyder会打开一个窗口,其中包含多个窗格,见图1.1。左边是编辑器窗格,用于编辑程序文件(脚本)。右边有两个窗格。

图1.1 Spyder界面。添加圆圈是为了强调(从上到下、从左到右)按钮、首选项(扳手图标)、变量管理器中的变量、将变量管理器置于其窗格前部的选项卡、按钮、IPython命令提示符和IPython控制台选项卡

右上角窗格可能包含帮助、变量管理器、绘图和文件管理器选项卡。如果有必要,单击变量管理器的选项卡,可将其置于最前面。右下角窗格应包括IPython控制台的选项卡;如果需要,可以单击它[6]。这里提供了命令行解释器,你可以在输入Python命令时以交互方式执行命令。


[6] 如果没有出现IPython控制台选项卡,可以从界面顶部的菜单中打开:“Consoles”>“New console”。

如果你的窗口布局变得杂乱无章,不要担心。窗口布局很容易调整。Spyder的标准格式是一个窗口,分为刚才描述的3个窗格。每个窗格可以有多个选项卡。如果有不需要的窗口,可以单击按钮分别关闭它们。你还可以使用菜单“View”>“Panes”选择要显示的窗格,并停用不需要的窗格。点击“View”>“Window layouts”>“Spyder Default Layout”,将恢复标准布局。

单击IPython控制台内部。现在,你输入的内容将显示在命令提示符后。默认情况下,命令提示符类似于:

In[1]:

尝试输入简单的命令,如“2+2”,并在每行后按<Return>。Python在每次<Return>后立即响应,以尝试执行你输入的任何命令[7]


[7] 本书使用“命令”一词来表示可由解释器执行的任何Python语句。像a=1这样的赋值,像plt.plot(x,y)这样的函数调用,以及像%reset这样的特殊指令都是命令。

单击变量管理器选项卡。每次输入命令并按<Return>后,此窗格的内容将反映Python状态的任何变化:最初为空,然后显示变量列表及其值的摘要[8]。当变量包含多个值(例如数组)时,双击列表中的该变量,可以打开包含该数组所有值的电子表格。你可以在此电子表格中复制数据并粘贴到其他应用程序中。


[8] 某些变量不会显示。你可以通过变量管理器窗格右上角的菜单来控制哪些变量被排除在外。

在任何时候,你都可以通过退出并重新启动Python,或者通过执行以下命令来重置Python的状态:

%reset

由于此操作将删除会话中创建的几乎所有内容,是不可逆的,因此它需要你确认[9]。按<Y>,然后按<Return>继续。(以%符号开头的命令是魔法命令,即IPython解释器中特有的命令。魔法命令可能不适用于原生Python解释器和你编写的脚本。要了解更多信息,请在IPython命令提示符下输入%magic。)


[9] 如果IPython似乎没有对%reset响应,请尝试手动向上滚动IPython控制台以查看确认询问。

示例:使用%reset命令,然后在提示符下尝试以下命令。如下所示准确输入每一行,然后按<Return>,解释你所看到的结果:

q
q == 2
q = 2
q
q == 2
q == 3

解答:对于前两行,Python会报错。最初,符号q没有与任何对象关联,它没有值,因此涉及q的表达式是无法计算的。第3行改变了Python的状态,进而会改变这种情况,因此最后3行不会产生错误。

示例:现在再次清除Python的状态。在提示符下尝试以下操作,并解释你所看到的结果(参考1.1.4小节可能会有用):

a = 1
a
b = a**2 - a
b
a = 2
print(a)
print(b)
b = a**2 - a
a, b
print(a, b)

解答:前4行的结果应该很清楚——我们给变量ab赋值。在第5行中,我们更改了a的值,但因为Python只记住b,而记不住它与a的关系,所以b的值是不变的,直到我们在第8行显式地更新b的值。

在命令提示符下输入代码时,你可能会遇到一种令人困惑的情况,Python似乎没有响应,只显示“...:”,而不是执行命令。

如果命令包含不成对的(、[或{,则Python将继续读取更多行,搜索相应的)、]或}。

现在请寻找不匹配的括号。如果找到,请输入右括号并按<Return>。如果不知道如何匹配括号,或者有其他问题,可以使用<Shift-Return>强制执行,或者按<Esc>中止命令[10]


[10] <Esc>会取消Spyder中的当前命令。在其他IDE或解释器中,可能需要使用<Ctrl-C>进行中断,使用<Alt-Return>进行强制执行。

上面示例说明了一个要点:赋值语句不会显示赋值之后变量的值。要在IPython会话中查看赋值之后变量的值,可以使用print()命令或在单独的一行中输入变量名[11]


[11] 在你编写的脚本中,Python将计算表达式,但不会在屏幕上显示任何内容;如果想要输出结果,就必须给出一个显式的print()命令。脚本将在3.3节中讨论。

上面示例的最后两行展示了如何一次查看多个对象的值。请注意,两行的输出并不完全相同。

你可以通过开始新行来结束命令,也可以用分号(;)结束命令然后在同一行上添加另一个命令。

你还可以使用单个=命令进行多个赋值。这是使用分号的替代方法。以下两行都是将相同的值赋给各自的变量:

a = 1; b = 2; c = 3
x, y, z = 1, 2, 3

第二个命令的任何一侧都可以用括号括起来,结果不会受到影响。

前面的段落展示了用Python节省空间和简化输入的方法。有时候这很方便,但最好不要过多地使用这种能力。相反,你应该尝试使代码的含义尽可能清晰。为了便于阅读,值得在程序中花费一点额外的时间或者多输入几行代码。

在某些情况下,你可能希望使用一个很长的命令,但一行又容纳不下。在这种情况下,可以用反斜杠(\)结束一行。这时,Python将继续读取下一行作为同一命令的一部分。尝试以下命令:

q = 1 + \
2
print(q)

一个命令甚至可以扩展到多行:

xv\
a\
l\
= 1 + \
2

这将创建变量xval并将其赋值为3。

若要编写清晰的代码,可以使用少量的反斜杠和分号。