python學習(二):函數

定義函數


  在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用return語句返回。如果沒有return語句,函數執行完畢後也會返回結果,只是結果爲None;return None可以簡寫爲return。

空函數


  如果想定義一個什麼事也不做的空函數,可以用pass語句:pass語句什麼都不做,那有什麼用?實際上pass可以用來作爲佔位符,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。


返回多個值

  Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值。


小結1:


定義函數時,需要確定函數名和參數個數;
如果有必要,可以先對參數的數據類型做檢查;
函數體內部可以用return隨時返回函數結果;
函數執行完畢也沒有return語句時,自動return None;
函數可以同時返回多個值,但其實就是一個tuple。


函數的參數


  除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數、命名關鍵字參數,使得函數定義出來的接口,不但能處理複雜的參數,還可以簡化調用者的代碼。


  1. 默認參數:最大的好處是能降低調用函數的難度。設置默認
參數時,有幾點要注意:
  必選參數在前,默認參數在後,否則Python的解釋器會報錯(思考一下爲什麼默認參數不能放在必選參數前面);
  如何設置默認參數:當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數;
  有多個默認參數時,調用的時候,既可以按順序提供默認參數;也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上;
  定義默認參數要牢記一點:默認參數儘量指向不變對象,避免不必要的副作用。
  2. 可變參數:就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。定義可變參數和定義一個list或tuple參數相比,僅僅在參數前面加了一個號,在函數內部,參數接收到的是一個tuple;可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple;Python允許你在list或tuple前面加一個號,把list或tuple的元素變成可變參數傳進去,注意參數接受到只是它們的一份拷貝。
  3. 關鍵字參數:允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict;Python允許你在dict前面加**號,轉化爲關鍵字參數,注意參數接受到只是它們的一份拷貝。
  4. 命名關鍵字參數:限制關鍵字參數的名字,和關鍵字參數*kw不同,命名關鍵字參數需要一個特殊分隔符後面的參數被視爲命名關鍵字參數;命名關鍵字參數必須傳入參數名,這和位置參數不同,如果沒有傳入參數名,調用將報錯;命名關鍵字參數可以有缺省值,從而簡化調用;使用命名關鍵字參數時,要特別注意,不是參數,而是特殊分隔符。如果缺少*,Python解釋器將無法識別位置參數和命名關鍵字參數.


參數組合


  在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用,除了可變參數無法和命名關鍵字參數混合。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數/命名關鍵字參數和關鍵字參數。如:
  function(a,b,c,*args,**kw)
   或者
  function(a,b,c,*,d,e,**kw)
  對於任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。


小結2:


       Python的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常複雜的參數。默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
       要注意定義可變參數和關鍵字參數的語法:
       *args是可變參數,args接收的是一個tuple;
       **kw是關鍵字參數,kw接收的是一個dict。
       使用args和**kw是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。命名的關鍵字參數是爲了限制調用者可以傳入的參數名,同時可以提供默認值。定義命名的關鍵字參數不要忘了寫分隔符,否則定義的將是位置參數。


遞歸函數


       在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。使用遞歸函數需要注意防止棧溢出。
       在計算機中,函數調用是通過棧stack這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
       使用遞歸函數的優點是邏輯簡單清晰,缺點是過深的調用會導致棧溢出。

發佈了53 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章