SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
2從 REPL 到 IDE
 使用 REPL
 設定原始碼檔案編碼
 基本模組與套件管理
 認識 IDE 的使用
2-2 Python 3.5 技術手冊
2.1 從 'Hello World' 開始
第 一 個 "Hello World" 的 出 現 是 在 Brian Kernighan 寫 的 《 A Tutorial
Introduction to the Language B》書籍中(B 語言是 C 語言的前身),用來將
'Hello World'文字顯示在電腦螢幕上,自此之後,很多的程式語言教學文件或
書籍上,已經無數次地將它當作第一個範例程式。為什麼要用'Hello World'來
當作第一個程式範例?因為它很簡單,初學者只要鍵入簡單幾行程式(甚至一
行),可以要求電腦執行指令並得到回饋:顯示'Hello World'。
本書也要從顯示'Hello World'開始,然而,在完成這簡單的程式之後,千萬
要記得,探索這簡單程式之後的種種細節,千萬別過於樂觀地以為,你想從事
的程式設計工作就是如此容易駕馭。
2.1.1 使用 REPL
第一個顯示'Hello World'的程式碼,我們預計在 REPL(Read-Eval-Print
Loop)環境中進行(又稱為 Python Shell),這是一個簡單、互動式的程式設
計環境,不過,雖然它很簡單,然而在日後開發 Python 應用程式的日子裏,
你會經常地使用它,因為 REPL 在測試一些程式片段的行為時非常方便。
現在開啟「命令提示字元」,直接輸入 python 指令(不用加上任何引數),
這樣就會進入 REPL 環境。
圖 2.1 Python 的 REPL 環境
來很快地撰寫一些小指令進行測試,首先做些簡單的加法運算吧!從輸入 1 + 2
之後按下 Enter 開始:
>>> 1 + 2
3
>>> _
3
>>> 1 + _
4
第 2 章 從 REPL 到 IDE 2-3
>>> _
4
>>>
一開始執行了 1 + 2,顯示結果為 3,_代表了互動環境中上一次運算結果,
方便你在下一次的運算中直接取用上一次的運算結果。
在 REPL 環境中,可以按 Home 鍵將游標移至行首,按 End 鍵可以將游標移
至行尾。
一開始不是說要顯示'Hello World'嗎?接著就來命令 REPL 環境執行
print()函式,顯示指定的文字'Hello World'吧!
>>> 'Hello World'
'Hello World'
>>> print(_)
Hello World
>>> print('Hello World')
Hello World
>>>
在 Python 中,使用單引號''包含住的文字,會是程式中的一個字串值,有
關字串的特性,先知道這個就可以了,後續章節還會詳加探討。在 REPL 輸入
一個字串值後,會被當成是上一次的執行結果,因此 print(_)時,_就代表著
'Hello World',因此跟 print('Hello World')的執行結果是相同的。
如果在 REPL 中犯錯了,REPL 會有些提示訊息,怎看這些訊息有點神秘:
>>> print 'Hello World'
File "<stdin>", line 1
print 'Hello World'
^
SyntaxError: Missing parentheses in call to 'print'
>>>
在 Python 2.x 中,print 是個陳述句(Statement),然而從 Python 3.0
開始,必須使用 print()函式了,因此 print 'Hello World'會發生語法錯誤,其
實上面的訊息中 SyntaxError 也告知發生了語法錯誤,初學時面對這類錯誤訊
息,只要找出這個 Error 結尾的文字作為開始,慢慢也能看得懂發生了什麼錯
誤。
若要取得協助訊息,可以輸入 help(),例如:
>>> help()
2-4 Python 3.5 技術手冊
Welcome to Python 3.5's help utility!
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.5/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".
help>
這會進入 help()說明頁面,注意提示符號變成了 help>,在上頭這段文字
中有說明頁面的使用方式,像是想結束說明頁面,可以輸入 quit,想哪道有哪
些模組、關鍵字等,可以輸入 modules、keywords 等,例如來看看 Python 中有
哪些關鍵字:
help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False def if raise
None del import return
True elif in try
and else is while
as except lambda with
assert finally nonlocal yield
break for not
class from or
continue global pass
help>
剛才有使用過 print()函式,你會好奇它怎麼使用嗎?在說明頁面中輸入
print 就可以查詢了:
help> print
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
第 2 章 從 REPL 到 IDE 2-5
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
help>
現在輸入 quit,回到 REPL 中,實際上,在 REPL 中也可以直接輸入
help(print)來查詢函式等說明:
help> quit
You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type "help(object)". Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)
...略
>>>
如果要離開 REPL 環境,可以執行 quit()函式。實際上,如果只是要執行
個小程式片段,又不想麻煩地進入 REPL,可以在使用 python 指令時加上-c 引
數,之後接上使用""包含的程式片段。例如:
>>> quit()
C:UsersJustin>python -c "print('Hello World')"
Hello World
C:UsersJustin>python -c "help(print)"
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)
...略
C:UsersJustin>
在 Python 官方網站 www.python.org 首頁,也提供了一個互動環境,臨時要
試個程式小片段,又不想要安裝 Python 或找個裝有 Python 的電腦時,開個瀏
覽器就可以使用囉!
2-6 Python 3.5 技術手冊
圖 2.2 Python 的 REPL 環境
2.1.2 撰寫 Python 原始碼
我們總是要開啟一個原始碼檔案,正式一點地撰寫程式吧?在正式撰寫程
式之前,請先確定你可以看到檔案的副檔名,在 Windows 下預設不顯示副檔
名,這會造成重新命名檔案時的困擾,如果目前在「檔案總管」下無法看到副
檔名,Windows 7 下請執行「組合管理/資料夾和搜尋選項」,Windows 8 或
10 都可以執行「檢視/選項」,之後都是切換至「檢視」頁籤,取消「隱藏已
知檔案類型的副檔名」之選取。
第 2 章 從 REPL 到 IDE 2-7
圖 2.3 取消「隱藏已知檔案類型的副檔名」
接著選擇一個資料夾來撰寫 Python 原始碼檔案,本書都是在 C:workspace
資料夾中撰寫程式,請新增「文字文件」(也就是.txt 文件),並重新命名文
件為「hello.py」,由於將文字文件的副檔名從.txt 改為.py,系統會詢問是否更
改副檔名,請確定更改,如果是在 Windows 中第一次安裝 Python,而且依照
本章之前的方式安裝,那麼會看到檔案圖示變換為以下樣式,這個圖示上的吉
祥物是兩隻小蟒蛇(因為 Python 也有蟒蛇之意):
圖 2.4 變更副檔名為.py 後的圖示
2-8 Python 3.5 技術手冊
雖然 Python 有蟒蛇之意,不過 Guido van Rossum 曾經表示,Python 這個名
稱其實是取自他熱愛的 BBC 著名喜劇影集《Monty Python's Flying Circus》,
Python 官 方 網 站 的 FAQ 也 記 錄 著 這 件 事 :
docs.python.org/3/faq/general.html#why-is-it-called-python
而這個 FAQ 的下一則還很幽默地列出了「Do I have to like “Monty Python’s Flying
Circus”?」這個問題,答案是「No, but it helps. :)」。
如圖 2.4 中可以看到的,如果在.py 檔案上按滑鼠右鍵,可以執行「Edit with
IDLE」來開啟檔案進行編輯,IDLE 是 Python 官方內建的編輯器(本身也使用
Python 撰寫),這會比使用 Windows 內建的記事本撰寫 Python 程式來得好
一些,你可以如下撰寫程式碼:
圖 2.5 第一個 Python 程式
很簡單的一個小程式,只是使用 Python 的 print()函式指定文字,執行時
print()函式預設會在主控台(Console)顯示指定的文字。
接著執行選單「File/Save」儲存檔案。雖然你可以直接在 IDLE 中執行
「Run/Run Module」,啟動 Python 的 REPL 來執行程式,不過,在這邊要直
接使用命令提示字元,請開啟命令提示字元,切換工作資料夾至 C:workspace
(執行指令 cd c:workspace),然後如下使用 python 指令執行程式:
圖 2.6 執行第一個 Python 程式
2.1.3 哈囉!世界!
就程式語言來說,Python 確實是個入門簡易的語言,不過,無論任何一個
領域都請記得「事物的複雜度不會憑空消失,只會從一個事物轉移到另一個事
第 2 章 從 REPL 到 IDE 2-9
物」,在程式設計這領域也是如此,如果純綷只是想行銷 Python 這門語言給
你,介紹完方才的 Hello World 程式後,我就可以開始歌頌 Python 的美好。
實際上 Python 也有其深入的一面,也有其會面臨的難題,若你將來打算發
揮 Python 更強大的功能,或者需要解決更複雜的問題,就會需要進一步深度
探索 Python,在本書之後的章節,也會談到 Python 一些比較深入的議題。
至於現在,作為中文世界的開發者,想稍微觸碰一下複雜度,除了顯示 Hello
World 之外,不如再來試試顯示「哈囉!世界!」如何?請建立一個 hello2.py
檔案,這次不要使用 IDLE,直接使用 Windows 的「記事本」撰寫程式:
圖 2.7 第二個 Python 程式
接著在主控台中執行 python hello2.py,不幸地,這次出現了錯誤:
圖 2.8 喔哦!執行出錯了!
UTF-8
錯誤的訊息中顯示 SyntaxError,也就是語法錯誤,原因在於 Python 3 之
後,python 直譯器預期的原始碼檔案編碼必須是 UTF-8(Python 2.x 預期的是
ASCII),然而,Windows 的記事本預設編碼是 MS950(相容於 Big5),兩
者對於中文字元的位元組排列方式並不相同,python 直譯器看到無法解釋的位
元組,就發生了 SyntaxError。
UTF-8 是目前很流行的文字編碼方式,現在不少文字編輯器預設也會使用
UTF-8,像是方才使用的 IDLE,相同的程式碼使用 IDLE 撰寫儲存,執行時並
2-10 Python 3.5 技術手冊
不會發生錯誤,然而問題在於,許多人不使用 IDLE,你將來也可能會換用其他
編輯器,因此,在這邊必須告訴你這個事實。
如果你連 UTF-8 是什麼都不知道,那建議先看看〈哪來的純文字檔?〉、
〈Unicode 與 UTF〉、〈UTF-8〉這三篇文件:
openhome.cc/Gossip/Encoding/TextFile.html
openhome.cc/Gossip/Encoding/UnicodeUTF.html
openhome.cc/Gossip/Encoding/UTF8.html
Windows 的記事本可以在「另存新檔」時選擇文字編碼為 UTF-8,這是解
決問題的一個方式:
圖 2.9 記事本可在「另存新檔」時選擇文字編碼為 UTF-8
Windows 中 內 建 的 記 事 本 並 不 是 很 好 用 , 我 個 人 習 慣 用 NotePad++
(notepad-plus-plus.org),編輯檔案時,就可以直接在選單「編碼」中選擇
文字編碼:
圖 2.10 設定 NotePad++的文字編碼
第 2 章 從 REPL 到 IDE 2-11
設定原始碼編碼
若不想將檔案的文字編碼設定為 UTF-8,另一個解決方式是在原始碼的第
一行,使用註解設定編碼資訊。最簡單的設定方式是:
圖 2.11 設定 Python 原始碼檔案編碼
在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是
程式碼的一部份,如上加上#coding=MS950 之後,就可以正確地執行了:
圖 2.12 哈囉!世界!
在 hello2.py 的程式碼中,input()是個函式(Python 2.x 中使用的是
raw_input()),可用來取得使用者輸入的文字,呼叫函式時指定的文字會作為
主控台中的提示訊息,在使用者輸入文字並按下 Enter 後,input()函式會以字
串傳回使用者輸入的文字,在這邊你將之指定給 name 變數,之後使用 print()
函式依序顯示了'哈囉'、name 與'!'。
至於為什麼說是最簡單的設定方式呢?將來你也許還會看到其他的編碼設
定方式,例如:
# -*- coding: Big5 -*-
或者是:
# vim: set fileencoding=Big5 :
也許你還會看到更多其他的方式,這是因為實際上,python 直譯器只要在
註解中看到 coding=<encoding name>或者 coding: <encoding name>出現就可以
2-12 Python 3.5 技術手冊
了,因此,就算你在第一行撰寫#orz coding=MS950、#XDcoding: MS950,也都可
正確找出文字編碼設定。
這是為了因應各種編輯器的特性,有興趣的話,可以參考 PEP 0263:
www.python.org/dev/peps/pep-0263/
當中有說明,python 直譯器會使用底下這段規則表示式(Regular expression)
來擷取文字編碼設定:
^[ tv]*#.*?coding[:=][ t]*([-_.a-zA-Z0-9]+)
本書之後會介紹什麼是規則表示式,以及在 Python 中如何使用。
2.2 初識模組與套件
對於初學者來說,通常只需要一個.py 原始碼檔案,就可以應付各種範例程
式的程式碼數量,然而實際的應用程式需要的程式碼數量遠比範例程式要來得
多,只使用一個.py 原始碼檔案來撰寫,勢必造成程式碼管理上的混亂,你必須
學會依職責將程式碼劃分在不同的模組(Module)中撰寫,而職責相近或彼此
輔助的模組,也要知道如何使用套件(Package)來加以管理。
模組與套件也有一些要知道的細節,這一節將只介紹簡單的入門,目的是
足以應付本書一開始的幾個章節,更詳細的模組與套件說明,將會在稍後的章
節詳細介紹。
2.2.1 簡介模組
有件事實也許會令人驚訝,其實你已經撰寫過模組了,每個.py 檔案本身就
是一個模組,當你撰寫完一個.py 檔案,而別人打算直接享用你的成果的話,只
需要在他撰寫的.py 檔案中匯入(import)就可以了。舉個例子來說,若想在一
個 hello3.py 檔案中,直接重用先前撰寫好的 hello2.py 檔案,可以如下撰寫程
式:
第 2 章 從 REPL 到 IDE 2-13
圖 2.13 匯入模組
每個.py 檔案的主檔名就是模組名稱,想要匯入模組時必須使用 import 關
鍵字指定模組名稱,若有取用模組中定義的名稱,必須在名稱前加上模組名稱
與一個「.」,例如 hello2.name。接著來直接執行 hello3.py,看看會有什麼結
果:
圖 2.14 結合另一模組的執行結果
可以結果中前兩行顯示,就是 hello2.py 中撰寫的內容,被 import 模組中
的程式碼會被執行,接著才執行 hello3.py 中 import 之後的程式碼。
此時若查看.py 檔案所在的資料夾,會發現多了個__pycache__資料夾,當中
會有.pyc 檔案,這是 CPython 將.py 檔案轉譯後的位元碼檔案,之前再次匯入
同一模組,若原始碼檔案偵測到沒有變更,就不會對原始碼重頭進行語法剖析
等動作,而可以從位元碼開始直譯,以加快直譯速度。
類似地,Python 本身提供有標準程式庫,若需要這些程式庫中的某個模組
功能,可以將模組匯入,例如,若想要取得命令列引數( Command-line
argument),可以透過 sys 模組中的 argv 清單(list)。例如:
圖 2.15 取得命令列引數
由於 argv 定義在 sys 模組中,在 import sys 後,就必須使用 sys.argv 來取
用,sys.argv 清單中的資料取用時必須指定索引(Index)號碼,這個號碼實際
2-14 Python 3.5 技術手冊
上從 0 開始,然而 sys.argv[0]會儲存原始碼檔名,就上面的例子來說,就是儲
存'hello4.py',若有提供命令列引數,就依序從 sys.argv[1]開始儲存。一個執
行結果如下:
圖 2.16 取得命令列引數範例
如果有多個模組需要 import,除了逐行 import 之外,也可以在單一行中使
用逗號「,」來區隔模組。例如:
import sys, email
使用模組用來管理原始碼,有利於原始碼的重用且可避免混亂,然而有些
函式、類別等經常使用,每次都要 import 就顯得麻煩了,因此這類常用的函式、
類別等,也會被整理在一個__builtins__模組中,在__builtins__模組中的函式、
類別等名稱,都可以不用 import 直接取用,而且不用加上模組名稱作為前置,
像是之前使用過的 print()、input()函式。
想 知 道 還 有 哪 些 函 式 或 類 別 嗎 ? 可 以 在 REPL 中 使 用 dir() 函 式 查 詢
__builtins__ 模 組 , dir() 函 式 會 將 可 用 的 名 稱 列 出 , 例 如
dir(__builtins__):
圖 2.17 查詢__builtins__模組
在官方網站文件中,也有一些__builtins__模組中函式、常數的說明文件:
第 2 章 從 REPL 到 IDE 2-15
docs.python.org/3.5/library/functions.html
docs.python.org/3.5/library/constants.html
2.2.2 設定 PYTHONPATH
你已經學會使用模組了,現在有個小問題,若想取用他人撰寫好的模組,
一定要將.py 檔案放到目前的工作資料夾中嗎?舉個例子來說,目前的.py 檔案
都放在 C:workspace,如果執行 python 指令時也是在 C:workspace,基本上
不會有問題,然而若是在其他資料夾就會出錯了:
圖 2.18 找不找得到 hello 模組呢?
在 2.1.1 中談過,python -c 可以指定一段小程式來執行,因此,python -c
"import hello",就相當於在某個.py 檔案中執行了 import hello,因此這邊用
來 測試 是否可 找到指 定模 組 。 可以看 到,在 找不 到指 定模組 時, 會 發生
ImportError 錯誤。
如果想將他人提供的.py 檔案,放到其他的資料夾(例如 lib 資料夾)中加
以管理,可以設定 PYTHONPATH 環境變數來解決這個問題。python 直譯器會此環
境變數中設定的資料夾中,尋找是否有指定模組名稱對應的.py 檔案。例如:
圖 2.19 設定 PYTHONPATH
2-16 Python 3.5 技術手冊
在 Windows 中,可以使用 SET PYTHONPATH=路徑 1;路徑 2 的方式來設定
PYTHONPATH 環境變數,多個路徑時中間使用分號「;」來區隔。實際上,python
直譯器會根據 sys.path 清單中的路徑來尋找模組,以目前的設定來看,sys.path
會包含以下內容:
圖 2.20 查詢 sys.path
如果 Windows 中安裝了多個版本的 Python 環境,也可以按照類似方式設定
PATH 環境變數,例如 SET PATH=Python 環境路徑,這樣就可以切換執行的
python 直譯器版本。
因此,如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path
的內容來達到。例如在沒有對 PYTHONPATH 設定任何資訊的情況下,在進入 REPL
後,可以如下進行設定:
圖 2.21 動態設定 sys.path
在上面的圖片中可以看到,sys.path.append('c:workspace')對 sys.path 新
增了一個路徑資訊,因此之後 import hello 時,就可以在 c:workspace 找到對
應的 hello.py 了。
第 2 章 從 REPL 到 IDE 2-17
2.2.3 使用套件管理模組
現在你所撰寫的程式碼,可以分別放在各個模組之中,就原始碼管理上比
較好一些了,但還不是很好,就如同你會分不同資料夾來放置不同作用的檔案,
模組也應該分門別類加以放置。
舉例來說,一個應用程式中會有多個類別彼此合作,也有可能由多個團隊
共同分工,完成應用程式的某些功能塊,再組合在一起,如果你的應用程式是
多個團隊共同合作,若不分門別類放置模組,那麼若 A 部門寫了個 util 模組,
B 部門也寫了個 util 模組,當他們要將應用程式整合,若都將模組都放在同一
個 lib 目錄中的話,就會發生同名的 util.py 檔案覆蓋的問題。
兩個部門各自建立資料夾放置自己的 util.py 檔案,然後在 PYTHONPATH 中設
定路徑的方式行不通,因為執行 import util 時,只會使用 PYTHONPATH 第一個找
到的 util.py,你真正需要的方式,必須是能夠 import a.util 或 import b.util
來取用對應的模組。
為了便於進行套件管理的示範,我們來建立一個新的 hello_prj 資料夾,這
就像是新建立應用程式專案時,必須有個專案資料夾來管理專案的相關資源。
假設你想在 hello_prj 中新增一個 openhome 套件,那麼請在 hello_prj 中建立一
個 openhome 資料夾,而 openhome 資料夾中,建立一個__init__.py 檔案。
圖 2.22 建立 openhome 套件
注意!資料夾中一定要有一個__init__.py 檔案,該資料夾才會被視為一個
套件。在套件的進階管理中,__init__.py 中其實也可以撰寫程式,不過目前請
保持__init__.py 檔案內容為空。
接著,請將 2.1.3 撰寫的 hello2.py 檔案,複製至 openhome 套件之中,然後
將 2.2.1 撰寫的 hello3.py 檔案,複製至 hello_prj 專案資料夾,並修改 hello3.py
如下:
2-18 Python 3.5 技術手冊
圖 2.23 取用套件中的模組
主要的修改就是 import openhome.hello2 與 openhome.hello2.name,也就是
模組名稱前被加上了套件名稱,這就說明了,套件名稱會成為名稱空間的一部
份。
當 python 直譯器看到 import openhome.hello2 時,會尋找 sys.path 中的路
徑裏,是否有某個資料夾中含有 openhome 資料夾,若有找到,再進一步確認
其中是否有個__init__.py 檔案,若有的話就確認有 openhome 套件了,接著看看
其中是否有 hello2.py,如果找到,就可以順利完成模組的 import。
要執行 hello3.py,請在主控台中切換至 c:workspacehello_prj 資料夾,
一個執行範例如下所示:
圖 2.24 取用套件中模組的執行範例
由於套件名稱會成為名稱空間的一部份,就先前 A、B 兩部門的例子來說,
可以分別建立 a 套件與 b 套件,當中放置各自的 util.py,當兩個部份的 a、b 兩
個資料夾放到同一個 lib 資料夾時,並不會發生 util.py 檔案彼此覆蓋的問題,
而在取用模組時,可以分別 import a.util 與 import b.util,若想取用各自模
組中的名稱,也可以使用 a.util.some、b.util.other 來區別。
如果模組數量很多,也可以建立多層次的套件,也就是套件中還會有套件,
在這種情況下,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py
檔案。舉例來說,若想要建立 openhome.blog 套件,那麼 openhome 資料夾中
要有個__init__.py 檔案,而 openhome/blog 資料夾中,也要有個__init__.py
檔案。
第 2 章 從 REPL 到 IDE 2-19
還記得 1.2.3〈認識安裝內容〉中談過,在安裝 Python 的 lib 資料夾中,包括
了許多標準程式庫的原始碼檔案嗎?lib 資料夾包含在 sys.path 之中,這個資
料夾中也使用了一些套件來管理模組,而其中還有個 site-packages 資料夾,
用來安裝 Python 的第三方程式庫,這資料夾也包含在 sys.path 之中,通常第
三方程式庫也會使用套件來管理相關模組。
2.2.4 使用 import as 與 from import
使用套件管理,解決了實體檔案與 import 模組時名稱空間的問題,然而有
時套件名稱加上模組名稱,會使得存取某個函式、類別等時,必須撰寫又臭又
長的前置,若嫌麻煩,可以使用 import as 或者 from import 來解決這個問題。
import as 重新命名模組
如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。
例如可修改先前 hello_prj 中的 hello3.py 為以下:
hello_prj2 hello3.py
import openhome.hello2 as hello
print('今天要來點什麼不同的嗎?', hello.name, '!')
在上面的範例中,import openhome.hello2 as hello 將 openhome.hello2 模
組,重新命名為 hello,接下來就可以使用 hello 這個名稱來直接存取模組中定
義的名稱。
from import 直接匯入名稱
使用 import as 是將模組重新命名,然而,存取模組中定義的名稱時,還是
得加上名稱前置,如果仍然嫌麻煩,可以使用 from import 直接將模組中指定的
名稱匯入。例如:
hello_prj3 hello.py
from sys import argv
print('哈囉!', argv[1], '!')
2-20 Python 3.5 技術手冊
在這個範例中,直接將 sys 模組中的 argv 名稱匯入至 hello 模組中,也就
是目前的 hello.py 之中,接下來你就可以直接使用 argv 而不是 sys.argv 來存取
命令列引數。
如果有多個名稱想要直接匯入目前模組,除了逐行 from import 之外,也可
以在單一行中使用逗號「,」來區隔。例如:
from sys import argv, path
你可以更偷懶一些,用以下的 from import 語句來匯入 sys 模組中全部的名
稱:
from sys import *
不過這個方式有點危險,因為很容易造成名稱衝突問題,若兩個模組中正
好都有相同的名稱,那麼比較後面 from import 的名稱會覆蓋先前的名稱,導致
一些意外的臭蟲發生,因此,除非你是在撰寫一些簡單且內容不長的指令稿,
否則並不建議使用 from xxx import *的方式。
2.3 使用 IDE
在開始使用套件管理模組之後,你必須建立與套件對應的實體資料夾階
層,還要自行新增__init__.py 檔案,這其實有點麻煩,你可以考慮開始使用 IDE
(Integrated Development Environment),由 IDE 代勞一些套件與相關資源
管理的工作,提昇你的產能。
2.3.1 下載、安裝 PyCharm
在 Python 的領域中,有為數不少的 IDE,然而使用哪個 IDE,必須根據開
發的應用程式特性,或者基於一些團隊管理等因素來決定,有時其實也是個人
口味問題,以下是一些我看過有人推薦或使用過的 IDE:
 PyCharm(www.jetbrains.com/pycharm/)
 PyDev(www.pydev.org/)
 Komodo IDE(komodoide.com/)
