五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

簡(jiǎn)明Python教程·函數(shù)&模塊

2023-02-12 08:00 作者:琉璃汐陽(yáng)  | 我要投稿

上一篇專欄

?函數(shù)

函數(shù)(Functions)是指可重復(fù)使用的程序片段。它們?cè)试S你為某個(gè)代碼塊賦予名字,允許你 通過(guò)這一特殊的名字在你的程序任何地方來(lái)運(yùn)行代碼塊,并可重復(fù)任何次數(shù)。這就是所謂的 調(diào)用(Calling)函數(shù)。我們已經(jīng)使用過(guò)了許多內(nèi)置的函數(shù),例如 len range 。

函數(shù)概念可能是在任何復(fù)雜的軟件(無(wú)論使用的是何種編程語(yǔ)言)中最重要的構(gòu)建塊,所以 我們接下來(lái)將在本章中探討有關(guān)函數(shù)的各個(gè)方面。

函數(shù)可以通過(guò)關(guān)鍵字 def 來(lái)定義。這一關(guān)鍵字后跟一個(gè)函數(shù)的標(biāo)識(shí)符名稱,再跟一對(duì)圓括 號(hào),其中可以包括一些變量的名稱,再以冒號(hào)結(jié)尾,結(jié)束這一行。隨后而來(lái)的語(yǔ)句塊是函數(shù) 的一部分。下面的案例將會(huì)展示出這其實(shí)非常簡(jiǎn)單:

案例(保存為 functon1.py ):


輸出:

它是如何工作的?

我們以上文解釋過(guò)的方式定義名為 say_hello 的函數(shù)。這個(gè)函數(shù)不使用參數(shù),因此在括號(hào)中 沒(méi)有聲明變量。函數(shù)的參數(shù)只是輸入到函數(shù)之中,以便我可以傳遞不同的值給它,并獲得相 應(yīng)的結(jié)果。

要注意到我們可以兩次調(diào)用相同的函數(shù),這意味著我們不必重新把代碼再寫一次。?


?函數(shù)參數(shù)?1?

函數(shù)可以獲取參數(shù),這個(gè)參數(shù)的值由你所提供,借此,函數(shù)便可以利用這些值來(lái)做一些事 情。這些參數(shù)與變量類似,這些變量的值在我們調(diào)用函數(shù)時(shí)已被定義,且在函數(shù)運(yùn)行時(shí)均已 賦值完成。

函數(shù)中的參數(shù)通過(guò)將其放置在用以定義函數(shù)的一對(duì)圓括號(hào)中指定,并通過(guò)逗號(hào)予以分隔。當(dāng) 我們調(diào)用函數(shù)時(shí),我們以同樣的形式提供需要的值。要注意在此使用的術(shù)語(yǔ)——在定義函數(shù) 時(shí)給定的名稱稱作“形參”(Parameters),在調(diào)用函數(shù)時(shí)你所提供給函數(shù)的值稱作“實(shí) 參”(Arguments)。

案例(保存為 function_param.py ):

輸出:

它是如何工作的?

在這里,我們將函數(shù)命名為 print_max 并使用兩個(gè)參數(shù)分別稱作 a b 。我們使用一個(gè) 簡(jiǎn)單的 if...else 語(yǔ)句來(lái)找出更大的那個(gè)數(shù),并將它打印出來(lái)。

第一次調(diào)用函數(shù) print_max 時(shí),我們以實(shí)參的形式直接向函數(shù)提供這一數(shù)字。在第二次調(diào)用 時(shí),我們將變量作為實(shí)參來(lái)調(diào)用函數(shù)。 print_max(x, y) 將使得實(shí)參 x 的值將被賦值給形參 a ,而實(shí)參 y 的值將被賦值給形參 b 。在兩次調(diào)用中, print_max 都以相同的方式工作。


?局部變量 2?

