Python/函數

維基教科書,自由的教學讀本
跳至導覽 跳至搜尋

Python函數定義的通常格式為:

def 函数名(参数列表):
    #函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
    函数体
    #return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

Python中,對象有類型;變量僅僅是對象的一個引用,變量沒有類型。 string、tuple和 numbers 是不可更改的類型(immutable type),給它們的變量賦值其實是指向了新的對象;而 list,dict 等則是可以修改的類型(mutable type)。Python函數的參數傳遞

  • 不可變類型:類似 C語言的值傳遞。在函數內部「修改」參數的值,只是引用到另一個對象,不影響實參本身。
  • 可變類型:類似C++的引用傳遞,修改後函數外部的實參也會受影響

Python的函數參數可以使用:位置參數、不定長參數(使用元組表示)、命名實參。

  • 一個星號*為前綴的形參名字,對應於額外的位置參數組成的一個元組。「*」或者「*argu」右側只能是關鍵字形參與關鍵字實參。
  • 兩個星號*為前綴的形參名字,對應於額外的關鍵字參數組成的一個有序的字典。
  • 帶缺省值的參數,其右側直至*的參數都必須有缺省值。參數的缺省值在函數定義時從左至右求值。

嵌套函數(nested function),需要注意:

  • 內部函數可以讀寫訪問外部函數的可變(mutable)變量
  • 內部函數可以訪問外部函數的不可變(immutable)變量
  • 內部函數使用nonlocal關鍵字,可以讀寫訪問直接外部函數的不可變(immutable)變量
  • 內部函數訪問的外部函數的變量,可以定義在內部函數之後。

函數調用時,首先匹配所有位置參數,即使關鍵字參數更靠左也會稍後才處理。額外的未匹配的位置參數組成一個元組與*argus形參匹配。通常,不在一個函數同時使用*argus與**arugss,以免混淆。

閉包是指嵌套函數作為外部函數的返回值。因為函數是頭等對象,所以函數對象可以作為實參、返回值。嵌套函數可以使用外部函數的變量,即使外部函數已經運行結束了。例如

def adder(outer_argument): # outer function
  def adder_inner(inner_argument): # inner function, nested function
    return outer_argument + inner_argument # Notice outer_argument
  return adder_inner
add5 = adder(5) # a function that adds 5 to its argument
add7 = adder(7) # a function that adds 7 to its argument
print add5(3) # prints 8
print add7(3) # prints 10

匿名函數的語法如下:

 lambda 可选的形参表:expression

lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裡的參數。