第 2 章 從 REPL 到 IDE 2-21
 Spyder(code.google.com/archive/p/spyderlib/)
 WingIDE(wingware.com/)
 NINJA-IDE(www.ninja-ide.org/)
 Python Tools for Visual Studio(pytools.codeplex.com/)
有時甚至會考慮使用一些功能強大的編輯器,加上一些外掛來組裝出自己專屬
的 IDE,在 Python 這個領域,要使用 IDE 或是編譯器,也是個經常論戰的話
題,這當中也有一些值得思考的要素,有興趣可以參考〈IDE、編輯器的迷思〉
這篇文章:
openhome.cc/Gossip/Programmer/IDEorEditor.html
為了能與本書至今談過的觀念相銜接,我在這邊選擇使用 PyCharm 作個基
本介紹,它提供了社群版本,對於入門使用者練習來說,已足堪使用,你可以
直 接 連 線 www.jetbrains.com/pycharm/download/ , 按 下 頁 面 右 方 的
Community 底下的 Download 按鈕,就可進行下載。
圖 2.25 下載 PyCharm 社群版本
就撰寫這段文件的同時,可下載的 PyCharm Community 版本是 5.0.4,檔
案是 pycharm-community-5.0.4.exe,由於下載後是個.exe 檔案,你必須如
2-22 Python 3.5 技術手冊
1.2.2 介紹的方式「解除封鎖」,並以「以系統管理員身分執行」進行安裝,安
裝的預設路徑是 C:Program Files (x86)JetBrainsPyCharm Community Edition
5.0.4,基本上只需要直接一直按 Next 與 Install 就可以完成安裝了。
在安裝完成後,應用程式選單中會有個 JetBrains PyCharm Community
Edition 5.0.4 的圖示,按下就可啟動 PyCharm,初次開啟會有個畫面,詢問是
否匯入前一版本的 PyCharm 設定,預設是不匯入,由於這是初次安裝,直接按
下「OK」按鈕就可以了。
圖 2.26 初次啟動 PyCharm
在下個畫面是佈景主題設定,如果你沒有特別偏好的主題,也是直接按下
「OK」接受預設值,接下來就可以準備建立新專案了。
圖 2.27 接受預設的佈景主題
2.3.2 IDE 專案管理基礎
IDE 基本上就是建立於目前安裝的 Python 環境之上,無論使用哪個 IDE,
最重要的是知道它如何與既有的 Python 環境對應,只有在認清這樣的對應,
才不會淪為只知道 IDE 上一些傻瓜式的操作,卻不明瞭各個操作背後的原理,
這也是為何要在這邊要介紹一下 IDE 的緣故。
第 2 章 從 REPL 到 IDE 2-23
先前在介紹套件與模組時提到,我們會建立一個專案資料夾,在其中管理
套件、模組或其他相關資源,因此,使用 IDE 的第一步,就是先新增專案,因
此請先按下「Create New Project」:
圖 2.28 建立新專案
下一步是要決定專案資料夾位置與使用的 Python 直譯器,未來你的電腦中
可能不只安裝一個版本的 Python 環境,在 IDE 中通常可以管理、選擇不同的
Python 環 境 來 開 發 程 式 , 這 也 是 使 用 IDE 的 好 處 之 一 。 在 這 邊 選擇 在
c:workspacehello_prj4 中建立專案:
2-24 Python 3.5 技術手冊
圖 2.29 設定專案資料夾與直譯器版本
接著按下「Create」按鈕就可以建立專案了:
圖 2.30 專案基本架構
第 2 章 從 REPL 到 IDE 2-25
如上圖中可看到的,在「External Libraries」中,可直接瀏覽目前使用的
python 直 譯 器 ,程 式庫 的 位置 等, 基本 上這些 資 訊, 你可 以試 著執行
「 New/Python Package 」 建 立 一 個 openhome 套 件 , 在 該 套 件 上 執 行
「New/Python File」建立一個 hello.py,寫點程式並執行看看:
圖 2.31 建立套件、模組與執行
可以看到,在建立套件時,IDE 會自動建立__init__.py,想要執行模組的
話,可以按右鍵執行「Run 'hello'」,其中 hello 會依目前的模組名稱而有所不
同,執行過程式顯示在下面窗格中,當中明確地顯示了使用的指令,非常地方
便。
你也許會想要設定命令列引數,這可以執行選單「Run/Run…」來設定,
這會出現一個「Run」設定窗格,可讓你選擇要設定哪個模組,例如:
2-26 Python 3.5 技術手冊
圖 2.32 編輯 Run 的設定
在按下「Edit」之後,會出現「Edit configuration settings」,基本上可以
發現,這邊可以用來設定 python 直譯器的一些選項,像是 PYTHONPATH
之類的設定,其中命令列引數可以在「Script parameters」中設定。
第 2 章 從 REPL 到 IDE 2-27
圖 2.33 設定 python 直譯器相關選項
基於書籍篇幅有限,這邊不可能詳細地介紹 IDE 的每個功能,不過,在窕
開始使用一個 IDE 時,基本上就是像這樣,逐一找出與 Python 環境的對照,
而且要知道哪個功能在沒有使用 IDE 下,會是如何設定,透過這樣的探索,才
能一方面享有 IDE 的方便性,另一方面又不至於被 IDE 綑綁住。
2.4 重點複習
REPL 環境是個簡單、互動式的程式設計環境,在測試一些程式片段的行
為時非常方便。
在 Python 2.x 中,print 是個陳述句(Statement),然而從 Python 3.0
開始,必須使用 print()函式。
Python 3 之後,python 直譯器預期的原始碼檔案編碼必須是 UTF-8
(Python 2.x 預期的是 ASCII)。若不想將檔案的文字編碼設定為 UTF-8,另
2-28 Python 3.5 技術手冊
一個解決方式是在原始碼的第一行,使用註解設定編碼資訊,python 直譯器
只要在註解中看到 coding=<encoding name>或者 coding: <encoding
name>出現就可以了。
在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是
程式碼的一部份。
每個.py 檔案本身就是一個模組,檔案的主檔名就是模組名稱,想要匯入模
組時必須使用 import 關鍵字指定模組名稱,若有取用模組中定義的名稱,必
須在名稱前加上模組名稱與一個「.」。
若想要取得命令列引數,可以透過 sys 模組中的 argv 清單。sys.argv 清單
中的資料取用時必須指定索引號碼,這個號碼實際上從 0 開始,sys.argv[0]會
儲存原始碼檔名,若有提供命令列引數,就依序從 sys.argv[1]開始儲存。
如果有多個模組需要 import,除了逐行 import 之外,也可以在單一行中使
用逗號「,」來區隔模組。
在__builtins__模組中的函式、類別等名稱,都可以不用 import 直接取用,
而且不用加上模組名稱作為前置。
python 直譯器會 PYTHONPATH 環境變數中設定的資料夾中,尋找是否有指定
模組名稱對應的.py 檔案。python 直譯器會根據 sys.path 清單中的路徑來尋找
模組。如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path 的
內容來達到。
資料夾中一定要有一個__init__.py 檔案,該資料夾才會被視為一個套件。
套件名稱會成為名稱空間的一部份。可以建立多層次的套件,也就是套件中還
會有套件,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py 檔案。
如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。
可以使用 from import 直接將模組中指定的名稱匯入。
除非你是在撰寫一些簡單且內容不長的指令稿,否則並不建議使用 from xxx
import *的方式,以免造成名稱空間衝突的問題。