函數(shù) 59當(dāng)你在一個(gè)函數(shù)的定義中聲明變量時(shí),它們不會(huì)以任何方式與身處函數(shù)之外但具有相同名稱 的變量產(chǎn)生關(guān)系,也就是說(shuō),這些變量名只存在于函數(shù)這一局部(Local)。這被稱為變量的 作用域(Scope)。所有變量的作用域是它們被定義的塊,從定義它們的名字的定義點(diǎn)開始。

案例(保存為 function_local.py ):

輸出:

它是如何工作的

當(dāng)我們第一次打印出存在于函數(shù)塊的第一行的名為 x 的值時(shí),Python 使用的是在函數(shù)聲明之上的主代碼塊中聲明的這一參數(shù)的值。

接著,我們將值 2 賦值給 x 。 x 是我們這一函數(shù)的局部變量。因此,當(dāng)我們改變函數(shù)中 x 的值的時(shí)候,主代碼塊中的 x 則不會(huì)受到影響。

?隨著最后一句 print 語(yǔ)句,我們展示出主代碼塊中定義的 x 的值,由此確認(rèn)它實(shí)際上不受 先前調(diào)用的函數(shù)中的局部變量的影響。


?global 語(yǔ)句?

如果你想給一個(gè)在程序頂層的變量賦值(也就是說(shuō)它不存在于任何作用域中,無(wú)論是函數(shù)還 是類),那么你必須告訴 Python 這一變量并非局部的,而是全局(Global)的。我們需要通 過(guò) global 語(yǔ)句來(lái)完成這件事。因?yàn)樵诓皇褂?global 語(yǔ)句的情況下,不可能為一個(gè)定義于 函數(shù)之外的變量賦值。

你可以使用定義于函數(shù)之外的變量的值(假設(shè)函數(shù)中沒(méi)有具有相同名字的變量)。然而,這 種方式不會(huì)受到鼓勵(lì)而且應(yīng)該避免,因?yàn)樗鼘?duì)于程序的讀者來(lái)說(shuō)是含糊不清的,無(wú)法弄清楚 變量的定義究竟在哪。而通過(guò)使用 global 語(yǔ)句便可清楚看出這一變量是在最外邊的代碼塊 中定義的。?

案例(保存為 function_global.py ):

輸出:

它是如何工作的?

global 語(yǔ)句用以聲明 x 是一個(gè)全局變量——因此,當(dāng)我們?cè)诤瘮?shù)中為 x 進(jìn)行賦值時(shí),這 一改動(dòng)將影響到我們?cè)谥鞔a塊中使用的 x 的值。

?你可以在同一句 global 語(yǔ)句中指定不止一個(gè)的全局變量,例如 global x, y, z 。


?默認(rèn)參數(shù)值?

對(duì)于一些函數(shù)來(lái)說(shuō),你可能為希望使一些參數(shù)可選并使用默認(rèn)的值,以避免用戶不想為他們 提供值的情況。默認(rèn)參數(shù)值可以有效幫助解決這一情況。你可以通過(guò)在函數(shù)定義時(shí)附加一個(gè) 賦值運(yùn)算符( = )來(lái)為參數(shù)指定默認(rèn)參數(shù)值。

要注意到,默認(rèn)參數(shù)值應(yīng)該是常數(shù)。更確切地說(shuō),默認(rèn)參數(shù)值應(yīng)該是不可變的——這將在后 面的章節(jié)中予以更詳細(xì)的解釋。就目前來(lái)說(shuō),只要記住就行了。

案例(保存為 function_default.py ):

輸出:

它是如何工作的?

名為 say 的函數(shù)用以按照給定的次數(shù)打印一串字符串。如果我們沒(méi)有提供一個(gè)數(shù)值,則將按 照默認(rèn)設(shè)置,只打印一次字符串。我們通過(guò)為參數(shù) times 指定默認(rèn)參數(shù)值 1 來(lái)實(shí)現(xiàn)這一 點(diǎn)。

在第一次使用 say 時(shí),我們只提供字符串因而函數(shù)只會(huì)將這個(gè)字符串打印一次。在第二次使 用 say 時(shí),我們既提供了字符串,同時(shí)也提供了一個(gè)參數(shù) 5 ,聲明我們希望說(shuō)(Say)這 個(gè)字符串五次。

