1 導入模塊
1.1 問題
本案例要求先編寫一個star模塊,主要要求如下:
- 建立工作目錄 ~/bin/
- 創建模塊文件 ~/bin/star.py
- 模塊中創建pstar函數,實現打印50個星號的功能
然后練習導入模塊,調用模塊中的函數:
- 在交互解釋器中導入模塊
- 調用模塊的函數
1.2 方案
使用vim當作文本編輯器編寫python腳本,使用RHEL6系統中自帶的python解釋器加載模塊。
注意,模塊及函數在后續課程中有詳細介紹,這里只是因為經常要用到導入模塊,所以需要大致了解一下。
模塊支持從邏輯上組織python代碼。當代碼量變得相當大的時候,最好把代碼分成一些有組織的代碼段,前提是保證它們的彼此交互。
這些代碼段是共享的,所以python允許調入一個模塊,允許使用其他模塊的屬性來利用之前的工作成果,實現代碼重用。這個把其他模塊中屬性附加到你的模塊中的操作叫做導入(import)。
給定一個模塊名之后,只可能有一個模塊被導入到python解釋器中,所以在不同模塊間不會出現名稱交叉現象;每個模塊都定義了它自己的唯一的名稱空間,訪問一個模塊的屬性可以使用句點表示法,比訪問star模塊中的pstar函數的寫法為:star.pstar()。
1.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:創建目錄結構
Linux在執行命令時,它會到PATH環境變量定義的路徑中去查找,如果查到則執行,如果查不到則提示命令找不到。
為了使得編寫的腳本在任意位置可以直接執行,并支持按TAB鍵補齊,最好將命令放到PATH環境變量定義的路徑中。
在Linux系統中,每個用戶的家目錄下的bin目錄,默認在PATH環境變量中,但是系統默認并沒有創建該目錄。
- [root@py01 ~]# echo $PATH
- /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
2)根據PATH變量內容創建bin目錄
- [root@py01 ~]# mkdir /root/bin
步驟二:創建模塊文件
1)創建模塊文件
python的模塊名就是腳本文件名去掉.py的擴展名,所以star模塊的文件名就是star.py。
在創建文件時,不要使用python已有的模塊名。因為在import模塊時,如果自己創建的模塊文件和python自帶的模塊重名,那么,用戶自己創建的模塊將被導入,用戶也就無法使用python自身的模塊了。
判斷python是否擁有某個模塊,最簡單的辦法就是,進入到python交互解釋器中,然后執行import命令,如果提示ImportError則表示python默認沒有該模塊。
- [root@py01 ~]# cd bin
- [root@py01 ~]# vim star.py
2)編寫pstar函數
像shell本一樣,python腳本文件的第一行也是解釋器。
在python中,使用def定義函數,def后面緊跟函數名,函數名后面是一對圓括號,圓括號包含可選的參數。
需要注意的是,()并不是函數名的一部分,另外最后不要丟掉冒號。在python中,如果一個關鍵字后面有子語句塊,那么該關鍵字的行尾都需要加冒號。
函數體部分(代碼組)必須縮進,一般縮進4個空格,而且所有的子語句必須縮進相同的空白。
函數定義只是說有這樣的功能,并不執行。所以該程序文件如果直接以腳本的方式執行,那么它不會產生任何輸出。
- #!/usr/bin/env python
- def pstar():
- print '*' * 50
步驟三:導入模塊并測試
在這里需要注意的是,需要在模塊文件所在的目錄下打開交互解釋器。因為python在導入模塊時會在固定的幾個位置去搜索模塊,如果找到則導入,否則將出錯。當前的工作目錄也是python在搜索模塊時會查找的路徑。
- [root@py01 bin]# python
- Python 2.6.6 (r266:84292, Oct 12 2012, 14:23:48)
- [GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import star
解釋器需要知識執行的是哪個模塊中的函數,所以寫法應該是:“模塊.函數”。
注意,函數名后面的圓括號不要丟掉,python調用函數使用圓括號,表示執行該函數的意思。如果沒有圓括號,只是引用,不調用,也就是不會執行該函數。
- >>> star.pstar()
- **************************************************