Más contenido relacionado

La actualidad más candente

Python匯出入csv以及繪製圖表初稿
Python匯出入csv以及繪製圖表初稿Python匯出入csv以及繪製圖表初稿
Python匯出入csv以及繪製圖表初稿jiannrong
 
函数调用关系工具-2011-孙光福
函数调用关系工具-2011-孙光福函数调用关系工具-2011-孙光福
函数调用关系工具-2011-孙光福Wu Liang
 
Python 入门
Python 入门Python 入门
Python 入门kuco945
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhouWill Zhou
 
Python 起步走
Python 起步走Python 起步走
Python 起步走Justin Lin
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走Justin Lin
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source ProjectsGeorge Ang
 
Python 编程艺术
Python 编程艺术Python 编程艺术
Python 编程艺术wilhelmshen
 
Python topic re
Python topic rePython topic re
Python topic recri fan
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMLi Hsuan Hung
 
教青少年寫程式
教青少年寫程式教青少年寫程式
教青少年寫程式Renyuan Lyu
 
相關軟體、套件安裝與除錯工具
相關軟體、套件安裝與除錯工具相關軟體、套件安裝與除錯工具
相關軟體、套件安裝與除錯工具數真 蔡
 
12, string
12, string12, string
12, stringted-xu
 
[系列活動] Python 程式語言起步走
[系列活動] Python 程式語言起步走[系列活動] Python 程式語言起步走
[系列活動] Python 程式語言起步走台灣資料科學年會
 