注意

只有那些位于參數(shù)列表末尾的參數(shù)才能被賦予默認(rèn)參數(shù)值,意即在函數(shù)的參數(shù)列表中擁 有默認(rèn)參數(shù)值的參數(shù)不能位于沒(méi)有默認(rèn)參數(shù)值的參數(shù)之前。 這是因?yàn)橹凳前磪?shù)所處的位置依次分配的。舉例來(lái)說(shuō), def func(a, b=5) 是有效的, 但 def func(a=5, b) 是無(wú)效的。


?關(guān)鍵字參數(shù) 3?

如果你有一些具有許多參數(shù)的函數(shù),而你又希望只對(duì)其中的一些進(jìn)行指定,那么你可以通過(guò) 命名它們來(lái)給這些參數(shù)賦值——這就是關(guān)鍵字參數(shù)(Keyword Arguments——我們使用命 名(關(guān)鍵字)而非位置(一直以來(lái)我們所使用的方式)來(lái)指定函數(shù)中的參數(shù)。

這樣做有兩大優(yōu)點(diǎn)——其一,我們不再需要考慮參數(shù)的順序,函數(shù)的使用將更加容易。其 二,我們可以只對(duì)那些我們希望賦予的參數(shù)以賦值,只要其它的參數(shù)都具有默認(rèn)參數(shù)值。

案例(保存為 function_keyword.py ):

輸出:

它是如何工作的

名為 func 的函數(shù)有一個(gè)沒(méi)有默認(rèn)參數(shù)值的參數(shù),后跟兩個(gè)各自帶有默認(rèn)參數(shù)值的參數(shù)。

在第一次調(diào)用函數(shù)時(shí), func(3, 7) ,參數(shù) a 獲得了值 3 ,參數(shù) b 獲得了值 7 ,而 c 獲得了默認(rèn)參數(shù)值 10 。

?在第二次調(diào)用函數(shù)時(shí), func(25, c=24) ,由于其所處的位置,變量 a 首先獲得了值 25。然 后,由于命名——即關(guān)鍵字參數(shù)——指定,變量 c 獲得了值 24 。變量 b 獲得默認(rèn)參數(shù)值 5 。

在第三次調(diào)用函數(shù)時(shí), func(c=50, a=100) ,我們?nèi)渴褂藐P(guān)鍵字參數(shù)來(lái)指定值。在這里要注 意到,盡管 a c 之前定義,但我們還是我們?cè)谧兞?a 之前指定了變量 c 。


?可變參數(shù) 4

有時(shí)你可能想定義的函數(shù)里面能夠有任意數(shù)量的變量,也就是參數(shù)數(shù)量是可變的,這可以通 過(guò)使用星號(hào)來(lái)實(shí)現(xiàn)(將下方案例保存為 function_varargs.py ):

輸出:

它是如何工作的?

當(dāng)我們聲明一個(gè)諸如 *param 的星號(hào)參數(shù)時(shí),從此處開始直到結(jié)束的所有位置參數(shù) (Positional Arguments)都將被收集并匯集成一個(gè)稱為“param”的元組(Tuple)。?

類似地,當(dāng)我們聲明一個(gè)諸如 **param 的雙星號(hào)參數(shù)時(shí),從此處開始直至結(jié)束的所有關(guān)鍵字 參數(shù)都將被收集并匯集成一個(gè)名為 param 的字典(Dictionary)。

?我們將在后面的章節(jié)探索有關(guān)元組與字典的更多內(nèi)容。


?return 語(yǔ)句

return 語(yǔ)句用于從函數(shù)中返回,也就是中斷函數(shù)。我們也可以選擇在中斷函數(shù)時(shí)從函數(shù)中返 回一個(gè)值。

?案例(保存為 function_return.py ):?

輸出:

它是如何工作的 函數(shù) 64maximum 函數(shù)將會(huì)返回參數(shù)中的最大值,在本例中是提供給函數(shù)的數(shù)值。它使用一套簡(jiǎn)單的 if...else 語(yǔ)句來(lái)找到較大的那個(gè)值并將其返回。

