溫馨提示:
本文僅限參考,因爲每個人理解的函數意思都不一樣。
python中函數定義:函數是邏輯結構化和過程化的一種編程方法
python中函數定義方法:
def test(x):
"The function definitions"
x+=1
return x
def:定義函數的關鍵字
test:函數名
():內可定義形參
"":文檔描述(非必要,但是強烈建議爲你的函數添加描述信息)
x+=1:泛指代碼塊或程序處理邏輯
return:定義返回值
調用運行:可以帶參數也可以不帶
函數名()
使用函數的好處:
1.代碼重用
2.保持一致性,易維護
3.可擴展性
函數和過程:
過程定義:過程就是簡單特殊沒有返回值的函數
這麼看來我們在討論爲何使用函數的的時候引入的函數,都沒有返回值,沒有返回值就是過程,沒錯,但是在python中有比較神奇的事情
def test01():
msg = 'hello The little green frog'
print (msg)
def test02():
msg = 'hello WuDaLang'
return msg
t1 = test01()
t2 = test02()
print ('from test01 return is [%s]' % t1)
print ('from test02 return is [%s]' % t2)
當一個函數/過程沒有使用return顯示的定義返回值時,python解釋器會直接返回爲None,所以在python中即便是過程也可以算作函數。
def test1():
pass
# 補充:
# pass:指空代碼,無意義,僅僅用於表示代碼塊
def test02():
return 0,10,'hello',['alex','server'],{'sb':'lb'}
t1=test1()
t2=test2()
print ('from test1 return is [%s]: ' %type(t1),t1)
print ('from test2 return is [%s]: ' %type(t2),t2)
補充:
返回值數=0:返回None
返回值數=1:返回object
返回值數>1:返回tuple
函數參數:
形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量
實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳 送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
def text(x, y):
# 形參(x, y)
'''
:param x:整型數字
:return: 返回計算結果
'''
res = x ** y
return res
# 常量
text(2,3)
# 實參
a = 2
b = 3
c = text(a,b)
print(c)
一、位置參數
調用函數時根據函數定義的參數位置來傳遞參數
def text(x, y):
print(x)
print(y)
# 位置參數,實參與形參位置一一對應
text(1, 2)
二、關鍵字參數
位置參數必須在關鍵字參數的前面,但關鍵字參數之間不存在先後順序的
def text(x,y,z):
print(x)
print(y)
print(z)
# 關鍵字參數,位置無需固定
text(x=1,y=3,z=2)
三、位置參數與關鍵字參數混合使用
def test(x,y,z):
print(x)
print(y)
print(z)
# 位置參數一定要在關鍵字參數左邊
test(1,y=2,z=3)
四、默認參數
'''
默認參數,爲參數提供默認值,調用函數時可傳可不傳該默認參數的值
'''
# 位置參數一定要在默認參數左邊否則報錯
def handle(x, type="world"):
print(x)
print(type)
handle(x=1,type='type')
# 錯誤:錯誤的定義方式
# def handle(age=1,x):
# 錯誤: 注意不能這樣寫,type參數就變成位置參數了,沒有什麼意義了
# handle('hello',type)
五、可變參數
1、包裹位置參數
'''
*args將實參中按照位置傳值,把多出來的值都給args,args收集起來,合併一個元祖(tuple)的方式呈現
'''
# 參數組(不固定長度參數):*列表 **字典
def text(x, *args):
print(x)
print(args)
# 以元組形式展示
text(1, 1, 2, 3)
2、包裹關鍵字參數
'''
**kwargs將實參按照關鍵字傳值,把多餘的值給kwargs,kwargs收集起來,合併一個字典(dict)的方式呈現
'''
# *args只能處理位置參數,關鍵字參數不能用*args,需要通過**kwargs來處理
test(1,y=2,z=3)
def test(x,**kwargs):
print(x)
print(kwargs)
# 以字典形式展示
test(1,y=2,z=3)
# 錯誤:z=3一個參數不能傳兩個值,否則報錯
# test(1,y=2,z=3,z=3)
六、解包裹參數
*和**,也可以在函數調用的時候使用,稱之爲解包裹(unpacking)
1、在傳遞列表或字典時,讓的每一個元素對應相應的位置參數
def test(x, *args):
print(x)
# 列表索引取值
print(args[0][0])
# 字典鍵值對取值
print(args[0]['y'])
# 轉化
print(args)
# 列表
test(1, [1, 2, 3])
# 字典
test(1,{'y':'z'})
# 列如把列表或字典以元組的形式展示,只需要在列表或字典前面加上*
test(1,*[2,3,4,4])
test(1,*{'key':'value','key2':'value'})
2、在傳遞詞典字典時,讓詞典的每個鍵值對作爲一個關鍵字參數傳遞給函數
def test(x,**kwargs):
print(x)
# 通過索引取值
print(kwargs)
test(1,**{'key':'value'})
錯誤:需要在上**如果不加上**則報錯
TypeError: test() takes 1 positional argument but 2 were given
七、*args與**kwargs混合使用
補充:def 函數名(x,**kwargs,*args)不能這樣寫,函數要按照python所支持規定來定義函數(def 函數名(x,*args,*kwargs))
def test(x,*args,**kwargs):
print(x)
# 通過索引取值
print(args,args[1])
# 通過字典的key取字典的value
print(kwargs,kwargs['key'])
# 通過get獲取字典的value
print(kwargs,kwargs.get('key'))
test(1,*[1,2,3],**{'key':1})
八、位置參數、默認參數、可變參數的混合使用
基本原則:先位置參數,包裹位置,默認參數,包裹關鍵字(定義和調用都應遵循)
def func(x,*args,type='age',**kwargs):
print(x)
print(args)
print(type)
print(kwargs)
func(1,3,4,1,4,1,type='name',y=2,z=3)