La actualidad más candente (19)

Python系列4
Python系列4Python系列4
Python系列4
 
Python匯出入csv以及繪製圖表初稿
Python匯出入csv以及繪製圖表初稿Python匯出入csv以及繪製圖表初稿
Python匯出入csv以及繪製圖表初稿
 
Python系列1
Python系列1Python系列1
Python系列1
 
函数调用关系工具-2011-孙光福
函数调用关系工具-2011-孙光福函数调用关系工具-2011-孙光福
函数调用关系工具-2011-孙光福
 
Python 入门
Python 入门Python 入门
Python 入门
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
 
Python 起步走
Python 起步走Python 起步走
Python 起步走
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
 
Python 编程艺术
Python 编程艺术Python 编程艺术
Python 编程艺术
 
Python 01 Introduction
Python 01  IntroductionPython 01  Introduction
Python 01 Introduction
 
建置Python開發環境
建置Python開發環境建置Python開發環境
建置Python開發環境
 
Python topic re
Python topic rePython topic re
Python topic re
 
Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
教青少年寫程式
教青少年寫程式教青少年寫程式
教青少年寫程式
 
相關軟體、套件安裝與除錯工具
相關軟體、套件安裝與除錯工具相關軟體、套件安裝與除錯工具
相關軟體、套件安裝與除錯工具
 
12, string
12, string12, string
12, string
 
[系列活動] Python 程式語言起步走
[系列活動] Python 程式語言起步走[系列活動] Python 程式語言起步走
[系列活動] Python 程式語言起步走
 

Destacado

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式Justin Lin
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換Justin Lin
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能Justin Lin
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentP3 InfoTech Solutions Pvt. Ltd.
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming LanguageTahani Al-Manie
 
類別的繼承
類別的繼承類別的繼承
類別的繼承Justin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialJustin Lin
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCADJustin Lin
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知Justin Lin
 
型態與運算子
型態與運算子型態與運算子
型態與運算子Justin Lin
 
常用內建模組
常用內建模組常用內建模組
常用內建模組Justin Lin
 
初學R語言的60分鐘
初學R語言的60分鐘初學R語言的60分鐘
初學R語言的60分鐘Chen-Pan Liao
 

Destacado (19)

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
 
並行與平行
並行與平行並行與平行
並行與平行
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web Development
 
Python Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File OperationsPython Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File Operations
 
Python
PythonPython
Python
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming Language
 
類別的繼承
類別的繼承類別的繼承
類別的繼承
 
