函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。
自定義函數
1. 規則:
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號起始,並且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
2. 語法:
def functionname( parameters ):
"函數_文檔字符串"
function_suite
return [expression]
3. 實例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
n = my_abs(-20)
print(n)
x, y = move(100, 100, 60, math.pi / 6)
print(x, y)
# TypeError: bad operand type:
my_abs('123')
函數返回值
return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的 return 語句返回 None。
實例:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 可寫函數說明
def sum( arg1, arg2 ):
# 返回2個參數的和."
total = arg1 + arg2
print ("函數內 : ", total)
return total
# 調用sum函數
total = sum( 10, 20 )
print ("函數外 : ", total)
函數參數
以下是調用函數時可使用的正式參數類型:
- 必需參數
- 關鍵字參數
- 默認參數
- 不定長參數
- 必需參數
必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
#!/usr/bin/python3
#可寫函數說明
def printme( str ):
"打印任何傳入的字符串"
print (str)
return
# 調用 printme 函數,不加參數會報錯
printme()
- 關鍵字參數
關鍵字參數和函數調用關係緊密,函數調用使用關鍵字參數來確定傳入的參數值。
#!/usr/bin/python3
#可寫函數說明
def printme( str ):
print (str)
return
#調用printme函數
printme( str = "hello world")
- 默認參數
調用函數時,如果沒有傳遞參數,則會使用默認參數。
#!/usr/bin/python3
#可寫函數說明
def printinfo( name, age = 35 ):
print ("名字: ", name)
print ("年齡: ", age)
return
#調用printinfo函數
printinfo( name="runoob" )
- 不定長參數
你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,基本語法如下:
def functionname([formal_args,] *var_args_tuple ):
"函數_文檔字符串"
function_suite
return [expression]
匿名函數
python 使用 lambda 來創建匿名函數,也就是不再使用 def 語句這樣標準的形式定義一個函數。
- 特點:
- lambda 只是一個表達式,函數體比 def 簡單很多。
- lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
- 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
- 基本語法
lambda [arg1 [,arg2,.....argn]]:expression
- 實例
#!/usr/bin/python3
# 可寫函數說明
sum = lambda arg1, arg2: arg1 + arg2
# 調用sum函數
print ("相加後的值爲 : ", sum( 10, 20 ))
print ("相加後的值爲 : ", sum( 20, 20 ))
遞歸函數
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
舉個例子,我們來計算階乘n! = 1 x 2 x 3 x … x n,用函數fact(n)表示,可以看出:
fact(n)=n!=1 x 2 x 3 x ··· x n=(n-1)! x n=fact(n−1)×n
def fact(n):
if n==1:
return 1
return n * fact(n - 1)