1.3 Python解释器
以数字序列的方式来编写程序是非常烦琐的(尽管在计算机时代的早期阶段,程序员就是这么做的)。幸运的是,人们很快意识到,他们可以为编写程序而定义特殊的语言,并使用计算机将程序从高级编程语言转换为机器代码。早期的编程语言有Fortran、COBOL和BASIC。今天流行的语言有C++、C#、Java和JavaScript等。Python是另一种非常流行的编程语言:它是由荷兰数学中心(Stichting Mathematisch Centrum)的Guido van Rossum于20世纪90年代初发明的。
在高级编程语言中,每个语句都转换为多个CPU指令。图1-3展示了一个用Python编写的函数,它由一个文档字符串(Docstring,三引号中的一段注释,帮助使用该函数)和一些语句组成。
图1-3 用Python编写的函数
用机器语言或汇编语言编写的程序仅适用于具有兼容性CPU的计算机。换句话说,命令/语句限定于特定的CPU。用高级语言编写的程序可以与任何CPU一起使用。例如,它可以在PC或Mac上运行。
✦ ✦ ✦
有两种方法,可以将高级编程语言编写的程序转换为机器代码。第一种方法称为“编译”:一种称为“编译器”的特殊程序,检查高级语言编写的程序文本,生成适当的机器语言指令,并将它们保存在一个可执行文件中,该文件可以在计算机上运行。程序编译后,运行该文件就不需要编译器了。第二种方法称为“解释”:一种称为“解释器”的特殊程序,检查程序的文本,生成适当的指令,并立即执行这些指令。解释器不会创建可执行文件,每次运行程序都需要解释器。
编译就像外语教材的书面翻译一样,解释就像在外国人说话的同时进行同声翻译。解释器可以从文件中读取程序,也可以允许你以交互方式逐行输入程序语句。
一些现代语言(如Java)使用混合的方法。首先,它们将程序编译成一种称为“字节码”的中间低级语言,它仍然独立于特定的CPU,但更紧凑,更接近机器语言。然后它们在解释字节码时执行程序。Python也将“模块(函数库)”预编译为字节码。
✦ ✦ ✦
程序的文本由相当严格的语法规则控制:你不能简单地输入随心所欲的内容,并指望计算机理解它。
程序中的每个符号都必须位于正确的位置。
在英语或其他自然语言中,你可以拼错一个单词或省略一些标点符号,但仍然可以生成可读的文本。这是因为自然语言具有“冗余”,信息以低于最佳效率的方式传输,但这导致即使它有某种乱码,读者仍可以正确地解释消息(见图1-4)。
图1-4 Lyla Fletcher Groom的故事,5岁(由写作研讨会提供)
编程语言实际上没有冗余,几乎每个字符都是必不可少的。编程中很可能会犯错误,因此编程人员必须学会耐心并注重细节,在修复代码的错误时坚持不懈。
✦ ✦ ✦
我们现在准备使用Python。根据开源许可证,Python可免费获得,即使是商业应用程序也是如此。Python许可证由Python Software Foundation管理。
在本书中,我们将使用Python 3,即Python的较新版本。
▼
早期版本的Python称为“Python 2”。Python 2和Python 3之间存在一些差异——它们不是百分之百兼容。在撰写本书时,Python 3的最新版本是3.7.3。
关于如何下载适用于你的计算机和操作系统的Python安装程序,请参阅其他相关入门教程。
▲
✦ ✦ ✦
在编译语言时,你需要创建程序文本,并将它保存在一个文件中,称为“源代码”,然后让源代码文件通过编译器运行,以得到可执行程序。在Python中,你可以从源文件中读取程序,也可以在Python解释器Shell中输入单个语句,并立即查看结果。
使用GUI(图形用户界面)前端运行Python解释器很方便。标准安装的Python附带的GUI称为IDLE(见图1-5)。
图1-5 在Windows系统中,Python的GUI“Shell”,称为IDLE
>>>是Python解释器的“提示符”。提示符是来自程序的信号,表示它正在等待用户输入。用户可以输入语句,当用户按<Enter>键时,解释器会显示结果。
例如,输入:
>>> 2+3 <Enter>
(用户输入以粗体显示)。Python会显示:
5 >>>
看起来很不错!这里发生了很多事情。解释器读取你输入的文本行(语句),然后分析文本并发现该语句有两个用+号分隔的数字。分析文本并提取它的组件的过程称为“解析”。
一些小实验会让你相信空格并不重要(只要语句在提示后立即开始,没有前导空格)。例如,你可以输入2+3或2+3或2+3——结果相同。但是如果你输入2+* 3,你就会得到:
>>> 2+*3
^
SyntaxError: invalid syntax
>>>
现在尝试:
>>> 2(3+4)
你预期会得到14,对吗?没有!你得到的是:
Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> 2(3+4) TypeError: 'int' object is not callable
显然,Python解释器“认为”你输入的语句有问题。但是,Python(让我们将解释器简称为Python)不是报告语法错误,而是报告了别的内容,这似乎没有什么帮助。TypeError指的是一个对象的“类型”(一个整数、一个函数等),而不是你在键盘上输入的内容。显然Python已经断定你试图用一个名为2的函数调用输入值3+4,所以Python告诉你(以它自己神秘的方式),2不是一个函数。你可能会认为Python有时非常愚蠢。事实上,它既不聪明也不愚蠢——它只是一段代码。
同时,你真正的意思是:
>>> 2*(3+4)
也许你认为乘法符号是可省略的,就像在数学中一样。不是这样。正如我们告诉过你:每个字符都很重要!
第1.3节练习
1.定义“冗余”。✔
2.在Python解释器中输入2+−3。这是有效的语法吗?解释结果。现在对2++ 3做同样的事情。
3.■尝试2+++ 3。解释结果。
4.尝试2** 3和2 ** 4。Python的运算符**表示什么?
5.在Python中,单引号、双引号或三引号中的文本片段代表“文字字符串”。尝试"abc" + "def"和'abc' + 'def'和'''abc''' + '''def'''和"""abc""" + """def"""。解释+运算符应用于字符串时的作用。✔
6.*运算符可以应用于整数和字符串吗?尝试3 *'La'并解释结果。
7.输入9−8*2+6并解释结果。输入(5−1)*(1+2)**3并解释结果。Python表达式中,“运算符的优先级”是什么(即首先应用哪些运算符)? ✔
8.■在Python提示符处输入17%3,同时尝试15%4和15%5。%运算符计算什么?与+、 −、*、/和**相比,运行一些测试以确定其等级(优先级)。 ✔