python菜鳥教程學習9:函數

函數的定義

  函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。python提供了很多內建函數,但我們依然可以自己創建函數,叫做用戶自定義函數。

自定義函數

  你可以定義一個由自己想要功能的函數,以下是簡單的規則:

  • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
  • 函數內容以冒號 : 起始,並且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的 return 相當於返回 None。
def 函數名(參數列表):
    函數體

函數調用

  函數的基本結構完成以後,你可以通過另一個函數調用執行,也可以直接從 Python 命令提示符執行。

參數傳遞

  在 python 中,類型屬於對象,變量是沒有類型的,變量沒有類型,她僅僅是一個對象的引用(一個指針),可以是指向 List 類型對象,也可以是指向 String 類型對象。

可更改(mutable)與不可更改(immutable)對象

  • 在python中,不可變類型string,tuple,number是不可更改的對象對於同一個標籤名字的賦值,實際上是生成一個新的值對象,再讓變量指向這個對象。而可變對象list,dict等則是將元素值更改本身並沒有動。
  • 對於python中的函數的參數傳遞,不可變類型,傳遞的只是一個變量的值,並內有影響對象本身,但是如果是傳遞可變類型那就是實現了值傳遞,是真正的傳過去。

參數

  必需就是啥也沒有,關鍵字就是標識哪個對應哪個,默認就是有默認值

  • 必需參數:以正確的順序傳入函數,調用時的數量必須和聲明時的一樣。
  • 關鍵字參數:函數調用使用關鍵字參數來確定傳入的參數值,使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為解釋器能夠用參數名匹配參數值。
  • 默認參數:調用函數時如果沒有傳遞參數則會使用默認參數
  • 不定長參數:有時候函數需要能處理比聲明時更多的參數,這些參數叫做不定長參數
    • 加了星號 * 的參數會以元組(tuple)的形式導入,存放所有未命名的變量參數。
def functionname([formal_args,] *var_args_tuple ):
   "函數_文檔字符串"
   function_suite
   return [expression]
    • 還有一種就是參數帶兩個星號 **,加了兩個星號 ** 的參數會以字典的形式導入,基本語法如下:
def functionname([formal_args,] **var_args_dict ):
   "函數_文檔字符串"
   function_suite
   return [expression]
    • 聲明函數時,參數中星號 * 可以單獨出現,如果單獨出現星號 * 後的參數必須用關鍵字傳入。

匿名函數

  python 使用 lambda 來創建匿名函數。所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。

  • lambda 只是一個表達式,函數體比 def 簡單很多。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數。
  • 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。

Return語句

  return用於退出函數,選擇性的調用方法返回一個表達式,不帶參數值的return返回None。

強制位置參數

  Python3.8 新增了一個函數形參語法 / 用來指明函數形參必須使用指定位置參數,不能使用關鍵字參數的形式。

  在以下的例子中,形參 a 和 b 必須使用指定位置參數,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求為關鍵字形參:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)