Python 模組(教程3)

2021-07-14 15:55:08 字數 4639 閱讀 9529

模組讓你能夠有邏輯地組織你的python**段。

把相關的**分配到乙個 模組裡能讓你的**更好用,更易懂。

模組也是python物件,具有隨機的名字屬性用來繫結或引用。

簡單地說,模組就是乙個儲存了python**的檔案。模組能定義函式,類和變數。模組裡也能包含可執行的**。例子

乙個叫做aname的模組裡的python**一般都能在乙個叫aname.py的檔案中找到。下例是個簡單的模組support.py。

def

print_func

(par

):print

"hello : "

,par

return

想使用python原始檔,只需在另乙個原始檔裡執行import語句,語法如下:

import

module1

[,module2

[,...

modulen

]

當直譯器遇到import語句,如果模組在當前的搜尋路徑就會被匯入。

搜尋路徑是乙個直譯器會先進行搜尋的所有目錄的列表。如想要匯入模組hello.py,需要把命令放在指令碼的頂端:

#!/usr/bin/python

# -*- coding: utf-8 -*-

# 匯入模組

import

support

# 現在可以呼叫模組裡包含的函式了

support

.print_func

("zara"

)

以上例項輸出結果:

hello

:zara

乙個模組只會被匯入一次,不管你執行了多少次import。這樣可以防止匯入模組被一遍又一遍地執行。

python的from語句讓你從模組中匯入乙個指定的部分到當前命名空間中。語法如下:

from

modname

import

name1

[,name2

[,...

namen

]]

例如,要匯入模組fib的fibonacci函式,使用如下語句:

from

fib

import

fibonacci

這個宣告不會把整個fib模組匯入到當前的命名空間中,它只會將fib裡的fibonacci單個引入到執行這個宣告的模組的全域性符號表。

把乙個模組的所有內容全都匯入到當前的命名空間也是可行的,只需使用如下宣告:

from

modname

import

*

這提供了乙個簡單的方法來匯入乙個模組中的所有專案。然而這種宣告不該被過多地使用。

當你匯入乙個模組,python解析器對模組位置的搜尋順序是:

模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,pythonpath和由安裝過程決定的預設目錄。

作為環境變數,pythonpath由裝在乙個列表裡的許多目錄組成。pythonpath的語法和shell變數path的一樣。

在windows系統,典型的pythonpath如下:

set

pythonpath=c

:\python20\lib

;

在unix系統,典型的pythonpath如下:

set

pythonpath

=/usr/

local

/lib

/python

變數是擁有匹配物件的名字(識別符號)。命名空間是乙個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。

乙個python表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。

每個函式都有自己的命名空間。類的方法的作用域規則和通常函式的一樣。

python會智慧型地猜測乙個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。

因此,如果要給全域性變數在乙個函式裡賦值,必須使用global語句。

global varname的表示式會告訴python, varname是乙個全域性變數,這樣python就不會在區域性命名空間裡尋找這個變數了。

例如,我們在全域性命名空間裡定義乙個變數money。我們再在函式內給變數money賦值,然後python會假定money是乙個區域性變數。然而,我們並沒有在訪問前宣告乙個區域性變數money,結果就是會出現乙個unboundlocalerror的錯誤。取消global語句的注釋就能解決這個問題。

#!/usr/bin/python

# -*- coding: utf-8 -*-

money

=2000

defaddmoney

():# 想改正**就取消以下注釋:

# global money

money

=money+1

print

money

addmoney

()print

money

dir()函式乙個排好序的字串列表,內容是乙個模組裡定義過的名字。

返回的列表容納了在乙個模組裡定義的所有模組,變數和函式。如下乙個簡單的例項:

#!/usr/bin/python

# -*- coding: utf-8 -*-

# 匯入內建math模組

import

math

content

=dir

(math

)print

content

;

以上例項輸出結果:

[

'__doc__'

,'__file__'

,'__name__'

,'acos'

,'asin'

,'atan'

,'atan2'

,'ceil'

,'cos'

,'cosh'

,'degrees'

,'e'

,'exp'

,'fabs'

,'floor'

,'fmod'

,'frexp'

,'hypot'

,'ldexp'

,'log'

,'log10'

,'modf'

,'pi'

,'pow'

,'radians'

,'sin'

,'sinh'

,'sqrt'

,'tan'

,'tanh'

]

在這裡,特殊字串變數__name__指向模組的名字,__file__指向該模組的匯入檔名。

根據呼叫地方的不同,globals()和locals()函式可被用來返回全域性和區域性命名空間裡的名字。

如果在函式內部呼叫locals(),返回的是所有能在該函式裡訪問的命名。

如果在函式內部呼叫globals(),返回的是所有在該函式裡能訪問的全域性名字。

兩個函式的返回型別都是字典。所以名字們能用keys()函式摘取。

當乙個模組被匯入到乙個指令碼,模組頂層部分的**只會被執行一次。

因此,如果你想重新執行模組裡頂層部分的**,可以用reload()函式。該函式會重新匯入之前匯入過的模組。語法如下:

reload

(module_name

)

在這裡,module_name要直接放模組的名字,而不是乙個字串形式。比如想過載hello模組,如下:

reload

(hello

)

包是乙個分層次的檔案目錄結構,它定義了乙個由模組及子包,和子包下的子包等組成的python的應用環境。

考慮乙個在phone目錄下的pots.py檔案。這個檔案有如下源**:

#!/usr/bin/python

# -*- coding: utf-8 -*-

defpots

():print

"i'm pots phone"

同樣地,我們有另外兩個儲存了不同函式的檔案:

現在,在phone目錄下建立file __init__.py:

當你匯入phone時,為了能夠使用所有函式,你需要在__init__.py裡使用顯式的匯入語句,如下:

from

pots

import

pots

from

isdn

import

isdn

from

g3 import

g3

當你把這些**新增到__init__.py之後,匯入phone包的時候這些類就全都是可用的了。

#!/usr/bin/python

# -*- coding: utf-8 -*-

# 匯入 phone 包

import

phone

phone

.pots

()phone

.isdn

()phone.g3

()

以上例項輸出結果:

i

'm pots phone

i'm

3gphone

i'm isdn phone

python3 logging 模組使用教程

import logging info warning error critical logging.debug debug message logging.info info message logging.warning warning message logging.error error m...

python簡明教程學習筆記3 模組

模組的 name 每個模組都有乙個名稱,在模組中可以通過語句來找出模組的名稱。這在乙個場合特別有用 就如前面所提到的,當乙個模組被第一次輸入的時候,這個模組的主塊將被執行。假如我們只想在程式本身被使用的時候執行主塊,而在它被別的模組輸入的時候不執行主塊,我們該怎麼做呢?這可以通過模組的 name 屬...

模組(Python基礎教程(第3版 )

集合 集合是可變的,因此不能用作字典中的鍵。另乙個問題是,集合只能包含不可變 可雜湊 的值,因此不能包含其他集合。由於在現實世界中經常會遇到集合的集合,因此這可能是個問題。所幸還有frozenset型別,它表示不可變 可雜湊 的集合。堆 位置 i處的元素總是大於位置i 2處的元素 反過來說就是小於位...