要注意到如果 return 語(yǔ)句沒(méi)有搭配任何一個(gè)值則代表著 返回 None 。 None Python 中一 個(gè)特殊的類型,代表著虛無(wú)。舉個(gè)例子, 它用于指示一個(gè)變量沒(méi)有值,如果有值則它的值便 是 None(虛無(wú)) 。

每一個(gè)函數(shù)都在其末尾隱含了一句 return None ,除非你寫了你自己的 return 語(yǔ)句。你可 以運(yùn)行 print(some_function()) ,其中 some_function 函數(shù)不使用 return 語(yǔ)句,就像這樣:

Python 中的 pass 語(yǔ)句用于指示一個(gè)沒(méi)有內(nèi)容的語(yǔ)句塊。

提示:有一個(gè)名為 max 的內(nèi)置函數(shù)已經(jīng)實(shí)現(xiàn)了“找到最大數(shù)”這一功能,所以盡可能地使 用這一內(nèi)置函數(shù)。


?DocStrings?

Python 有一個(gè)甚是優(yōu)美的功能稱作文檔字符串(Documentation Strings),在稱呼它時(shí)通常 會(huì)使用另一個(gè)短一些的名字docstrings。DocStrings 是一款你應(yīng)當(dāng)使用的重要工具,它能夠幫 助你更好地記錄程序并讓其更加易于理解。令人驚嘆的是,當(dāng)程序?qū)嶋H運(yùn)行時(shí),我們甚至可 以通過(guò)一個(gè)函數(shù)來(lái)獲取文檔!

案例(保存為 function_docstring.py ):

輸出:?

它是如何工作的

函數(shù)的第一行邏輯行中的字符串是該函數(shù)的 文檔字符串(DocString)。這里要注意文檔字符 串也適用于后面相關(guān)章節(jié)將提到的模塊(Modules)類(Class) 。

該文檔字符串所約定的是一串多行字符串,其中第一行以某一大寫字母開始,以句號(hào)結(jié)束。 第二行為空行,后跟的第三行開始是任何詳細(xì)的解釋說(shuō)明。 5?在此強(qiáng)烈建議你在你所有重要功 能的所有文檔字符串中都遵循這一約定。

我們可以通過(guò)使用函數(shù)的 __doc__ (注意其中的雙下劃綫)屬性(屬于函數(shù)的名稱)來(lái)獲取 函數(shù) print_max 的文檔字符串屬性。只消記住 Python 將所有東西都視為一個(gè)對(duì)象,這其中 自然包括函數(shù)。我們將在后面的類(Class)章節(jié)討論有關(guān)對(duì)象的更多細(xì)節(jié)。?

如果你曾使用過(guò) Pythonhelp() 函數(shù),那么你應(yīng)該已經(jīng)了解了文檔字符串的用途了。它所 做的便是獲取函數(shù)的 __doc__ 屬性并以一種整潔的方式將其呈現(xiàn)給你。你可以在上方的函數(shù) 中嘗試一下——只需在程序中包含 help(print_max) 就行了。要記住你可以通過(guò)按下 q 鍵 來(lái)退出 help 。

自動(dòng)化工具可以以這種方式檢索你的程序中的文檔。因此,我強(qiáng)烈推薦你為你編寫的所有重 要的函數(shù)配以文檔字符串。你的 Python 發(fā)行版中附帶的 pydoc 命令與 help() 使用文檔字 符串的方式類似。


?總結(jié)

我們已經(jīng)了解了許多方面的函數(shù),但我們依舊還未覆蓋到所有類型的函數(shù)。不過(guò),我們已經(jīng) 覆蓋到了大部分你每天日常使用都會(huì)使用到的 Python 函數(shù)。?

