您好,登錄后才能下訂單哦!
這篇文章主要介紹Python中函數的參數是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
如果有人問起 Python 程序員他們最喜歡 Python 哪一點,他們一定會提到 Python 的高可讀性。確實,對于 Python 來說,其高可讀性一直是 Python 這門語言設計的核心。一個不爭的事實是,相對于寫代碼而言,讀代碼才是更加平常的事情。
Python 代碼有高可讀性的一個原因就是其有著相對而言更加完善的編碼風格準則和 「Python 化」習語。
當 Python 老手(Pythonista)認為一段代碼不「Python 化」,他們通常的意思是這段代碼沒有遵循一般準則,同時亦沒有以最佳的(最具可讀性的)方式表達出代碼的意圖。
在一些極端的情況下,沒有公認最佳的方式來表達 Python 代碼的意圖,不過這種極端情況非常罕見。
一般概念
明確代碼意義
盡管 Python 可以寫出從各種意義上來說都像是黑魔法的代碼,但最簡單直白的表達才是正道。
不好
def make_complex(*args): x, y = args return dict(**locals())
好
def make_complex(x, y): return {'x': x, 'y': y}
在上述好的代碼中,x 和 y 清晰明了的從參數中獲取值,并清晰明了的返回了一個字典。當開發者看到這個函數后就可以明了這個函數的用途,而不好的代碼則不行。
一行一個聲明語句
雖然在 Python 中我們推崇使用形如列表生成式這種簡潔明了的復合語句,但是除此以外,我們應該盡量避免將兩句獨立分割的代碼寫在同一行。
不好的風格
print 'one'; print 'two' if x == 1: print 'one' if <complex comparison> and <other complex comparison>: # do something
好的風格
print 'one' print 'two' if x == 1: print 'one' cond1 = <complex comparison> cond2 = <other complex comparison> if cond1 and cond2: # do something
函數的參數
函數的參數可以使用四種不同的方式傳遞給函數。
必選參數 是沒有默認值的必填的參數。 必選參數是最簡單的參數構成,用于參數較少的函數的構成,是該函數意義的一部分,使用他們的順序是按照定義自然排序的。舉個例子,對于 send(message, recipient) 和 point(x, y) 這兩個函數,使用函數的人需要知道這個函數需要兩個參數,并且記住兩個參數的順序。
在調用函數的時候,我們也可以使用參數的名稱調用。使用參數的名稱的方式可以調換參數的順序,就像 send(recipient='World',message='Hello') 和 point(y=2, x=1) 這樣。但這樣的做法會降低代碼的可讀性,并且使代碼冗長,因此更建議使用 send('Hello', 'World') 和 point(1,2) 這樣的方式調用。
關鍵字參數 是非強制的,且有默認值。它們經常被用在傳遞給函數的可選參數中。 當一個函數有超過兩個或三個位置參數時,函數簽名會變得難以記憶,使用帶有默認參數的關鍵字參數有時候會給你帶來便利。比如,一個更完整的 send 函數可以被定義為 send(message, to, cc=None, bcc=None)。這里的 cc 和 bcc 是可選的, 當沒有傳遞給它們其他值的時候,它們的值就是 None。
Python 中有多種方式調用帶關鍵字參數的函數。比如說,我們可以按照定義時的參數順序而無需明確的命名參數來調用函數,就像 send('Hello', 'World', 'Cthulhu', 'God') 是將密件發送給上帝。我們也可以使用命名參數而無需遵循參數順序來調用函數,就像 send('Hello again', 'World', bcc='God', cc='Cthulhu') 。沒有特殊情況的話,這兩種方式都需要盡力避免,最優的調用方式是與定義方式一致:send('Hello', 'World', cc='Cthulhu',bcc='God') 。
任意參數列表 是第三種給函數傳參的方式。如果函數的參數數量是動態的,該函數可以被定義成 *args 的結構。在這個函數體中, args 是一個元組,它包含所有剩余的位置參數。舉個例子, 我們可以用任何容器作為參數去調用 send(message, *args) ,比如 send('Hello', 'God', 'Mom','Cthulhu')。 在此函數體中, args 相當于 ('God','Mom', 'Cthulhu')。
然而,這種結構有一些缺點,使用時應該特別注意。如果一個函數接受的參數列表具有相同的性質,通常把它定義成一個參數,這個參數是一個列表或者其他任何序列會更清晰。 在這里,如果 send 參數有多個容器(recipients),將之定義成 send(message,recipients) 會更明確,調用它時就使用 send('Hello', ['God', 'Mom', 'Cthulhu'])。這樣的話, 函數的使用者可以事先將容器列表維護成列表(list)形式,這為傳遞各種不能被轉變成其他序列的序列(包括迭代器)帶來了可能。
任意關鍵字參數字典 是最后一種給函數傳參的方式。如果函數要求一系列待定的命名參數,我們可以使用 **kwargs 的結構。在函數體中, kwargs 是一個字典,它包含所有傳遞給函數但沒有被其他關鍵字參數捕捉的命名參數。
和 任意參數列表 中所需注意的一樣,相似的原因是:這些強大的技術在非特殊情況下,都要盡量避免使用,因為其缺乏簡單和明確的結構來足夠表達函數意圖。
編寫函數的時候采用何種參數形式,是用位置參數,還是可選關鍵字參數,是否使用形如任意參數 的高級技術,這些都由程序員自己決定。如果能明智地遵循上述建議,即可輕松寫出這樣的 Python 函數:
易讀(名字和參數無需解釋)
易改(添加新的關鍵字參數不會破壞代碼的其他部分)
避免魔法方法
Python 對駭客來說是一個強有力的工具,它擁有非常豐富的鉤子(hook)和工具,允許你施展幾乎任何形式的技巧。比如說,它能夠做以下:
改變對象創建和實例化的方式;
改變 Python 解釋器導入模塊的方式;
甚至可能(如果需要的話也是被推薦的)在 Python 中嵌入 C 程序。
盡管如此,所有的這些選擇都有許多缺點。使用最直接的方式來達成目標通常是最好的方法。它們最主要的缺點是可讀性不高。許多代碼分析工具,比如說 pylint 或者 pyflakes,將無法解析這種『魔法』代碼。
我們認為 Python 開發者應該知道這些近乎無限的可能性,因為它為我們灌輸了沒有不可能完成的任務的信心。然而,知道何時 不能 使用它們也是非常重要的。
以上是Python中函數的參數是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。