資料結構
資料結構資料結構
資料結構
 
例外處理
例外處理例外處理
例外處理
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 Tutorial
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
 
常用內建模組
常用內建模組常用內建模組
常用內建模組
 
進階主題
進階主題進階主題
進階主題
 
初學R語言的60分鐘
初學R語言的60分鐘初學R語言的60分鐘
初學R語言的60分鐘
 

Similar a 《Python 3.5 技術手冊》第二章草稿

第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序ruandao
 
C語言 第一章 C語言簡介
C語言 第一章 C語言簡介C語言 第一章 C語言簡介
C語言 第一章 C語言簡介shademoon
 
06 函數與巨集
06 函數與巨集06 函數與巨集
06 函數與巨集shademoon
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二yiditushe
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojectsGeorge Ang
 
Python basic - v01
Python   basic - v01Python   basic - v01
Python basic - v01ssuser5e7722
 
Y3CDS - Python class 01
Y3CDS - Python class 01 Y3CDS - Python class 01
Y3CDS - Python class 01 Ting-You Xu
 
PHP通用程序的模板运行机制
PHP通用程序的模板运行机制PHP通用程序的模板运行机制
PHP通用程序的模板运行机制horseluke
 
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDEJustin Lin
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯liuts
 

Similar a 《Python 3.5 技術手冊》第二章草稿 (20)

第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
 
C+
C+C+
C+
 
C#
C#C#
C#
 
C語言 第一章 C語言簡介
C語言 第一章 C語言簡介C語言 第一章 C語言簡介
C語言 第一章 C語言簡介
 
06 函數與巨集
06 函數與巨集06 函數與巨集
06 函數與巨集
 
建置Python開發環境
建置Python開發環境建置Python開發環境
建置Python開發環境
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
 
beidakejian
beidakejianbeidakejian
beidakejian
 
Python basic - v01
Python   basic - v01Python   basic - v01
Python basic - v01
 
C 1 c
C 1 cC 1 c
C 1 c
 
C 1 c
C 1 cC 1 c
C 1 c
 
C 1 c
C 1 cC 1 c
C 1 c
 
C 1 c
C 1 cC 1 c
C 1 c
 
Y3CDS - Python class 01
Y3CDS - Python class 01 Y3CDS - Python class 01
Y3CDS - Python class 01
 
Python01
Python01Python01
Python01
 
PHP通用程序的模板运行机制
PHP通用程序的模板运行机制PHP通用程序的模板运行机制
PHP通用程序的模板运行机制
 
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
 
SCJP ch16
SCJP ch16SCJP ch16
SCJP ch16
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
 

Más de Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 

Más de Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 

