Day-4: Python函数
每一個具體問題都有具體的實現(xiàn)方法,而對于同一類問題,不同的具體方法可以抽象成這一類的方法,當(dāng)給定一個特定的輸入時,這一類方法會變成適用于一具體問題的具體方法。
這就是函數(shù)想要做的事,將一類方法簡化抽象,使得每次都可以通過該函數(shù)實現(xiàn)想要實現(xiàn)的功能。
python內(nèi)置很多函數(shù),例如:
abs(),求絕對值的函數(shù);
cmp(x, y),比較x, y之間大小的函數(shù)等等
還可以自己定義自己想要的函數(shù):
如下:
def my_abs(x):if x >= 0:return xelse:return -x定義函數(shù)以def語句開頭,依次寫出函數(shù)名、括號、括號中的參數(shù)和冒號:,然后,在縮進塊中編寫函數(shù)體,函數(shù)的返回值用return語句返回。
函數(shù)什么都不做,就是空函數(shù),如下:
def nop():pass實際上空函數(shù)中,pass可以用來作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個pass,讓代碼能運行起來。
在設(shè)計函數(shù)的參數(shù)時,應(yīng)注意必選參數(shù)在前,默認(rèn)參數(shù)在后。默認(rèn)參數(shù)可以簡化函數(shù)的調(diào)用:
def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s定義一個默認(rèn)冪數(shù)是2的求冪函數(shù)后,只輸入一個參數(shù)時,就默認(rèn)冪數(shù)為2,輸入兩個參數(shù),則第二個參數(shù)為新的冪數(shù):
>>> power(5) 25 >>> power(5, 2) 25但是注意這里默認(rèn)參數(shù)得是不可變的,而不能是一個變量,不然重復(fù)調(diào)用時會出現(xiàn)錯誤。
def add_end(L=[]):L.append('END')return L第一次使用默認(rèn)參數(shù)調(diào)用時,結(jié)果還是對的
>>> add_end() ['END']但是多次調(diào)用就明顯出錯了
>>> add_end() ['END', 'END'] >>> add_end() ['END', 'END', 'END']這是因為原函數(shù)中的默認(rèn)參數(shù)時[],它實質(zhì)上是一個list的變量,會隨著每次使用而改變。這里表示空的list常量,應(yīng)該用“L=None”
如果函數(shù)的輸入的個數(shù)不確定,則使用可變參數(shù)*args;如果傳入的參數(shù)是一個dict類型,則應(yīng)使用關(guān)鍵字參數(shù)**kw
前者是將多個參數(shù)封裝成tuple,后者是將這些封裝成一個dict。所以前者得傳入一個個單個的量,后者得傳入key-value鍵值對。
當(dāng)要一起用到必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)時,應(yīng)注意參數(shù)定義的順序是:
必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)。
遞歸函數(shù)中每次進入一個函數(shù)調(diào)用會增加一層棧幀,每當(dāng)函數(shù)返回時,棧就會減少一層,這樣遞歸函數(shù)就可能會出現(xiàn)棧溢出。
解決遞歸調(diào)用棧溢出的方法是通過尾遞歸優(yōu)化。尾遞歸是指,在函數(shù)返回的時候,調(diào)用自身本身,并且,return語句不能包含表達(dá)式。這樣,編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無論調(diào)用多少次,都只占用一個棧幀,不會出現(xiàn)棧溢出的情況。
遺憾的是,大多數(shù)編程語言沒有針對尾遞歸做優(yōu)化,Python解釋器也沒有做優(yōu)化==
?注:本文為學(xué)習(xí)廖雪峰Python入門整理后的筆記
轉(zhuǎn)載于:https://www.cnblogs.com/likely-kan/p/7496063.html
總結(jié)
以上是生活随笔為你收集整理的Day-4: Python函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自动化__持续集成】___java__
- 下一篇: python多线程同步机制conditi