接下來(lái),我們將了解如何創(chuàng)建并使用 Python 模塊。 .


  1. 原文作 Function Parameters,沈潔元譯本譯作“函數(shù)形參”。Parameter 和 Argument 同時(shí)具有“參數(shù)”和“形參”或“實(shí)參”兩種譯法。一般來(lái)說(shuō),只有在存在形參實(shí)參二義關(guān)系 時(shí),才會(huì)特別翻譯成“形參”或“實(shí)參”。故此節(jié)標(biāo)題 Parameter 作“參數(shù)”解。 ?

  2. 原文作 Local Varibles。 ??

  3. 原文作 Keyword Arguments,沈潔元譯本譯作“關(guān)鍵參數(shù)”。 ??

  4. 原文作 VarArgs Parameters,VarArgs 來(lái)自于英文“可變的”“自變量(一譯變?cè)?,臺(tái)譯 引數(shù),也可以理解成參數(shù))”兩個(gè)英文單詞的結(jié)合,即 Variable Arguments。 ?

  5. 此處指的是以英文撰寫的文檔字符串內(nèi)容。 ?

?模塊

在上一章,你已經(jīng)了解了如何在你的程序中通過(guò)定義一次函數(shù)工作來(lái)重用代碼。那么如果你 想在你所編寫的別的程序中重用一些函數(shù)的話,應(yīng)該怎么辦?正如你可能想象到的那樣,答 案是模塊(Modules)。?

編寫模塊有很多種方法,其中最簡(jiǎn)單的一種便是創(chuàng)建一個(gè)包含函數(shù)與變量、以 .py 為后綴的 文件。?

另一種方法是使用撰寫 Python 解釋器本身的本地語(yǔ)言來(lái)編寫模塊。舉例來(lái)說(shuō),你可以使用 C 語(yǔ)言來(lái)撰寫 Python 模塊,并且在編譯后,你可以通過(guò)標(biāo)準(zhǔn) Python 解釋器在你的 Python 代 碼中使用它們。?

一個(gè)模塊可以被其它程序?qū)氩⑦\(yùn)用其功能。我們?cè)谑褂?Python 標(biāo)準(zhǔn)庫(kù)的功能時(shí)也同樣如 此。首先,我們要了解如何使用標(biāo)準(zhǔn)庫(kù)模塊。?

案例 (保存為 module_using_sys.py ):

輸出:

它是如何工作的

首先,我們通過(guò) import 語(yǔ)句導(dǎo)入 sys 模塊。基本上,這句代碼將轉(zhuǎn)化為我們告訴 Python 我們希望使用這一模塊。 sys 模塊包含了與 Python 解釋器及其環(huán)境相關(guān)的功能,也就是所 謂的系統(tǒng)功能(system)。

當(dāng) Python 運(yùn)行 import sys 這一語(yǔ)句時(shí),它會(huì)開始尋找 sys 模塊。在這一案例中,由于其 是一個(gè)內(nèi)置模塊,因此 Python 知道應(yīng)該在哪里找到它。

如果它不是一個(gè)已編譯好的模塊,即用 Python 編寫的模塊,那么 Python 解釋器將從它的 sys.path 變量所提供的目錄中進(jìn)行搜索。如果找到了對(duì)應(yīng)模塊,則該模塊中的語(yǔ)句將在開始 運(yùn)行,并能夠?yàn)槟闼褂?。在這里需要注意的是,初始化工作只需在我們第一次導(dǎo)入模塊時(shí) 完成。

sys 模塊中的 argv 變量通過(guò)使用點(diǎn)號(hào)予以指明,也就是 sys.argv 這樣的形式。它清晰地 表明了這一名稱是 sys 模塊的一部分。這一處理方式的另一個(gè)優(yōu)點(diǎn)是這個(gè)名稱不會(huì)與你程序 中的其它任何一個(gè) argv 變量沖突。

sys.argv 變量是一系列字符串的列表(List)(列表將在后面的章節(jié)予以詳細(xì)解釋)。具體 而言, sys.argv 包含了命令行參數(shù)(Command Line Arguments)這一列表,也就是使用命 令行傳遞給你的程序的參數(shù)。

?如果你正在使用一款 IDE 來(lái)編寫并運(yùn)行這些程序,請(qǐng)?jiān)诔绦虿藛沃袑ふ蚁嚓P(guān)指定命令行參數(shù) 的選項(xiàng)。

