Python篇1.15---模塊與包
一.模塊
1 什麽是模塊?
一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。
2 為何要使用模塊?
如果你退出python解釋器然後重新進入,那麽你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文件中以便永久保存下來,需要時就通過python test.py方式去執行,此時test.py被稱為腳本script。
隨著程序的發展,功能越來越多,為了方便管理,我們通常將程序分成一個個的文件,這樣做程序的結構更清晰,方便管理。這時我們不僅僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能的重復利用,
3.如何使用模塊?
3.1 import
3.1.1建立spam.py,文件名spam.py,模塊名spam
#spam.py print(‘from the spam.py‘) money = 1000 def read1(): print(‘spam->read1->money‘,money) def read2(): print(‘spam->read2 calling read‘) read1() def change(): global money money = 0
建立test.py文件
模塊可以包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是可以在程序中的任意位置使用的,且針對同一個模塊很import多次,為了防止你重復導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增加了一次引用,不會重新執行模塊內的語句),如下
import spam ##只在第一次導入時才執行spam.py內代碼,此處的顯式效果是只打印一次‘from the spam.py‘,當然其他的頂級代碼也都被執行了,只不過沒有顯示效果. import spam import spam #運行結果 from the spam.py # import sys # print(sys.modules)
我們可以從sys.module中找到當前已經加載的模塊,sys.module是一個字典,內部包含模塊名與模塊對象的映射,該字典決定了導入模塊時是否需要重新導入。
3.1.2每個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間,這樣我們在編寫自己的模塊時,就不用擔心我們定義在自己模塊中全局變量會在被導入時,與使用者的全局變量沖突
1 #測試一:money與spam.money不沖突 2 #test.py 3 import spam 4 money=10 5 print(spam.money) 6 7 ‘‘‘ 8 執行結果: 9 from the spam.py 10 1000 11 ‘‘‘
1 #測試二:read1與spam.read1不沖突 2 #test.py 3 import spam 4 def read1(): 5 print(‘========‘) 6 spam.read1() 7 8 ‘‘‘ 9 執行結果: 10 from the spam.py 11 spam->read1->money 1000 12 ‘‘‘
1 #測試三:執行spam.change()操作的全局變量money仍然是spam中的 2 #test.py 3 import spam 4 money=1 5 spam.change() 6 print(money) 7 8 ‘‘‘ 9 執行結果: 10 from the spam.py 11 1 12 ‘‘‘
3.1.3 總結:首次導入模塊spam時會做三件事:
1.為源文件(spam模塊)創建新的名稱空間,在spam中定義的函數和方法若是使用到了global時訪問的就是這個名稱空間。
2.在新創建的命名空間中執行模塊中包含的代碼,見初始導入import spam
1 提示:導入模塊時到底執行了什麽?
2
3 In fact function definitions are also ‘statements’ that are ‘executed’; the execution of a module-level function definition enters the function name in the module’s global symbol table.
4 事實上函數定義也是“被執行”的語句,模塊級別函數定義的執行將函數名放入模塊全局名稱空間表,用globals()可以查看
3.創建名字spam來引用該命名空間
1 這個名字和變量名沒什麽區別,都是‘第一類的’,且使用spam.名字的方式可以訪問spam.py文件中定義的名字,spam.名字與test.py中的名字來自兩個完全不同的地方。
3.1.4 為模塊名起別名,相當於m1=1;m2=m1
1 import spam as sm
2 print(sm.money)
Python篇1.15---模塊與包