1. 程式人生 > >Python篇1.15---模塊與包

Python篇1.15---模塊與包

def lob 是否 函數 16px ont 針對 自己的 bsp

一.模塊

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---模塊與包