《Python 3.5 技術手冊》第二章草稿

  • 1. 2從 REPL 到 IDE  使用 REPL  設定原始碼檔案編碼  基本模組與套件管理  認識 IDE 的使用
  • 2. 2-2 Python 3.5 技術手冊 2.1 從 'Hello World' 開始 第 一 個 "Hello World" 的 出 現 是 在 Brian Kernighan 寫 的 《 A Tutorial Introduction to the Language B》書籍中(B 語言是 C 語言的前身),用來將 'Hello World'文字顯示在電腦螢幕上,自此之後,很多的程式語言教學文件或 書籍上,已經無數次地將它當作第一個範例程式。為什麼要用'Hello World'來 當作第一個程式範例?因為它很簡單,初學者只要鍵入簡單幾行程式(甚至一 行),可以要求電腦執行指令並得到回饋:顯示'Hello World'。 本書也要從顯示'Hello World'開始,然而,在完成這簡單的程式之後,千萬 要記得,探索這簡單程式之後的種種細節,千萬別過於樂觀地以為,你想從事 的程式設計工作就是如此容易駕馭。 2.1.1 使用 REPL 第一個顯示'Hello World'的程式碼,我們預計在 REPL(Read-Eval-Print Loop)環境中進行(又稱為 Python Shell),這是一個簡單、互動式的程式設 計環境,不過,雖然它很簡單,然而在日後開發 Python 應用程式的日子裏, 你會經常地使用它,因為 REPL 在測試一些程式片段的行為時非常方便。 現在開啟「命令提示字元」,直接輸入 python 指令(不用加上任何引數), 這樣就會進入 REPL 環境。 圖 2.1 Python 的 REPL 環境 來很快地撰寫一些小指令進行測試,首先做些簡單的加法運算吧!從輸入 1 + 2 之後按下 Enter 開始: >>> 1 + 2 3 >>> _ 3 >>> 1 + _ 4
  • 3. 第 2 章 從 REPL 到 IDE 2-3 >>> _ 4 >>> 一開始執行了 1 + 2,顯示結果為 3,_代表了互動環境中上一次運算結果, 方便你在下一次的運算中直接取用上一次的運算結果。 在 REPL 環境中,可以按 Home 鍵將游標移至行首,按 End 鍵可以將游標移 至行尾。 一開始不是說要顯示'Hello World'嗎?接著就來命令 REPL 環境執行 print()函式,顯示指定的文字'Hello World'吧! >>> 'Hello World' 'Hello World' >>> print(_) Hello World >>> print('Hello World') Hello World >>> 在 Python 中,使用單引號''包含住的文字,會是程式中的一個字串值,有 關字串的特性,先知道這個就可以了,後續章節還會詳加探討。在 REPL 輸入 一個字串值後,會被當成是上一次的執行結果,因此 print(_)時,_就代表著 'Hello World',因此跟 print('Hello World')的執行結果是相同的。 如果在 REPL 中犯錯了,REPL 會有些提示訊息,怎看這些訊息有點神秘: >>> print 'Hello World' File "<stdin>", line 1 print 'Hello World' ^ SyntaxError: Missing parentheses in call to 'print' >>> 在 Python 2.x 中,print 是個陳述句(Statement),然而從 Python 3.0 開始,必須使用 print()函式了,因此 print 'Hello World'會發生語法錯誤,其 實上面的訊息中 SyntaxError 也告知發生了語法錯誤,初學時面對這類錯誤訊 息,只要找出這個 Error 結尾的文字作為開始,慢慢也能看得懂發生了什麼錯 誤。 若要取得協助訊息,可以輸入 help(),例如: >>> help()
  • 4. 2-4 Python 3.5 技術手冊 Welcome to Python 3.5's help utility! If this is your first time using Python, you should definitely check out the tutorial on the Internet at http://docs.python.org/3.5/tutorial/. Enter the name of any module, keyword, or topic to get help on writing Python programs and using Python modules. To quit this help utility and return to the interpreter, just type "quit". To get a list of available modules, keywords, symbols, or topics, type "modules", "keywords", "symbols", or "topics". Each module also comes with a one-line summary of what it does; to list the modules whose name or summary contain a given string such as "spam", type "modules spam". help> 這會進入 help()說明頁面,注意提示符號變成了 help>,在上頭這段文字 中有說明頁面的使用方式,像是想結束說明頁面,可以輸入 quit,想哪道有哪 些模組、關鍵字等,可以輸入 modules、keywords 等,例如來看看 Python 中有 哪些關鍵字: help> keywords Here is a list of the Python keywords. Enter any keyword to get more help. False def if raise None del import return True elif in try and else is while as except lambda with assert finally nonlocal yield break for not class from or continue global pass help> 剛才有使用過 print()函式,你會好奇它怎麼使用嗎?在說明頁面中輸入 print 就可以查詢了: help> print Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments:
  • 5. 第 2 章 從 REPL 到 IDE 2-5 file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream. help> 現在輸入 quit,回到 REPL 中,實際上,在 REPL 中也可以直接輸入 help(print)來查詢函式等說明: help> quit You are now leaving help and returning to the Python interpreter. If you want to ask for help on a particular object directly from the interpreter, you can type "help(object)". Executing "help('string')" has the same effect as typing a particular string at the help> prompt. >>> help(print) Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False) ...略 >>> 如果要離開 REPL 環境,可以執行 quit()函式。實際上,如果只是要執行 個小程式片段,又不想麻煩地進入 REPL,可以在使用 python 指令時加上-c 引 數,之後接上使用""包含的程式片段。例如: >>> quit() C:UsersJustin>python -c "print('Hello World')" Hello World C:UsersJustin>python -c "help(print)" Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False) ...略 C:UsersJustin> 在 Python 官方網站 www.python.org 首頁,也提供了一個互動環境,臨時要 試個程式小片段,又不想要安裝 Python 或找個裝有 Python 的電腦時,開個瀏 覽器就可以使用囉!
  • 6. 2-6 Python 3.5 技術手冊 圖 2.2 Python 的 REPL 環境 2.1.2 撰寫 Python 原始碼 我們總是要開啟一個原始碼檔案,正式一點地撰寫程式吧?在正式撰寫程 式之前,請先確定你可以看到檔案的副檔名,在 Windows 下預設不顯示副檔 名,這會造成重新命名檔案時的困擾,如果目前在「檔案總管」下無法看到副 檔名,Windows 7 下請執行「組合管理/資料夾和搜尋選項」,Windows 8 或 10 都可以執行「檢視/選項」,之後都是切換至「檢視」頁籤,取消「隱藏已 知檔案類型的副檔名」之選取。
  • 7. 第 2 章 從 REPL 到 IDE 2-7 圖 2.3 取消「隱藏已知檔案類型的副檔名」 接著選擇一個資料夾來撰寫 Python 原始碼檔案,本書都是在 C:workspace 資料夾中撰寫程式,請新增「文字文件」(也就是.txt 文件),並重新命名文 件為「hello.py」,由於將文字文件的副檔名從.txt 改為.py,系統會詢問是否更 改副檔名,請確定更改,如果是在 Windows 中第一次安裝 Python,而且依照 本章之前的方式安裝,那麼會看到檔案圖示變換為以下樣式,這個圖示上的吉 祥物是兩隻小蟒蛇(因為 Python 也有蟒蛇之意): 圖 2.4 變更副檔名為.py 後的圖示
  • 8. 2-8 Python 3.5 技術手冊 雖然 Python 有蟒蛇之意,不過 Guido van Rossum 曾經表示,Python 這個名 稱其實是取自他熱愛的 BBC 著名喜劇影集《Monty Python's Flying Circus》, Python 官 方 網 站 的 FAQ 也 記 錄 著 這 件 事 : docs.python.org/3/faq/general.html#why-is-it-called-python 而這個 FAQ 的下一則還很幽默地列出了「Do I have to like “Monty Python’s Flying Circus”?」這個問題,答案是「No, but it helps. :)」。 如圖 2.4 中可以看到的,如果在.py 檔案上按滑鼠右鍵,可以執行「Edit with IDLE」來開啟檔案進行編輯,IDLE 是 Python 官方內建的編輯器(本身也使用 Python 撰寫),這會比使用 Windows 內建的記事本撰寫 Python 程式來得好 一些,你可以如下撰寫程式碼: 圖 2.5 第一個 Python 程式 很簡單的一個小程式,只是使用 Python 的 print()函式指定文字,執行時 print()函式預設會在主控台(Console)顯示指定的文字。 接著執行選單「File/Save」儲存檔案。雖然你可以直接在 IDLE 中執行 「Run/Run Module」,啟動 Python 的 REPL 來執行程式,不過,在這邊要直 接使用命令提示字元,請開啟命令提示字元,切換工作資料夾至 C:workspace (執行指令 cd c:workspace),然後如下使用 python 指令執行程式: 圖 2.6 執行第一個 Python 程式 2.1.3 哈囉!世界! 就程式語言來說,Python 確實是個入門簡易的語言,不過,無論任何一個 領域都請記得「事物的複雜度不會憑空消失,只會從一個事物轉移到另一個事
  • 9. 第 2 章 從 REPL 到 IDE 2-9 物」,在程式設計這領域也是如此,如果純綷只是想行銷 Python 這門語言給 你,介紹完方才的 Hello World 程式後,我就可以開始歌頌 Python 的美好。 實際上 Python 也有其深入的一面,也有其會面臨的難題,若你將來打算發 揮 Python 更強大的功能,或者需要解決更複雜的問題,就會需要進一步深度 探索 Python,在本書之後的章節,也會談到 Python 一些比較深入的議題。 至於現在,作為中文世界的開發者,想稍微觸碰一下複雜度,除了顯示 Hello World 之外,不如再來試試顯示「哈囉!世界!」如何?請建立一個 hello2.py 檔案,這次不要使用 IDLE,直接使用 Windows 的「記事本」撰寫程式: 圖 2.7 第二個 Python 程式 接著在主控台中執行 python hello2.py,不幸地,這次出現了錯誤: 圖 2.8 喔哦!執行出錯了! UTF-8 錯誤的訊息中顯示 SyntaxError,也就是語法錯誤,原因在於 Python 3 之 後,python 直譯器預期的原始碼檔案編碼必須是 UTF-8(Python 2.x 預期的是 ASCII),然而,Windows 的記事本預設編碼是 MS950(相容於 Big5),兩 者對於中文字元的位元組排列方式並不相同,python 直譯器看到無法解釋的位 元組,就發生了 SyntaxError。 UTF-8 是目前很流行的文字編碼方式,現在不少文字編輯器預設也會使用 UTF-8,像是方才使用的 IDLE,相同的程式碼使用 IDLE 撰寫儲存,執行時並
  • 10. 2-10 Python 3.5 技術手冊 不會發生錯誤,然而問題在於,許多人不使用 IDLE,你將來也可能會換用其他 編輯器,因此,在這邊必須告訴你這個事實。 如果你連 UTF-8 是什麼都不知道,那建議先看看〈哪來的純文字檔?〉、 〈Unicode 與 UTF〉、〈UTF-8〉這三篇文件: openhome.cc/Gossip/Encoding/TextFile.html openhome.cc/Gossip/Encoding/UnicodeUTF.html openhome.cc/Gossip/Encoding/UTF8.html Windows 的記事本可以在「另存新檔」時選擇文字編碼為 UTF-8,這是解 決問題的一個方式: 圖 2.9 記事本可在「另存新檔」時選擇文字編碼為 UTF-8 Windows 中 內 建 的 記 事 本 並 不 是 很 好 用 , 我 個 人 習 慣 用 NotePad++ (notepad-plus-plus.org),編輯檔案時,就可以直接在選單「編碼」中選擇 文字編碼: 圖 2.10 設定 NotePad++的文字編碼
  • 11. 第 2 章 從 REPL 到 IDE 2-11 設定原始碼編碼 若不想將檔案的文字編碼設定為 UTF-8,另一個解決方式是在原始碼的第 一行,使用註解設定編碼資訊。最簡單的設定方式是: 圖 2.11 設定 Python 原始碼檔案編碼 在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是 程式碼的一部份,如上加上#coding=MS950 之後,就可以正確地執行了: 圖 2.12 哈囉!世界! 在 hello2.py 的程式碼中,input()是個函式(Python 2.x 中使用的是 raw_input()),可用來取得使用者輸入的文字,呼叫函式時指定的文字會作為 主控台中的提示訊息,在使用者輸入文字並按下 Enter 後,input()函式會以字 串傳回使用者輸入的文字,在這邊你將之指定給 name 變數,之後使用 print() 函式依序顯示了'哈囉'、name 與'!'。 至於為什麼說是最簡單的設定方式呢?將來你也許還會看到其他的編碼設 定方式,例如: # -*- coding: Big5 -*- 或者是: # vim: set fileencoding=Big5 : 也許你還會看到更多其他的方式,這是因為實際上,python 直譯器只要在 註解中看到 coding=<encoding name>或者 coding: <encoding name>出現就可以
  • 12. 2-12 Python 3.5 技術手冊 了,因此,就算你在第一行撰寫#orz coding=MS950、#XDcoding: MS950,也都可 正確找出文字編碼設定。 這是為了因應各種編輯器的特性,有興趣的話,可以參考 PEP 0263: www.python.org/dev/peps/pep-0263/ 當中有說明,python 直譯器會使用底下這段規則表示式(Regular expression) 來擷取文字編碼設定: ^[ tv]*#.*?coding[:=][ t]*([-_.a-zA-Z0-9]+) 本書之後會介紹什麼是規則表示式,以及在 Python 中如何使用。 2.2 初識模組與套件 對於初學者來說,通常只需要一個.py 原始碼檔案,就可以應付各種範例程 式的程式碼數量,然而實際的應用程式需要的程式碼數量遠比範例程式要來得 多,只使用一個.py 原始碼檔案來撰寫,勢必造成程式碼管理上的混亂,你必須 學會依職責將程式碼劃分在不同的模組(Module)中撰寫,而職責相近或彼此 輔助的模組,也要知道如何使用套件(Package)來加以管理。 模組與套件也有一些要知道的細節,這一節將只介紹簡單的入門,目的是 足以應付本書一開始的幾個章節,更詳細的模組與套件說明,將會在稍後的章 節詳細介紹。 2.2.1 簡介模組 有件事實也許會令人驚訝,其實你已經撰寫過模組了,每個.py 檔案本身就 是一個模組,當你撰寫完一個.py 檔案,而別人打算直接享用你的成果的話,只 需要在他撰寫的.py 檔案中匯入(import)就可以了。舉個例子來說,若想在一 個 hello3.py 檔案中,直接重用先前撰寫好的 hello2.py 檔案,可以如下撰寫程 式:
  • 13. 第 2 章 從 REPL 到 IDE 2-13 圖 2.13 匯入模組 每個.py 檔案的主檔名就是模組名稱,想要匯入模組時必須使用 import 關 鍵字指定模組名稱,若有取用模組中定義的名稱,必須在名稱前加上模組名稱 與一個「.」,例如 hello2.name。接著來直接執行 hello3.py,看看會有什麼結 果: 圖 2.14 結合另一模組的執行結果 可以結果中前兩行顯示,就是 hello2.py 中撰寫的內容,被 import 模組中 的程式碼會被執行,接著才執行 hello3.py 中 import 之後的程式碼。 此時若查看.py 檔案所在的資料夾,會發現多了個__pycache__資料夾,當中 會有.pyc 檔案,這是 CPython 將.py 檔案轉譯後的位元碼檔案,之前再次匯入 同一模組,若原始碼檔案偵測到沒有變更,就不會對原始碼重頭進行語法剖析 等動作,而可以從位元碼開始直譯,以加快直譯速度。 類似地,Python 本身提供有標準程式庫,若需要這些程式庫中的某個模組 功能,可以將模組匯入,例如,若想要取得命令列引數( Command-line argument),可以透過 sys 模組中的 argv 清單(list)。例如: 圖 2.15 取得命令列引數 由於 argv 定義在 sys 模組中,在 import sys 後,就必須使用 sys.argv 來取 用,sys.argv 清單中的資料取用時必須指定索引(Index)號碼,這個號碼實際
  • 14. 2-14 Python 3.5 技術手冊 上從 0 開始,然而 sys.argv[0]會儲存原始碼檔名,就上面的例子來說,就是儲 存'hello4.py',若有提供命令列引數,就依序從 sys.argv[1]開始儲存。一個執 行結果如下: 圖 2.16 取得命令列引數範例 如果有多個模組需要 import,除了逐行 import 之外,也可以在單一行中使 用逗號「,」來區隔模組。例如: import sys, email 使用模組用來管理原始碼,有利於原始碼的重用且可避免混亂,然而有些 函式、類別等經常使用,每次都要 import 就顯得麻煩了,因此這類常用的函式、 類別等,也會被整理在一個__builtins__模組中,在__builtins__模組中的函式、 類別等名稱,都可以不用 import 直接取用,而且不用加上模組名稱作為前置, 像是之前使用過的 print()、input()函式。 想 知 道 還 有 哪 些 函 式 或 類 別 嗎 ? 可 以 在 REPL 中 使 用 dir() 函 式 查 詢 __builtins__ 模 組 , dir() 函 式 會 將 可 用 的 名 稱 列 出 , 例 如 dir(__builtins__): 圖 2.17 查詢__builtins__模組 在官方網站文件中,也有一些__builtins__模組中函式、常數的說明文件:
  • 15. 第 2 章 從 REPL 到 IDE 2-15 docs.python.org/3.5/library/functions.html docs.python.org/3.5/library/constants.html 2.2.2 設定 PYTHONPATH 你已經學會使用模組了,現在有個小問題,若想取用他人撰寫好的模組, 一定要將.py 檔案放到目前的工作資料夾中嗎?舉個例子來說,目前的.py 檔案 都放在 C:workspace,如果執行 python 指令時也是在 C:workspace,基本上 不會有問題,然而若是在其他資料夾就會出錯了: 圖 2.18 找不找得到 hello 模組呢? 在 2.1.1 中談過,python -c 可以指定一段小程式來執行,因此,python -c "import hello",就相當於在某個.py 檔案中執行了 import hello,因此這邊用 來 測試 是否可 找到指 定模 組 。 可以看 到,在 找不 到指 定模組 時, 會 發生 ImportError 錯誤。 如果想將他人提供的.py 檔案,放到其他的資料夾(例如 lib 資料夾)中加 以管理,可以設定 PYTHONPATH 環境變數來解決這個問題。python 直譯器會此環 境變數中設定的資料夾中,尋找是否有指定模組名稱對應的.py 檔案。例如: 圖 2.19 設定 PYTHONPATH
  • 16. 2-16 Python 3.5 技術手冊 在 Windows 中,可以使用 SET PYTHONPATH=路徑 1;路徑 2 的方式來設定 PYTHONPATH 環境變數,多個路徑時中間使用分號「;」來區隔。實際上,python 直譯器會根據 sys.path 清單中的路徑來尋找模組,以目前的設定來看,sys.path 會包含以下內容: 圖 2.20 查詢 sys.path 如果 Windows 中安裝了多個版本的 Python 環境,也可以按照類似方式設定 PATH 環境變數,例如 SET PATH=Python 環境路徑,這樣就可以切換執行的 python 直譯器版本。 因此,如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path 的內容來達到。例如在沒有對 PYTHONPATH 設定任何資訊的情況下,在進入 REPL 後,可以如下進行設定: 圖 2.21 動態設定 sys.path 在上面的圖片中可以看到,sys.path.append('c:workspace')對 sys.path 新 增了一個路徑資訊,因此之後 import hello 時,就可以在 c:workspace 找到對 應的 hello.py 了。
  • 17. 第 2 章 從 REPL 到 IDE 2-17 2.2.3 使用套件管理模組 現在你所撰寫的程式碼,可以分別放在各個模組之中,就原始碼管理上比 較好一些了,但還不是很好,就如同你會分不同資料夾來放置不同作用的檔案, 模組也應該分門別類加以放置。 舉例來說,一個應用程式中會有多個類別彼此合作,也有可能由多個團隊 共同分工,完成應用程式的某些功能塊,再組合在一起,如果你的應用程式是 多個團隊共同合作,若不分門別類放置模組,那麼若 A 部門寫了個 util 模組, B 部門也寫了個 util 模組,當他們要將應用程式整合,若都將模組都放在同一 個 lib 目錄中的話,就會發生同名的 util.py 檔案覆蓋的問題。 兩個部門各自建立資料夾放置自己的 util.py 檔案,然後在 PYTHONPATH 中設 定路徑的方式行不通,因為執行 import util 時,只會使用 PYTHONPATH 第一個找 到的 util.py,你真正需要的方式,必須是能夠 import a.util 或 import b.util 來取用對應的模組。 為了便於進行套件管理的示範,我們來建立一個新的 hello_prj 資料夾,這 就像是新建立應用程式專案時,必須有個專案資料夾來管理專案的相關資源。 假設你想在 hello_prj 中新增一個 openhome 套件,那麼請在 hello_prj 中建立一 個 openhome 資料夾,而 openhome 資料夾中,建立一個__init__.py 檔案。 圖 2.22 建立 openhome 套件 注意!資料夾中一定要有一個__init__.py 檔案,該資料夾才會被視為一個 套件。在套件的進階管理中,__init__.py 中其實也可以撰寫程式,不過目前請 保持__init__.py 檔案內容為空。 接著,請將 2.1.3 撰寫的 hello2.py 檔案,複製至 openhome 套件之中,然後 將 2.2.1 撰寫的 hello3.py 檔案,複製至 hello_prj 專案資料夾,並修改 hello3.py 如下:
  • 18. 2-18 Python 3.5 技術手冊 圖 2.23 取用套件中的模組 主要的修改就是 import openhome.hello2 與 openhome.hello2.name,也就是 模組名稱前被加上了套件名稱,這就說明了,套件名稱會成為名稱空間的一部 份。 當 python 直譯器看到 import openhome.hello2 時,會尋找 sys.path 中的路 徑裏,是否有某個資料夾中含有 openhome 資料夾,若有找到,再進一步確認 其中是否有個__init__.py 檔案,若有的話就確認有 openhome 套件了,接著看看 其中是否有 hello2.py,如果找到,就可以順利完成模組的 import。 要執行 hello3.py,請在主控台中切換至 c:workspacehello_prj 資料夾, 一個執行範例如下所示: 圖 2.24 取用套件中模組的執行範例 由於套件名稱會成為名稱空間的一部份,就先前 A、B 兩部門的例子來說, 可以分別建立 a 套件與 b 套件,當中放置各自的 util.py,當兩個部份的 a、b 兩 個資料夾放到同一個 lib 資料夾時,並不會發生 util.py 檔案彼此覆蓋的問題, 而在取用模組時,可以分別 import a.util 與 import b.util,若想取用各自模 組中的名稱,也可以使用 a.util.some、b.util.other 來區別。 如果模組數量很多,也可以建立多層次的套件,也就是套件中還會有套件, 在這種情況下,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py 檔案。舉例來說,若想要建立 openhome.blog 套件,那麼 openhome 資料夾中 要有個__init__.py 檔案,而 openhome/blog 資料夾中,也要有個__init__.py 檔案。
  • 19. 第 2 章 從 REPL 到 IDE 2-19 還記得 1.2.3〈認識安裝內容〉中談過,在安裝 Python 的 lib 資料夾中,包括 了許多標準程式庫的原始碼檔案嗎?lib 資料夾包含在 sys.path 之中,這個資 料夾中也使用了一些套件來管理模組,而其中還有個 site-packages 資料夾, 用來安裝 Python 的第三方程式庫,這資料夾也包含在 sys.path 之中,通常第 三方程式庫也會使用套件來管理相關模組。 2.2.4 使用 import as 與 from import 使用套件管理,解決了實體檔案與 import 模組時名稱空間的問題,然而有 時套件名稱加上模組名稱,會使得存取某個函式、類別等時,必須撰寫又臭又 長的前置,若嫌麻煩,可以使用 import as 或者 from import 來解決這個問題。 import as 重新命名模組 如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。 例如可修改先前 hello_prj 中的 hello3.py 為以下: hello_prj2 hello3.py import openhome.hello2 as hello print('今天要來點什麼不同的嗎?', hello.name, '!') 在上面的範例中,import openhome.hello2 as hello 將 openhome.hello2 模 組,重新命名為 hello,接下來就可以使用 hello 這個名稱來直接存取模組中定 義的名稱。 from import 直接匯入名稱 使用 import as 是將模組重新命名,然而,存取模組中定義的名稱時,還是 得加上名稱前置,如果仍然嫌麻煩,可以使用 from import 直接將模組中指定的 名稱匯入。例如: hello_prj3 hello.py from sys import argv print('哈囉!', argv[1], '!')
  • 20. 2-20 Python 3.5 技術手冊 在這個範例中,直接將 sys 模組中的 argv 名稱匯入至 hello 模組中,也就 是目前的 hello.py 之中,接下來你就可以直接使用 argv 而不是 sys.argv 來存取 命令列引數。 如果有多個名稱想要直接匯入目前模組,除了逐行 from import 之外,也可 以在單一行中使用逗號「,」來區隔。例如: from sys import argv, path 你可以更偷懶一些,用以下的 from import 語句來匯入 sys 模組中全部的名 稱: from sys import * 不過這個方式有點危險,因為很容易造成名稱衝突問題,若兩個模組中正 好都有相同的名稱,那麼比較後面 from import 的名稱會覆蓋先前的名稱,導致 一些意外的臭蟲發生,因此,除非你是在撰寫一些簡單且內容不長的指令稿, 否則並不建議使用 from xxx import *的方式。 2.3 使用 IDE 在開始使用套件管理模組之後,你必須建立與套件對應的實體資料夾階 層,還要自行新增__init__.py 檔案,這其實有點麻煩,你可以考慮開始使用 IDE (Integrated Development Environment),由 IDE 代勞一些套件與相關資源 管理的工作,提昇你的產能。 2.3.1 下載、安裝 PyCharm 在 Python 的領域中,有為數不少的 IDE,然而使用哪個 IDE,必須根據開 發的應用程式特性,或者基於一些團隊管理等因素來決定,有時其實也是個人 口味問題,以下是一些我看過有人推薦或使用過的 IDE:  PyCharm(www.jetbrains.com/pycharm/)  PyDev(www.pydev.org/)  Komodo IDE(komodoide.com/)
  • 21. 第 2 章 從 REPL 到 IDE 2-21  Spyder(code.google.com/archive/p/spyderlib/)  WingIDE(wingware.com/)  NINJA-IDE(www.ninja-ide.org/)  Python Tools for Visual Studio(pytools.codeplex.com/) 有時甚至會考慮使用一些功能強大的編輯器,加上一些外掛來組裝出自己專屬 的 IDE,在 Python 這個領域,要使用 IDE 或是編譯器,也是個經常論戰的話 題,這當中也有一些值得思考的要素,有興趣可以參考〈IDE、編輯器的迷思〉 這篇文章: openhome.cc/Gossip/Programmer/IDEorEditor.html 為了能與本書至今談過的觀念相銜接,我在這邊選擇使用 PyCharm 作個基 本介紹,它提供了社群版本,對於入門使用者練習來說,已足堪使用,你可以 直 接 連 線 www.jetbrains.com/pycharm/download/ , 按 下 頁 面 右 方 的 Community 底下的 Download 按鈕,就可進行下載。 圖 2.25 下載 PyCharm 社群版本 就撰寫這段文件的同時,可下載的 PyCharm Community 版本是 5.0.4,檔 案是 pycharm-community-5.0.4.exe,由於下載後是個.exe 檔案,你必須如
  • 22. 2-22 Python 3.5 技術手冊 1.2.2 介紹的方式「解除封鎖」,並以「以系統管理員身分執行」進行安裝,安 裝的預設路徑是 C:Program Files (x86)JetBrainsPyCharm Community Edition 5.0.4,基本上只需要直接一直按 Next 與 Install 就可以完成安裝了。 在安裝完成後,應用程式選單中會有個 JetBrains PyCharm Community Edition 5.0.4 的圖示,按下就可啟動 PyCharm,初次開啟會有個畫面,詢問是 否匯入前一版本的 PyCharm 設定,預設是不匯入,由於這是初次安裝,直接按 下「OK」按鈕就可以了。 圖 2.26 初次啟動 PyCharm 在下個畫面是佈景主題設定,如果你沒有特別偏好的主題,也是直接按下 「OK」接受預設值,接下來就可以準備建立新專案了。 圖 2.27 接受預設的佈景主題 2.3.2 IDE 專案管理基礎 IDE 基本上就是建立於目前安裝的 Python 環境之上,無論使用哪個 IDE, 最重要的是知道它如何與既有的 Python 環境對應,只有在認清這樣的對應, 才不會淪為只知道 IDE 上一些傻瓜式的操作,卻不明瞭各個操作背後的原理, 這也是為何要在這邊要介紹一下 IDE 的緣故。
  • 23. 第 2 章 從 REPL 到 IDE 2-23 先前在介紹套件與模組時提到,我們會建立一個專案資料夾,在其中管理 套件、模組或其他相關資源,因此,使用 IDE 的第一步,就是先新增專案,因 此請先按下「Create New Project」: 圖 2.28 建立新專案 下一步是要決定專案資料夾位置與使用的 Python 直譯器,未來你的電腦中 可能不只安裝一個版本的 Python 環境,在 IDE 中通常可以管理、選擇不同的 Python 環 境 來 開 發 程 式 , 這 也 是 使 用 IDE 的 好 處 之 一 。 在 這 邊 選擇 在 c:workspacehello_prj4 中建立專案:
  • 24. 2-24 Python 3.5 技術手冊 圖 2.29 設定專案資料夾與直譯器版本 接著按下「Create」按鈕就可以建立專案了: 圖 2.30 專案基本架構
  • 25. 第 2 章 從 REPL 到 IDE 2-25 如上圖中可看到的,在「External Libraries」中,可直接瀏覽目前使用的 python 直 譯 器 ,程 式庫 的 位置 等, 基本 上這些 資 訊, 你可 以試 著執行 「 New/Python Package 」 建 立 一 個 openhome 套 件 , 在 該 套 件 上 執 行 「New/Python File」建立一個 hello.py,寫點程式並執行看看: 圖 2.31 建立套件、模組與執行 可以看到,在建立套件時,IDE 會自動建立__init__.py,想要執行模組的 話,可以按右鍵執行「Run 'hello'」,其中 hello 會依目前的模組名稱而有所不 同,執行過程式顯示在下面窗格中,當中明確地顯示了使用的指令,非常地方 便。 你也許會想要設定命令列引數,這可以執行選單「Run/Run…」來設定, 這會出現一個「Run」設定窗格,可讓你選擇要設定哪個模組,例如:
  • 26. 2-26 Python 3.5 技術手冊 圖 2.32 編輯 Run 的設定 在按下「Edit」之後,會出現「Edit configuration settings」,基本上可以 發現,這邊可以用來設定 python 直譯器的一些選項,像是 PYTHONPATH 之類的設定,其中命令列引數可以在「Script parameters」中設定。
  • 27. 第 2 章 從 REPL 到 IDE 2-27 圖 2.33 設定 python 直譯器相關選項 基於書籍篇幅有限,這邊不可能詳細地介紹 IDE 的每個功能,不過,在窕 開始使用一個 IDE 時,基本上就是像這樣,逐一找出與 Python 環境的對照, 而且要知道哪個功能在沒有使用 IDE 下,會是如何設定,透過這樣的探索,才 能一方面享有 IDE 的方便性,另一方面又不至於被 IDE 綑綁住。 2.4 重點複習 REPL 環境是個簡單、互動式的程式設計環境,在測試一些程式片段的行 為時非常方便。 在 Python 2.x 中,print 是個陳述句(Statement),然而從 Python 3.0 開始,必須使用 print()函式。 Python 3 之後,python 直譯器預期的原始碼檔案編碼必須是 UTF-8 (Python 2.x 預期的是 ASCII)。若不想將檔案的文字編碼設定為 UTF-8,另
  • 28. 2-28 Python 3.5 技術手冊 一個解決方式是在原始碼的第一行,使用註解設定編碼資訊,python 直譯器 只要在註解中看到 coding=<encoding name>或者 coding: <encoding name>出現就可以了。 在 Python 原始碼檔案中,#開頭代表這是一行註解,#之後不會被當成是 程式碼的一部份。 每個.py 檔案本身就是一個模組,檔案的主檔名就是模組名稱,想要匯入模 組時必須使用 import 關鍵字指定模組名稱,若有取用模組中定義的名稱,必 須在名稱前加上模組名稱與一個「.」。 若想要取得命令列引數,可以透過 sys 模組中的 argv 清單。sys.argv 清單 中的資料取用時必須指定索引號碼,這個號碼實際上從 0 開始,sys.argv[0]會 儲存原始碼檔名,若有提供命令列引數,就依序從 sys.argv[1]開始儲存。 如果有多個模組需要 import,除了逐行 import 之外,也可以在單一行中使 用逗號「,」來區隔模組。 在__builtins__模組中的函式、類別等名稱,都可以不用 import 直接取用, 而且不用加上模組名稱作為前置。 python 直譯器會 PYTHONPATH 環境變數中設定的資料夾中,尋找是否有指定 模組名稱對應的.py 檔案。python 直譯器會根據 sys.path 清單中的路徑來尋找 模組。如果想要動態地管理模組的尋找路徑,也可以透過程式變更 sys.path 的 內容來達到。 資料夾中一定要有一個__init__.py 檔案,該資料夾才會被視為一個套件。 套件名稱會成為名稱空間的一部份。可以建立多層次的套件,也就是套件中還 會有套件,每個擔任套件的資料夾與子資料夾中,各要有一個__init__.py 檔案。 如果想要改變被匯入模組在當前模組中的變數名稱,可以使用 import as。 可以使用 from import 直接將模組中指定的名稱匯入。 除非你是在撰寫一些簡單且內容不長的指令稿,否則並不建議使用 from xxx import *的方式,以免造成名稱空間衝突的問題。