2017年10月3日 星期二

[Python 學習筆記] 起步走 : 基本環境與互動 (簡介模組)

轉載自 這裡 
前言 : 
你可以撰寫一個純文字檔案,建議副檔名為.py,在當中撰寫 Python 程式碼 : 
* hello.py : 
  1. print('Hello!Python!')  
接著如下執行指令載入指令稿直譯並執行 : 
C:\Software\Python2.7.2\tutorial>python hello.py
Hello!Python!

如果你想取得命令列引數(Command line argument),則可以使用 sys.argv,例如 : 
* hello2.py : 
  1. import sys  
  2. print('Hello!' + sys.argv[1] + '!')  
要取得命令列引數,必須先以 import 語句匯入sys模組Module),命令列引數字串陣列方式收集並指定給sys.argv索引0表示為 第一個命令列引數,在Python中就是存放所執行的.py檔名,索引1則表示第二個命令列引數,依此類推. 接著如下執行指令載入指令稿直譯並執行 : 
C:\Software\Python2.7.2\tutorial>python hello2.py John
Hello!John!

模組簡介 : 
所謂模組,實際上就是個.py檔案。import語句匯入模組實際上就是載入另一個.py檔案並執行其內容。例如可先撰寫一個.py檔案 : 
* some.py : 
  1. name = 'John'  
  2. print(name)  

接著在另一個.py檔案中或指令互動模式中使用 import 語句並執行相關程式碼 : 
 

在 import some 時,實際上會載入some.py,之後將其編譯為位元碼形式,若有儲存檔案的權限,則通常會將位元碼儲存為.pyc檔案,位元碼是個與平台相依的指令格式,如果下次再匯入模組時,原始碼並沒有更動且.pyc存在,就會直接載入.pyc,減少了直譯的時間,從而加快了執行的速度。例如,在執行過以上的指令後,你可以發現 some.pyc 的存在. 使用 impor t匯入模組後,就會執行程式,所以上例中,你馬上看到 some.py 中 print 函式的結果. 模組其實也是個名稱空間,模組名稱就是檔案名稱,模組中宣告的變數或函式都是模組中的屬性,若要存取模組中的變數或函式等名稱,必須前置模組名稱,例如 some.title 這樣的名稱. 

可以使用 from import 語句「複製」出模組中的名稱,正如上面所示範的,複製出模組中的名稱是為了方便取用名稱,但設定複製出的變數,並不會影響原本模組中的變數。如果你想要知道模組中的屬性名稱,則可以使用 dir() 函式 : 
 

除了你自定義的屬性之外,還有一些內建的屬性,這之後有機會再深入介紹。你可以一次匯入兩個以上的名稱,例如 : 
from some import x, y

或者是將模組中的名稱全部匯入,例如 : 
from some import *

import 語句或 from import 語句只會在第一次匯入模組時執行模組中的程式碼,重複 import 同一個模組,並不會使得模組中的程式碼被重複執行多次,正如上例中所看到的,你並沒有看到 some.py 中的print函式重複被執行。如果你想要重新執行模組,則可以使用 imp.reload() 函式。例如 : 


附帶一提的是,如果要直接載入某個 .py 檔案來執行,則可以使用 open() 開啟 .py 檔案,之後 read() 讀取檔案,再使用 exec() 來執行,注意!這並非 import,也非 imp.reload(),只是讀取整個原始碼,再整個執行過一遍。例如 : 
 

每個 .py 檔案都是 Python 的模組,你可以將個別的功能撰寫在不同的模組中,在必要的時候以 import 語句匯入模組,就可以取用特定模組的功能,這是撰寫 Python 程式的一個中心架構! 

先前談到,可以使用dir() 查詢模組中的屬性,這邊先介紹一下 __name__ (Check Modules) 屬性。如果你使用 python 指令直接執行某個 .py 檔案,則 __name__ 屬性會被設定為 '__main__' 名稱,如果是 import 語句匯入模組,則 __name__ 會被設定為模組名稱。所以,模組的作者會為了測試自己所設計的模組,而寫下這樣的程式碼 : 
- some2.py : 
  1. def doSome(text):  
  2.     return text + '...processed...'  
  3.   
  4. def main():  
  5.     fixture = 'orz'  
  6.     print(doSome(fixture))  
  7.       
  8. if __name__ == '__main__':  
  9.     main()  
如此,只有在直接執行 some.py 時,才會呼叫 main() 函式並執行測試,若使用 import 語句匯入模組則不會! 
 

在入門階段,可以先知道的是,Python 會在 PYTHONPATH 環境變數所設定的路徑中,尋找 .py 或 .pyc 模組檔案,實際上,PYTHONPATH 環境變數的內容會被讀取,成為 sys.path 陣列中的字串元素,而這個字串所代表的路徑,正是模組檔案尋找的根據 : 

沒有留言:

張貼留言

[ Python 文章收集 ] List Comprehensions and Generator Expressions

Source From  Here   Preface   Do you know the difference between the following syntax?  view plain copy to clipboard print ? [x  for ...