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