第五章、Py盒子:模組、套件與程式
- 指定程式位於的資料夾
方法一:
※先將資料夾指定到自己設定的位置,我的資料夾位置式放在"C:/python"。之後輸入ipython進入python的交談式介面
方法二:
※先進去python交談式介面,使用import 匯入 os 模組,在os模組裡面有其中有兩個函式
os.chdir為更換目錄,括號中的"r"讓後面的路徑不用使用反斜線跳脫字元。os.getcwd()則是取得執行時的工作目錄
- 獨立的程式
※建立一個名為test1.py的檔案,在裡面加入這一行程式
※使用run 來執行看看
- 指令列引數
※建立一個名為test2.py的檔案,加入這兩行
※執行結果如下:
- 模組與import陳述式
所謂模組(module)只是python的一個程式檔案。
要參考其他模組,我們要使用import陳述式,它可以讓你的程式--使用被匯入的模組裡面的程式與變數
- 匯入模組
※接下來匯製作一個自訂模組,再用自己寫的程式匯入使用(兩個檔案需放在同一個目錄執行)
※首先是寫一個自訂模組。建立一個叫做report.py的檔案,再裡面寫一個自訂函式,隨機選取串列內的文字輸出
※random是一個python的模組,choice是裡面的一個函式,目的在隨機選擇項目
※再來是寫主程式。,建立一個叫做weatherman.py的檔案,在裡面import剛剛的自訂模組report,寫進主程式內容。以下為執行結果
※這個程式使用兩種不同的方法來使用import
主程式呼叫import report,接著執行report.get_description()
report.py裡面的get_description()函式呼叫from random import choice
接著執行return choice(possiblities)
- 用其它名稱來匯入模組
※如果你有其他模組使用相同的名稱,或想使用更簡短或是幫助記憶的名稱時,可以用'別名'來匯入
- 只匯入模組內你想要的東西
※匯入report裡面的get_description,並用do_it來暫時更名
- 模組搜尋路徑
※Python要去哪裡找匯入的檔案?,它會使用sys標準模組的path變數內的一串目錄名稱串列,以及ZIP方式保存檔案
※一開始的空白是空字串。它你import時會先查看當前目錄,它會使用第一個找到的對像。
例如如果你新增一個模組叫做random,它的路徑的位置在標準程式之前,你就無法存取到標準程式庫的random了
- 套件
從一行程式到多行程式,在到獨立程式,到同一個目錄下的多個模組。要擴充Python應用程式,可以將模組架構為"套件"
※以下程式會製作一個名為soures的目錄,在裡面有兩個模組,daily.py和weekly.py,每個模組裏面都有個名為forecast的函式
每日的版本會回傳一個字串,每周的版本會回傳一個串列
※要在sources中放入一個__init__.py的檔案,它可以是空的,但有了它之後,Python才可以將容納它的目錄視為套件
※daily.py模組
※weekly.py模組
※主程式
※執行結果
- Python標準程式庫
Python的主要訴求之一,就是它有"內建電池"── 一種大型的標準模組庫,可執行許多實用的工作
- 用setdefault()與defaultdict()來處理遺漏的鍵
※當你用不存在的鍵來存取字典會產生一例外,可以用setdefault回傳一個預設值以免例外發生,但是如果鍵遺漏的話,他會指派一個項目給字典
※defaultdict()很類似,但它會在字典建立時,為任何新鍵指定預設值,它的引述是個函式,第一次我的傳入int函式,第二次則是自訂函式
※你可以使用其他函式來回傳這些類型預設的空白值,int()回傳0,list()回傳空串列[],dict回傳空字典{},如果你省略引數,則新建的初始值會被設為None
※可以直接使用lambda在呼叫式中定義預設的函式
※上述範例為製作一個計數器,由於defaultdict(int)預設值為0,所以food_count[food]迴圈計數時,不用歸零也不會發出例外
- 用Counter()來計算項目數量
標準程式庫有一個計數器,除了ˊ 前的工作外,它也能做其他的工作
※上述為做出一個名為breakfast_count的計數器來計數breakfast,並操作它
※ most_common() 函式會以降冪回傳所有元素,或當你指定一個數量時,回傳最前面的count元素
※上述為做出一個名為lunch_count的計數器來計數lunch,再來將它與breakfast_count做結合。
※要注意的是聯集不會加總,而是選取數量較多的那個項目
- 使用鍵與OrderedDict()來排序
- 堆疊+序列 ==deque
簡單來說就是檢查回文,from collections import deque後 deque(字串),就能檢查該字串是否為回文(回文:從頭尾兩端開始字元都相同,直到中間)
- 使用itertools來迭代程式結構
itertools有許多函式,特別是有些排列組合可以為你節省很多時間,以下舉例部分函式
- 用pprint印出好看的結果
pprint()會試著排列元素,讓你更容易閱讀
- 更多電池:取得其他的Python程式
有些標準程式庫沒有你要的東西,或沒有採用非常正確地的工作方式。
全世界都有開放的程式碼,第三方的Python軟體供你使用
以下為優秀的資源:
- PyPi:(http://pypi.python.org)
- github:(https://githhub.com/Python)
- readthedocs(https://readthedocs.org/)
- 練習題
- 建立一個名為zoo.py的檔案。在裡面定義一個名為 hours()的函式
,用它來印出字串'Open 9-5 daily'。接著使用互動式解譯器來匯入 zoo 模組
,並呼出它的hours()函式
- 在互動式解譯器中,將zoo模組匯入名為menagerie,並呼叫它的hours()函式
- 在互動式解譯器中,直接從zoo匯入hours()函式,並呼叫它
- 在互動式解譯器中,將hours函式匯入為info,並呼叫它
- 使用 鍵/值 對 'r':5、'a':1、'd':4、'b':2、與 'c':3 製作一個名為plain的字典,再將它印出
- 用上題的 鍵/值 製作一個名為fancy的OrderedDict,並將它印出。觀察順序是否相同
- 製作一名為dict_of_lists的default,並對它傳入引數列串列,製作串列dict_of_lists['a']
並以一個函式指派,將'something for a'值指派給他,印出dict_of_lists['a']
留言列表