### 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”擴展名。

(a)

(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 所示的結果。從圖中可見,顯示的信息如我們所愿是連續的三句話。

圖 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 事件
- 參考文獻