
1.4 Python程序执行原理
1.4.1 运行hello_world.py时发生的情况
运行hello_world.py时,Python都做了些什么呢?下面来深入研究一下。实际上,即便是运行简单的程序,Python所做的工作也相当多。
【示例10】 hello_world.py

运行上述代码时,你将看到如下输出:

运行文件hello_world.py时,末尾的.py指出这是一个Python程序,因此编辑器将使用Python解释器来运行它。Python解释器读取整个程序,确定其中每个单词的含义。例如,看到单词print时,解释器就会将括号中的内容打印到屏幕,而不会管括号中的内容是什么。
编写程序时,编辑器会以各种方式突出程序的不同部分。例如,它知道print是一个函数的名称,因此将其显示为蓝色;它知道“Hello Python world!”不是Python代码,因此将其显示为橙色。这种功能称为语法突出,在你刚开始编写程序时很有帮助。
1.4.2 Python的文件类型
Python的文件类型主要分为3种,分别是源代码、字节代码和优化代码。这些代码都可以直接运行,不需要进行编译或者连接。这正是Python语言的特性,Python的文件通过python.exe或pythonw.exe解释执行。
1.源代码
Python源代码的文件以py为扩展名,由python.exe解释,可以在控制台上运行。用Python语言写的程序不需要编译成二进制代码,可以直接运行源代码。pyw是程序开发图形用户界面(GUI)的源文件的扩展名,作为桌面应用程序,这种文件是专门用于开发图形界面的,由pythonw.exe解释运行。py和pyw类型的文件可以用文本工具打开并进行编辑。
2.字节代码
Python源文件经过编译后生成扩展名为pyc的文件,pyc文件是编译过的字节文件。这种文件不能使用文本工具打开或修改。pyc文件是与平台无关的。因此Python的程序可以运行在Windows、UNIX和Linux等操作系统上。py文件直接运行后即可得到pyc类型的文件或者通过脚本生成该类型的文件。例如,下面这段脚本可以把hello_world.py文件编译为hello_world.pyc文件:

3.优化代码
经过优化的源文件生成扩展名为pyo的文件,pyo类型的文件需要命令行工具生成,pyo文件也不能使用文本工具打开或修改。例如,用下面的步骤把hello_world.py文件编译成hello_world.pyo文件。
(1)启动命令窗口,进入hello_world.py文件所在目录。
(2)在命令行中输入“python-O-m py_compile hello_world.py”。
➢ 参数-O表示生成优化代码。
➢ 参数-m表示把导入的py_compile模块作为脚本运行。编译hello_world.pyo需要调用py_compile模块中的compile()方法。
➢ 参数hello_world.py是待编译的文件名。
编译完成后,会发现在hello.py的目录下已经生成了一个hello_world.pyo文件。
1.4.3 Python是一种解释型语言
Python是一种解释型语言,它的源代码不需要编译,可以直接运行。Python解释器将源代码转换为字节码,然后把编译好的字节码转发到Python虚拟机(Python Virtual Machine,PVM)中执行。接下来,通过一张图来描述Python程序的执行过程,如图1-29所示。

图1-29 Python程序执行过程
在图1-29中,当我们运行Python程序时,Python解释器会执行下面两个步骤。
(1)把源代码编译成字节码
编译后的字节码是特定于Python的一种表现形式,它不是二进制的机器码,需要进一步编译才能被机器执行,这也是Python代码无法运行得像C/C++一样快的原因。如果Python进程在计算机上拥有写入权限,那么它将把程序的字节码保存为一个扩展名为pyc的文件;如果Python无法在计算机上写入字节码,那么字节码将会在内存中生成并在程序结束时自动丢弃。在构建程序时,最好给Python赋予在计算机上写入的权限,这样只要源代码没有改变,生成的pyc文件就可以重复利用,提高执行效率。
(2)把编译好的字节码转发到Python虚拟机中执行
Python虚拟机是Python的运行引擎,是Python系统的一部分,它是迭代运行字节码指令的一个大循环,一个接一个地完成操作。
1.4.4 技能训练
上机练习2海洋单位距离的换算
需求说明
在陆地上可以使用参照物确定两点间的距离,使用厘米、米、千米等作为计量单位,而海上缺少参照物,人们将赤道上经度的1分对应的距离记为1海里,使用海里作为海上计量单位。千米与海里可以通过以下公式换算:

编写程序,实现千米与海里的换算。
上机练习3打印学生证
需求说明
学生证上面一般会有盖着学校钢印的本人一寸彩色或者黑白照片,如是大学生,会有你所在学院以及班级,还有你的在校年限(入学时间——毕业时间)。学生持学生证乘坐火车、汽车、外出旅游等可以享受优惠待遇。编写程序,模拟输出如图1-30所示的学生证信息。

图1-30 学生证信息
本章总结
本章主要介绍了Python的一些入门知识,包括Python的特点、版本、应用领域、开发环境的搭建、编程规范、变量、输入/输出函数等。通过本章的学习,希望学生能够独立搭建Python开发环境,并对Python开发有初步的认识,为后续学习做好铺垫。
本章作业
一、填空题
1.Python是由荷兰人________________开发的。
2.Python是一种面向________________语言。
3.由于Python具有良好的____________,因此Python编写的程序可以在任何平台上执行。
4.缩进是Python的编码规范之一,Python每个缩进级别为4个空格,可使用一个___________代替,但禁止其与空格混用。
5.Python解释器安装完成后,在Windows或Linux的命令行中输入_______________命令,可进入Python解释器。
二、判断题
1.Python具有丰富的第三方库。( )
2.Python 2与Python 3中的异常处理方式相同。( )
3.PyCharm是一个完全免费的IDE工具。( )
三、选择题
1.Python程序文件的扩展名是( )。
A.python
B.py
C.pt
D.py
2.下列选项中,不属于Python特点的是( )。
A.面向对象
B.运行效率高
C.可读性好
D.开源
3.关于Python命名规范的说法中,下列描述错误的是( )。
A.模块名、包名应简短且全为小写
B.类名首字母一般使用大写
C.常量通常使用全大写命名
D.函数名中不可使用下画线
4.关于input()函数与print()函数的说法中,下列描述错误的是( )。
A.input()函数可以接收使用者输入的数据
B.input()函数会返回一个字符串类型数据
C.print()函数可以输出任何类型的数据
D.print()函数输出的数据不支持换行操作
5.下列选项中合法的标识符是( )。
A._7a_b
B.break
C._a$b
D.7ab
四、简答题
1.请简述Python的特点。
2.请简述Python 2与Python 3的区别。
3.简述Python的应用领域(至少5个)。
4.简述PyCharm的便捷功能(至少3点)。
五、编程题
1.使用PyCharm IDE编写Python程序,打印出以下符号:

2.请使用Python中的print()函数输出“I'm from China”。