?在這里,當(dāng)我們運(yùn)行 python module_using_sys.py we are arguments 時(shí),我們通過(guò) python 命 令來(lái)運(yùn)行 module_using_sys.py 模塊,后面的內(nèi)容則是傳遞給程序的參數(shù)。 Python 將命令行 參數(shù)存儲(chǔ)在 sys.argv 變量中供我們使用。

?在這里要記住的是,運(yùn)行的腳本名稱在 sys.argv 的列表中總會(huì)位列第一。因此,在這一案 例中我們將會(huì)有如下對(duì)應(yīng)關(guān)系: 'module_using_sys.py' 對(duì)應(yīng) sys.argv[0] , 'we' 對(duì)應(yīng) sys.argv[1] , 'are' 對(duì)應(yīng) sys.argv[2] 'arguments' 對(duì)應(yīng) sys.argv[3] 。要注意到 Python0 開始計(jì)數(shù),而不是 1。

? sys.path 內(nèi)包含了導(dǎo)入模塊的字典名稱列表。你能觀察到 sys.path 的第一段字符串是空的 ——這一空字符串代表當(dāng)前目錄也是 sys.path 的一部分,它與 PYTHONPATH 環(huán)境變量等 同。這意味著你可以直接導(dǎo)入位于當(dāng)前目錄的模塊。否則,你必須將你的模塊放置在 sys.path 內(nèi)所列出的目錄中。

另外要注意的是當(dāng)前目錄指的是程序啟動(dòng)的目錄。你可以通過(guò)運(yùn)行 import os; print(os.getcwd()) 來(lái)查看你的程序目前所處在的目錄。


?按字節(jié)碼編譯的 .pyc 文件 1?

導(dǎo)入一個(gè)模塊是一件代價(jià)高昂的事情,因此 Python 引入了一些技巧使其能夠更快速的完成。 其中一種方式便是創(chuàng)建按字節(jié)碼編譯的(Byte-Compiled)文件,這一文件以 .pyc 為其擴(kuò)展 名,是將 Python 轉(zhuǎn)換成中間形式的文件(還記得《介紹》一章中介紹的 Python 是如何工作 的嗎?)。這一 .pyc 文件在你下一次從其它不同的程序?qū)肽K時(shí)非常有用——它將更加 快速,因?yàn)閷?dǎo)入模塊時(shí)所需要的一部分處理工作已經(jīng)完成了。同時(shí),這些按字節(jié)碼編譯的文 件是獨(dú)立于運(yùn)行平臺(tái)的。

注意:這些 .pyc 文件通常會(huì)創(chuàng)建在與對(duì)應(yīng)的 .py 文件所處的目錄中。如果 Python 沒(méi)有相 應(yīng)的權(quán)限對(duì)這一目錄進(jìn)行寫入文件的操作,那么 .pyc 文件將不會(huì)被創(chuàng)建。


?from..import 語(yǔ)句

如果你希望直接將 argv 變量導(dǎo)入你的程序(為了避免每次都要輸入 sys. ),那么你可以 通過(guò)使用 from sys import argv 語(yǔ)句來(lái)實(shí)現(xiàn)這一點(diǎn)。

警告:一般來(lái)說(shuō),你應(yīng)該盡量避免使用 from...import 語(yǔ)句,而去使用 import 語(yǔ)句。 這是為了避免在你的程序中出現(xiàn)名稱沖突,同時(shí)也為了使程序更加易讀。?

案例:


?模塊的 __name__?

每個(gè)模塊都有一個(gè)名稱,而模塊中的語(yǔ)句可以找到它們所處的模塊的名稱。這對(duì)于確定模塊 是獨(dú)立運(yùn)行的還是被導(dǎo)入進(jìn)來(lái)運(yùn)行的這一特定目的來(lái)說(shuō)大為有用。正如先前所提到的,當(dāng)模 塊第一次被導(dǎo)入時(shí),它所包含的代碼將被執(zhí)行。我們可以通過(guò)這一特性來(lái)使模塊以不同的方 式運(yùn)行,這取決于它是為自己所用還是從其它從的模塊中導(dǎo)入而來(lái)。這可以通過(guò)使用模塊的 __name__ 屬性來(lái)實(shí)現(xiàn)。?

