### 1.3.3 程序的执行方式
像上面 HelloWorld 程序所演示的那样,在 Python 解释器提示符>>>下输入语句并执行的 方式称为交互执行方式。
交互执行方式对执行单条语句来说是合适的,但是如果一个程序只有一条语句,那这个 程序肯定做不了什么大事。有用的程序都是由很多条语句组成的,而由很多条语句组成的程 序是不适合以交互方式执行的。例如,如果我们想让计算机在屏幕上连续显示三句问候语, 在交互方式下必然是这样的:
```
>>> print "Hello, Lucy."
Hello, Lucy.
>>> print "How are you?"
How are you?
>>> print "Goodbye, Lucy."
Goodbye, Lucy.
```
以上交互执行的结果明显不能令人满意,因为语句是每输入一条就执行一条,导致我们 希望连续显示的三句问候语被输入的程序语句分隔开了。
交互执行方式还有一个更严重的不足之处是:程序没有保存,语句一旦执行完就丢弃了, 因此无法多次执行一个程序。还是拿上面的例子来说,当用户想再次显示那三句问候语,他 就不得不重新输入所有语句。
为了解决上述问题,我们可以先将程序语句输入并保存在一个文件中,然后再“成批” 地执行程序文件中的所有语句。稍后的程序 1.2 给出了连续显示三句问候语的程序文件,执 行该程序文件即能看到连续显示的三句问候语,更重要的是该程序文件是“一次编写、永久 保存、多次执行”的。
Python 程序文件及其执行方式
将程序语句保存在一个扩展名为.py 的文本文件中,这种程序文件称为模块(module)。 还是以我们的第一个程序 HelloWorld 为例,先运行任何一种文本编辑器(如 Windows
的记事本①)新建一个文件,在文件中输入语句 print "Hello, World!" ,然后将文件 保存为 hello.py,这样就创建了一个 Python 程序文件(即模块):
【程序 1.1】hello.py
```
print "Hello, World!"
```
接下来的问题是:如何执行模块文件 hello.py?在 Windows + Python 的平台上,我们有 多种可选择的方式。第一种方式是在 Windows 的命令提示符②下直接用 Python 解释器(即python.exe 文件)执行该程序: C:\Python27> python hello.py Hello, World!
> ① 用 Word 之类的编辑器也可以,但要注意保存时必须选择纯文本格式。
> ② 俗称 DOS 界面。
效果如图 1.6(a)所示。
第二种方式是在 Python 解释器(命令行或 GUI)环境的提示符下执行 import 语句来“导 入”程序文件,该语句的作用是将 Python 模块从磁盘加载到内存中,在加载的同时执行模块 的每一条语句,就如在解释器环境下手工输入语句一样。具体语句形式如下:
```
>>> import hello
Hello, World!
```
效果如图 1.6(b)所示。注意,与第一种方式不同的是,模块文件名中不带扩展名“.py”, 因为 Python 自动假设模块具有“.py”扩展名。
![](https://box.kancloud.cn/2016-02-22_56cafcdbf2080.png)
(a)
![](https://box.kancloud.cn/2016-02-22_56cafcdc0f714.png)
(b)
图 1.6 Python 程序文件的执行方式
顺便说一下,第一次导入模块文件时,Python 会创建一个文件名相同但扩展名为.pyc 的 文件(本例中就是 hello.pyc),这是被 Python 解释器使用的一个中间文件——字节码文件。 Python 语言的翻译采用的是编译、解释混合方式:模块文件中的 Python 源程序首先被编译成 较低级的字节码指令,然后再解释执行这些字节码指令。如果已经生成了.pyc 文件,以后再 导入相应的模块时速度就会更快,因为无需再次编译。反之,如果为了节省存储空间而删 去.pyc 文件,下次导入模块时就需要重新编译。
第三种执行方式是直接在 Windows 文件夹中找到程序文件 hello.py,然后双击文件图标。 在时,Windows 系统首先打开一个 Python 解释器的命令行窗口(类似图 1.6(b)),然后执行 该程序,执行结束后 Windows 自动关闭命令行窗口。这种方式最简单直接,但它有一个让新 手困惑的小问题:由于程序执行的非常快,用户可能还没看清发生了什么,窗口就关闭了。 这个问题用一个小技巧就可以解决:在程序的最后放一条输入语句,该输入语句能让程序执 行完前面的语句后停顿下来等待用户输入,用户便有时间看清程序此前的运行结果。输入语 句的具体用法见第 2 章。
第四种方式是先在 IDLE 中打开(或者新建)程序文件 hello.py,具体打开方法可以利用 IDLE 菜单栏上的 File/Open...菜单项,也可以通过右键点击 hello.py 文件图标并选择“Edit with IDLE”菜单项。打开文件后进入 IDLE 自带的程序开发环境①窗口,在此窗口中选择 Run 菜 单中的 Run Module 命令(或直接按 F5 键)即可执行程序。注意程序的执行结果是显示在 Python 解释器提示符窗口中的。
> ① 程序开发环境是专为程序员使用某种语言编程而设计的系统,在其中可以方便地编辑、存储、执行、调试 程序。很多语言都有流行的集成开发环境(IDE)可用。IDLE 是标准的 Python 开发环境。
下面我们将前面提到的连续显示三条问候信息的程序保存到文件中:
【程序 1.2】eg1_2.py
```
print "Hello, Lucy."
print "How are you?"
print "Goodbye, Lucy."
```
如果以上述第四种方式来执行 eg1_2.py,会得到如图 1.7 所示的结果。从图中可见,显示的信息如我们所愿是连续的三句话。
![](https://box.kancloud.cn/2016-02-22_56cafcdc20e89.png)
图 1.7 在 IDLE 中执行程序 1.2
在本书中,我们主要用两种方式来执行语句或程序。
当介绍 Python 语言的有关语句时,我们经常在 Python 解释器环境的提示符下以交互方 式逐条执行语句,因为这对特定内容的讲解和演示非常方便。作为标志,凡是用交互方式执 行的程序语句,我们都在语句前附上提示符“>>>”(注意:提示符不是程序的一部分!)。
当我们编写较大的完整程序时,一般都将程序保存为文件,然后再以前述任何方式来执 行该程序文件。为便于交叉引用,对于完整的程序文件,本书都会像程序 1.1 和程序 1.2 那样 专门编号,并给出程序文件名。
不管用交互方式还是批方式,强烈建议读者在阅读本书时亲自输入并执行这些语句或程 序。另外,建议读者使用 IDLE 的程序开发环境,因为 IDLE 是图形界面的环境,提供自动 缩进、用颜色区分语言成分等特性,能方便而高效地编辑、执行和调试程序。
Python 搜索路径 还有个问题是关于程序文件保存位置的。在前面提到的程序文件的第一、第二种执行方式下,我们实际上假设了
```
C:\Python27> python hello.py
```
和
```
>>> import hello
```
这两条命令都能找到要执行的程序文件 hello.py。事实上,如果我们将 hello.py 保存在 Python的安装目录 C:\Python27 之下,那这两条命令都能成功执行程序 hello.py。 但作为一种好的习惯,不应该将用户文件和系统文件混放在一起,因此我们通常都将自己的程序文件如 hello.py 保存在自己的目录中。这时如果还像上面两条命令这样通过文件名 来找程序文件,则要么 Windows 会报错说找不到指定文件,要么 Python 解释器会报错说找 不到指定模块。对此,一种解决方法是在文件名前面加上绝对路径,以告知系统该文件保存 在哪里,例如假设 D:\myPython 是我们保存程序文件的目录,则可以像下面这样执行程序:
```
C:\Python27> python D:\myPython\hello.py
```
或者
```
>>> import D:\myPython\hello
```
另一种更方便的做法是预先将 D:\myPython 添加到 Python 的搜索路径中,使系统仅根据 文件名就能找到程序文件。具体做法是,先用任何文本编辑器建立一个文本文件,其内容是 要添加的目录路径,例如:
```
D:\myPython
```
然后保存为扩展名为.pth 的文件,如“mypath.pth”,最后将这个文件复制到安装目录下的指 定子目录 C:\Python27\Lib\site-packages 中。
如果是以第三、第四种方式来执行程序文件,系统总是在当前工作目录中找文件,一般 不会出现找不到文件的问题。
- 前言
- 第 1 章 计算与计算思维
- 1.1 什么是计算?
- 1.1.1 计算机与计算
- 1.1.2 计算机语言
- 1.1.3 算法
- 1.1.4 实现
- 1.2 什么是计算思维?
- 1.2.1 计算思维的基本原则
- 1.2.2 计算思维的具体例子
- 1.2.3 日常生活中的计算思维
- 1.2.4 计算思维对其他学科的影响
- 1.3 初识 Python
- 1.3.1 Python 简介
- 1.3.2 第一个程序
- 1.3.3 程序的执行方式
- 1.3.4 Python 语言的基本成分
- 1.4 程序排错
- 1.5 练习
- 第 2 章 用数据表示现实世界
- 2.1 数据和数据类型
- 2.1.1 数据是对现实的抽象
- 2.1.1 常量与变量
- 2.1.2 数据类型
- 2.1.3 Python 的动态类型*
- 2.2 数值类型
- 2.2.1 整数类型 int
- 2.2.2 长整数类型 long
- 2.2.3 浮点数类型 float
- 2.2.4 数学库模块 math
- 2.2.5 复数类型 complex*
- 2.3 字符串类型 str
- 2.3.1 字符串类型的字面值形式
- 2.3.2 字符串类型的操作
- 2.3.3 字符的机内表示
- 2.3.4 字符串类型与其他类型的转换
- 2.3.5 字符串库 string
- 2.4 布尔类型 bool
- 2.4.1 关系运算
- 2.4.2 逻辑运算
- 2.4.3 布尔代数运算定律*
- 2.4.4 Python 中真假的表示与计算*
- 2.5 列表和元组类型
- 2.5.1 列表类型 list
- 2.5.2 元组类型 tuple
- 2.6 数据的输入和输出
- 2.6.1 数据的输入
- 2.6.2 数据的输出
- 2.6.3 格式化输出
- 2.7 编程案例:查找问题
- 2.8 练习
- 第 3 章 数据处理的流程控制
- 3.1 顺序控制结构
- 3.2 分支控制结构
- 3.2.1 单分支结构
- 3.2.2 两路分支结构
- 3.2.3 多路分支结构
- 3.3 异常处理
- 3.3.1 传统的错误检测方法
- 3.3.2 传统错误检测方法的缺点
- 3.3.3 异常处理机制
- 3.4 循环控制结构
- 3.4.1 for 循环
- 3.4.2 while 循环
- 3.4.3 循环的非正常中断
- 3.4.4 嵌套循环
- 3.5 结构化程序设计
- 3.5.1 程序开发过程
- 3.5.2 结构化程序设计的基本内容
- 3.6 编程案例:如何求 n 个数据的最大值?
- 3.6.1 几种解题策略
- 3.6.2 经验总结
- 3.7 Python 布尔表达式用作控制结构*
- 3.8 练习
- 第 4 章 模块化编程
- 4.1 模块化编程基本概念
- 4.1.1 模块化设计概述
- 4.1.2 模块化编程
- 4.1.3 编程语言对模块化编程的支持
- 4.2 Python 语言中的函数
- 4.2.1 用函数减少重复代码 首先看一个简单的用字符画一棵树的程序:
- 4.2.2 用函数改善程序结构
- 4.2.3 用函数增强程序的通用性
- 4.2.4 小结:函数的定义与调用
- 4.2.5 变量的作用域
- 4.2.6 函数的返回值
- 4.3 自顶向下设计
- 4.3.1 顶层设计
- 4.3.2 第二层设计
- 4.3.3 第三层设计
- 4.3.4 第四层设计
- 4.3.5 自底向上实现与单元测试
- 4.3.6 开发过程小结
- 4.4 Python 模块*
- 4.4.1 模块的创建和使用
- 4.4.2 Python 程序架构
- 4.4.3 标准库模块
- 4.4.4 模块的有条件执行
- 4.5 练习
- 第 5 章 图形编程
- 5.1 概述
- 5.1.1 计算可视化
- 5.1.2 图形是复杂数据
- 5.1.3 用对象表示复杂数据
- 5.2 Tkinter 图形编程
- 5.2.1 导入模块及创建根窗口
- 5.2.2 创建画布
- 5.2.3 在画布上绘图
- 5.2.4 图形的事件处理
- 5.3 编程案例
- 5.3.1 统计图表
- 5.3.2 计算机动画
- 5.4 软件的层次化设计:一个案例
- 5.4.1 层次化体系结构
- 5.4.2 案例:图形库 graphics
- 5.4.3 graphics 与面向对象
- 5.5 练习
- 第 6 章 大量数据的表示和处理
- 6.1 概述
- 6.2 有序的数据集合体
- 6.2.1 字符串
- 6.2.2 列表
- 6.2.3 元组
- 6.3 无序的数据集合体
- 6.3.1 集合
- 6.3.2 字典
- 6.4 文件
- 6.4.1 文件的基本概念
- 6.4.2 文件操作
- 6.4.3 编程案例:文本文件分析
- 6.4.4 缓冲
- 6.4.5 二进制文件与随机存取*
- 6.5 几种高级数据结构*
- 6.5.1 链表
- 6.5.2 堆栈
- 6.5.3 队列
- 6.6 练习
- 第 7 章 面向对象思想与编程
- 7.1 数据与操作:两种观点
- 7.1.1 面向过程观点
- 7.1.2 面向对象观点
- 7.1.3 类是类型概念的发展
- 7.2 面向对象编程
- 7.2.1 类的定义
- 7.2.2 对象的创建
- 7.2.3 对象方法的调用
- 7.2.4 编程实例:模拟炮弹飞行
- 7.2.5 类与模块化
- 7.2.6 对象的集合体
- 7.3 超类与子类*
- 7.3.1 继承
- 7.3.2 覆写
- 7.3.3 多态性
- 7.4 面向对象设计*
- 7.5 练习
- 第 8 章 图形用户界面
- 8.1 图形用户界面概述
- 8.1.1 程序的用户界面
- 8.1.2 图形界面的组成
- 8.1.3 事件驱动
- 8.2 GUI 编程
- 8.2.1 UI 编程概述
- 8.2.2 初识 Tkinter
- 8.2.3 常见 GUI 构件的用法
- 8.2.4 布局
- 8.2.5 对话框*
- 8.3 Tkinter 事件驱动编程
- 8.3.1 事件和事件对象
- 8.3.2 事件处理
- 8.4 模型-视图设计方法
- 8.4.1 将 GUI 应用程序封装成对象
- 8.4.2 模型与视图
- 8.4.3 编程案例:汇率换算器
- 8.5 练习
- 第 9 章 模拟与并发
- 9.1 模拟
- 9.1.1 计算机建模
- 9.1.2 随机问题的建模与模拟
- 9.1.3 编程案例:乒乓球比赛模拟
- 9.2 原型法
- 9.3 并行计算*
- 9.3.1 串行、并发与并行
- 9.3.2 进程与线程
- 9.3.3 多线程编程的应用
- 9.3.4 Python 多线程编程
- 9.3.5 小结
- 9.4 练习
- 第 10 章 算法设计和分析
- 10.1 枚举法
- 10.2 递归
- 10.3 分治法
- 10.4 贪心法
- 10.5 算法分析
- 10.5.1 算法复杂度
- 10.5.2 算法分析实例
- 10.6 不可计算的问题
- 10.7 练习
- 第 11 章 计算+X
- 11.1 计算数学
- 11.2 生物信息学
- 11.3 计算物理学
- 11.4 计算化学
- 11.5 计算经济学
- 11.6 练习
- 附录
- 1 Python 异常处理参考
- 2 Tkinter 画布方法
- 3 Tkinter 编程参考
- 3.1 构件属性值的设置
- 3.2 构件的标准属性
- 3.3 各种构件的属性
- 3.4 对话框
- 3.5 事件
- 参考文献