前面講了不少內容都是關於python的變量,數據結構,下面咱們來談一談python的函數。python裏的函數知識點大概分爲基礎的定義使用,做用域和參數傳遞,高級用法,其中參數傳遞最爲靈活,做用域最爲繞人.java
函數實際上是對程序邏輯進行結構化或者過程化的一種編程方法,把整塊的代碼巧妙的隔離成易於管理的小塊,是最基本的一種代碼抽象的方式。python
python函數是用def關鍵字定義的:c++
通常的編程語言好比c,c++,java,通常返回的都是一個值,python能夠返回多個值(perl其實也能夠),由於有的時候咱們除了須要函數返回計算的結果,咱們還須要返回一些操做的狀態,看個簡單的例子你就明白了 :express
這個getHtmlResponse()函數能夠返回多個值,第一值是返回處理的狀態True or false,第二值是msg,有的時候咱們須要先判斷狀態,若true 就無論了,如果false再進一步處理.編程
這樣的場景下用函數返回多個值這個特性很容易搞定.原理其實就是函數返回了一個元組,而後把結果賦值給多個變量。bash
說到這裏,我穿插一個小技巧,個人時候咱們但願丟棄掉一些返回值,數據結構
咱們能夠用_搞定(用一個幾乎用不到的變量名,來做爲要丟棄的值的名稱)編程語言
python函數若你什麼都不return,默認返回None,很容易忽視這一點函數
有的同窗說我寫函數代碼,會記得加上None,可是有的時候返回None也會讓你誤解,很差處理,你不信咱們看下面一個例子:spa
緣由是當分子爲0的時候,計算結果爲0,那這個結果去作條件判斷時,會出現問題,會弄巧成拙。其實你返回None是有特殊意義的,是爲了判斷分母爲0.
解決這個問題有兩個辦法:第一個是把返回值拆成兩部分,返回一個元組,第一個元素是操做是否成功,第二個是運行結果,改爲以下:
第二個好的辦法是:根本不返回None,直接拋異常給上一級,使得調用者必須應對它,好咱們來改一下代碼看看:
#異常部分後面會講,valueError是異常中的一種,表示傳給函數的參數類型不正確
如今調用者就須要處理因輸入值無效而引起的異常,而不須要用條件語句去判斷函數的返回值,很是清晰並且不容易混淆.
python除了def語句以外,還提供了一中懶人專用的函數叫作lambda,有點LISP語言的風格
形式:
lambda arg1,arg2...argN:expression using arg
複製代碼
做爲一個表達式,常常在列表中或者函數中調用,可以出如今python語法不容許出現def的地方.此外作爲一個表達式lambda返回了一個值(新的函數),能夠選擇性的賦值給一個變量名。
lambda的主體簡單的就像放在def主體的return 裏的代碼同樣,寫成一個表達式,lambda一般比def功能要小,只能封裝一些有限的邏輯,lambda爲簡單任務而生,def則處理更大更復雜的任務.
對比一下吧:
在好比在排序對數據整理時常常用到:
最後一個花招是很具備迷惑性的,必定要看仔細,通常咱們在函數參數傳遞的時候,但願用一種非靜態的類型來做爲關鍵字的默認值,好比咱們常常會有打印日誌消息的函數:
奇怪兩條消息戳是同樣的,這是由於datetime.datetime.now()只執行了一次,也就是說在函數定義的時候執行了一次。參數的默認值會在每個模塊加載進來的時候求出,一旦這段模塊加載進來了,參數的默認值就很固定了,程序不會再出執行datetime.datetime.now()
是否是以爲很冤枉,
這裏有一個小技巧,在Python中若你想動態實現默認值,習慣把默認值改爲None,而後加一些註釋,看代碼吧:
如今兩條消息的時間戳就不一樣了,若是參數的實際默認值是可變類型,切記切記用None做爲形式上的默認值.
好了函數裏的小花招就講到這裏啦,但願能給初學者一些啓發,如有什麼不懂的,也能夠留言跟我探討交流.