案例(保存為 module_using_name.py ):

輸出:

它是如何工作的?

每一個(gè) Python 模塊都定義了它的 __name__ 屬性。如果它與 __main__ 屬性相同則代表這一 模塊是由用戶獨(dú)立運(yùn)行的,因此我們便可以采取適當(dāng)?shù)男袆?dòng)。


?編寫你自己的模塊?

編寫你自己的模塊很簡(jiǎn)單,這其實(shí)就是你一直在做的事情!這是因?yàn)槊恳粋€(gè) Python 程序同時(shí) 也是一個(gè)模塊。你只需要保證它以 .py 為擴(kuò)展名即可。下面的案例會(huì)作出清晰的解釋。?

案例(保存為 mymodule.py ):

上方所呈現(xiàn)的就是一個(gè)簡(jiǎn)單的模塊。正如你所看見的,與我們一般所使用的 Python 的程序相 比其實(shí)并沒(méi)有什么特殊的區(qū)別。我們接下來(lái)將看到如何在其它 Python 程序中使用這一模塊。

要記住該模塊應(yīng)該放置于與其它我們即將導(dǎo)入這一模塊的程序相同的目錄下,或者是放置在 sys.path 所列出的其中一個(gè)目錄下。

另一個(gè)模塊(保存為 mymodule_demo.py ):

輸出:

它是如何工作的?

你會(huì)注意到我們使用相同的點(diǎn)符來(lái)訪問(wèn)模塊中的成員。Python 很好地重用了其中的符號(hào),這 充滿了“Pythonic”式的氣息,這使得我們可以不必學(xué)習(xí)新的方式來(lái)完成同樣的事情。?

下面是一個(gè)使用 from...import 語(yǔ)法的范本(保存為 mymodule_demo2.py ):

mymodule_demo2.py 所輸出的內(nèi)容與 mymodule_demo.py 所輸出的內(nèi)容是一樣的。

在這里需要注意的是,如果導(dǎo)入到 mymodule 中的模塊里已經(jīng)存在了 __version__ 這一名 稱,那將產(chǎn)生沖突。這可能是因?yàn)槊總€(gè)模塊通常都會(huì)使用這一名稱來(lái)聲明它們各自的版本號(hào)。因此,我們大都推薦最好去使用 import 語(yǔ)句,盡管這會(huì)使你的程序變得稍微長(zhǎng)一些。

你還可以使用:

這將導(dǎo)入諸如 say_hi 等所有公共名稱,但不會(huì)導(dǎo)入 __version__ 名稱,因?yàn)楹笳咭噪p下劃 線開頭。

警告:要記住你應(yīng)該避免使用 import-star 這種形式,即 from mymodule import *

Python 之禪?

Python 的一大指導(dǎo)原則是“明了勝過(guò)晦澀” 。你可以通過(guò)在 Python 中運(yùn)行 import this 來(lái)了解更多內(nèi)容。


?dir 函數(shù)

?內(nèi)置的 dir() 函數(shù)能夠返回由對(duì)象所定義的名稱列表。 如果這一對(duì)象是一個(gè)模塊,則該列 表會(huì)包括函數(shù)內(nèi)所定義的函數(shù)、類與變量。

?該函數(shù)接受參數(shù)。 如果參數(shù)是模塊名稱,函數(shù)將返回這一指定模塊的名稱列表。 如果沒(méi)有提 供參數(shù),函數(shù)將返回當(dāng)前模塊的名稱列表。?

案例:

它是如何工作的?

首先我們看到的是 dir 在被導(dǎo)入的 sys 模塊上的用法。我們能夠看見它所包含的一個(gè)巨大 的屬性列表。?

