1、定義一個函數
Python 定義函數使用 def 關鍵字,一般格式如下:
def 函數名(參數列表):
函數體
2、無返回值函數案例
- 定義一個無返回值的函數showResult
def showResult(s):
print("顯示:", s)
- 調用函數showResult
showResult("測試")
- 輸出結果
顯示: 數據
3、有返回值函數案例
- 定義一個有返回值的函數getResult
# 獲取結果函數
def getResult(num1, num2):
return num1 + num2
- 調用函數getResult
#其中str(int)是python自帶的轉換成字符串函數
print("返回結果:"+ str(getResult(10, 21)))
- 輸出結果
返回結果:31
4、引用類型與基本數據類型傳參的函數的案例
- 定義一個傳入不可變對象實例參數的函數changeBool
def changeBool(a):
a = True
print("changeBool函數內值:", a)
- 調用函數changeBool
b = False
changeBool(b)
print("changeBool函數外值:", b)
- 輸出結果
changeBool函數內值: True
changeBool函數外值: False
可以看到b的值並不會發生改變。
在看下面一個案例:
- 定義一個# 傳入可變對象實例參數的函數changeList
def changeList(val):
val.append(["1", "2", "3", "4"])
print("changeList函數內值:", val)
return
- 調用函數changeList
myList = ["5", "6"]
changeList(myList)
print("changeList函數外值:", myList)
- 輸出結果
changeList函數內值: ['5', '6', ['1', '2', '3', '4']]
changeList函數外值: ['5', '6', ['1', '2', '3', '4']]
可以看到myList 的值已經發生改變。
原因就在於基本類型和引用類型存儲區別
5、匿名函數
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。python 使用 lambda 來創建匿名函數。
- 定義一個有返回值的匿名函數sum
#求和
sum = lambda arg1, arg2: arg1 + arg2
- 調用函數getResult
#其中str(int)是python自帶的轉換成字符串函數
print("匿名函數求和計算結果:"+str(sum(15,12)))
- 輸出結果
匿名函數求和計算結果:27
6、靈活傳參方式的函數
調用函數時參數位置可以調換,只要調用時的參數命名與函數參數名一致即可自動對應,如showUserInfo;
可在方法的參數位置設置參數默認值如showUserInfo2,其中的age不傳時默認值爲18,傳參數age時,則爲age實際傳遞的值;
調用函數時,可以設置可設置不定長參數,如showAction。
# 不設置默認值函數
def showUserInfo(age, name):
print("年齡:" + str(age))
print("姓名:" + name)
return
# 設置默認值函數
def showUserInfo2(name, age=18):
print("年齡:" + str(age))
print("姓名:" + name)
return
# 不定長參數
def showAction(arg1,*vartuple):
print(arg1,end=",")
for var in vartuple:
print(var,end=",")
return
- 調用函數showUserInfo、showUserInfo2、showAction
print(" ")
showUserInfo(age=30, name="小明")
print(" ")
showUserInfo(name="小紅", age=40)
print(" ")
showUserInfo2(name="小黑");
print(" ")
showUserInfo2(name="小黑", age=2);
print("")
showAction("參數1","不定長參數1","不定長參數2","不定長參數3")
print("")
- 輸出結果
年齡:30
姓名:小明
年齡:40
姓名:小紅
年齡:18
姓名:小黑
年齡:2
姓名:小黑
參數1,不定長參數1,不定長參數2,不定長參數3,
7、完整代碼
# 顯示結果函數
def showResult(s):
print("顯示:", s)
# 獲取結果函數
def getResult(num1, num2):
return num1 + num2
# 傳入不可變對象實例參數
def changeBool(a):
a = True
print("changeBool函數內值:", a)
# 傳入可變對象實例參數
def changeList(val):
val.append(["1", "2", "3", "4"])
print("changeList函數內值:", val)
return
# 不設置默認值函數
def showUserInfo(age, name):
print("年齡:" + str(age))
print("姓名:" + name)
return
# 設置默認值函數
def showUserInfo2(name, age=18):
print("年齡:" + str(age))
print("姓名:" + name)
return
# 不定長參數
def showAction(arg1,*vartuple):
print(arg1,end=",")
for var in vartuple:
print(var,end=",")
return
#匿名函數 求和
sum = lambda arg1, arg2: arg1 + arg2
print("====開始執行====")
showResult("數據")
print("返回結果:"+ str(getResult(10, 21)))
b = False
changeBool(b)
print("changeBool函數外值:", b)
myList = ["5", "6"]
changeList(myList)
print("changeList函數外值:", myList)
# 這種方式傳參,參數名必須和方法參數名相同,否則不會輸出
changeList(val=["7", "8"])
print(" ")
# 變量名位置可以切換,只要保證與函數的變量名稱相同即可
showUserInfo(age=30, name="小明")
print(" ")
showUserInfo(name="小紅", age=40)
print(" ")
# 缺少參數時,會自動使用默認的參數
showUserInfo2(name="小黑");
print(" ")
# 有參數時,會自動使用傳遞的參數
showUserInfo2(name="小黑", age=2);
print("")
showAction("參數1","不定長參數1","不定長參數2","不定長參數3")
print("")
print("匿名函數求和計算結果:"+str(sum(15,12)))
print("====執行結束====")
8、總結
與Java相比函數的調用非常靈活,使用也並不複雜。
缺點是,可能出BUG的機率會比較大,所以要特別細心。