隨后,我們以不傳遞參數(shù)的形式使用 dir 函數(shù)。在默認(rèn)情況下,它將返回當(dāng)前模塊的屬性列 表。要注意到被導(dǎo)入進(jìn)來(lái)的模塊所能生成的列表也會(huì)是這一列表的一部分。?

給了觀察 dir 函數(shù)的操作,我們定義了一個(gè)新的變量 a 并為其賦予了一個(gè)值,然后在檢查 dir 返回的結(jié)果,我們就能發(fā)現(xiàn),同名列表中出現(xiàn)了一個(gè)新的值。我們通過(guò) del 語(yǔ)句移除 了一個(gè)變量或是屬性,這一變化再次反映在 dir 函數(shù)所處的內(nèi)容中。

關(guān)于 del 的一個(gè)小小提示——這一語(yǔ)句用于刪除一個(gè)變量或名稱,當(dāng)這一語(yǔ)句運(yùn)行后,在本 例中即 del a ,你便不再能訪問(wèn)變量 a ——它將如同從未存在過(guò)一般。

要注意到 dir() 函數(shù)能對(duì)任何對(duì)象工作。例如運(yùn)行 dir(str) 可以訪問(wèn) str String,字符 串)類的屬性。

?同時(shí),還有一個(gè) vars() 函數(shù)也可以返回給你這些值的屬性,但只是可能,它并不能針對(duì)所 有類都能正常工作。


現(xiàn)在,你必須開始遵守用以組織你的程序的層次結(jié)構(gòu)。變量通常位于函數(shù)內(nèi)部,函數(shù)與全局 變量通常位于模塊內(nèi)部。如果你希望組織起這些模塊的話,應(yīng)該怎么辦?這便是包 (Packages)應(yīng)當(dāng)?shù)菆?chǎng)的時(shí)刻。

包是指一個(gè)包含模塊與一個(gè)特殊的 __init__.py 文件的文件夾,后者向 Python 表明這一文 件夾是特別的,因?yàn)槠浒?Python 模塊。

?建設(shè)你想創(chuàng)建一個(gè)名為“world”的包,其中還包含著 ”asia“、”africa“等其它子包,同時(shí)這些子 包都包含了諸如”india“、”madagascar“等模塊。

?下面是你會(huì)構(gòu)建出的文件夾的結(jié)構(gòu):

包是一種能夠方便地分層組織模塊的方式。你將在 標(biāo)準(zhǔn)庫(kù) 中看到許多有關(guān)于此的實(shí)例。


?總結(jié)

如同函數(shù)是程序中的可重用部分那般,模塊是一種可重用的程序。包是用以組織模塊的另一 種層次結(jié)構(gòu)。Python 所附帶的標(biāo)準(zhǔn)庫(kù)就是這樣一組有關(guān)包與模塊的例子。

我們已經(jīng)了解了如何使用這些模塊并創(chuàng)建你自己的模塊。

接下來(lái),我們將學(xué)習(xí)一些有趣的概念,它們被稱作數(shù)據(jù)結(jié)構(gòu)。 .

  1. 原文作 Byte-compiled .pyc Files,沈潔元譯本譯作“字節(jié)編譯的 .pyc 文件”。 ??

  2. 原文作 Explicit is better than Implicit,如果使用前面章節(jié)出現(xiàn)過(guò)的術(shù)語(yǔ)概念,也可理 解為“顯式勝過(guò)隱式”。 ?

下一篇專欄


簡(jiǎn)明Python教程·函數(shù)&模塊的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
茌平县| 射洪县| 张家川| 南康市| 桦南县| 水城县| 凯里市| 福安市| 饶平县| 罗山县| 芜湖县| 内江市| 香港| 琼海市| 英吉沙县| 曲水县| 咸宁市| 密云县| 阿荣旗| 潞西市| 安龙县| 顺义区| 新巴尔虎右旗| 牙克石市| 贡觉县| 利川市| 中超| 平舆县| 报价| 阿拉善盟| 云霄县| 泰兴市| 蛟河市| 息烽县| 兴和县| 阳东县| 永宁县| 朝阳市| 商水县| 大关县| 衡水市|