函數是對功能或者動作的封裝,它的主要目的是:最大化代碼重用和最小化代碼冗餘,以及對複雜過程的分解。
1:函數的定義與調用
在Python中使用如下的語法進行定義一個函數:
def name(arg1,arg2,... argN):
statements
return value
def語句是一條可執行的語句,當它運行的時候,會創建一個新的函數對象。並將它賦值給一個變量名(也就是函數名)。
def add(a,b): # 代碼執行到這裏時,創建了一個函數對象,並把它賦值給add
print('a=',a,' b=',b)
return a+b
# 函數調用:
print(add(1,3))
print(add('1','3'))
print(add([1,2,3,4],['abc','ert']))
2:函數的返回值
在Python中每個函數都有一個返回值,如果自己沒有顯式返回,函數默認返回None,其中函數返回值可以是任意類型的單個值,可以是任意類型的多個值。
# 1:返回默認值 None
def print_msg(s):
print(f'hello {s}')
ret = print_msg(111)
print(ret) # None
# 2:返回單個值
def add(a,b): # 代碼執行到這裏時,創建了一個函數對象,並把它賦值給add
print('a=',a,' b=',b)
return a+b
ret = add(1,3)
print(ret) # 返回4
ret = add('hello','ixusy88')
print(ret) # 返回 helloixusy88
# 3:返回多個值
def add(a,b): # 代碼執行到這裏時,創建了一個函數對象,並把它賦值給add
print('a=',a,' b=',b)
return a,b,a+b # 返回元組;也可以返回列表等其他類型數據
ret = add(1,3)
print(ret) # 返回4
ret = add('hello','ixusy88')
print(ret) # 返回 ('hello', 'ixusy88', 'helloixusy88')
# 也可以 使用序列賦值:
a,b,ret = add('hello','ixusy88')
print(a,b,ret ) # 輸出:hello ixusy88 helloixusy88
3:形參和實參
形參:在函數聲明的位置。 給出來的參數叫形參。 形式上的一個參數. 用一個變量來表示;
形參的分類
1. 位置參數 按照位置來聲明形參
2. 默認值參數, 當給參數傳遞值的時候,默認值不起作用; 不給值,默認值起作用.;保證你至少有個值能用
順序: 位置參數必須放在前面。 默認值參數必須放在後面
實參:在函數調用的時候,把實參的值賦值給形參的過程叫傳參;在函數調用的地方給出的具體的值叫實參. 實際參數;
實參的分類:
1. 位置參數.:按照位置, 給形參賦值;
2. 關鍵字參數:按照形參的名字給參數賦值;
3. 混合參數,:位置參數必須放在前面, 關鍵字參數放後面;
# 形參,定義函數的時候的參數:位置參數必須放在前面,默認值參數必須放在後面
def show_msg(name,age,sex='男'):
msg = f'name is {name}, age is {age},sex is {sex}. '
print(msg)
# 實參:調用函數的時候,實際給函數傳遞的值。
# 位置參數:按照定義的位置傳遞
show_msg('ixusy88',18)
# 關鍵字參數:使用默認值
show_msg(name='hahha',age=38)
# 關鍵字參數:不使用默認值
show_msg(name='hahha',age=38,sex='女')
# 混合參數:位置參數必須放在前面, 關鍵字參數放後面;
show_msg('混合參數hahha',age=38,sex='女')
4:參數傳遞
在Python中參數的傳遞其實就是賦值操作,是變量名給變量名賦值(即通過對象引用),其結果就是兩個變量指向了相同的對象:
# 不可變對象:
def func(a):
a = 200 # 這個的修改不會影響到外部
print('0-----:',id(a),a)
s = 100
func(s)
print('1-----:',id(s),s)
"""
輸出結果:
0-----: 1775928288 200
1-----: 1775925088 100
"""
print('*'*60)
# 可變對象:
def func_2(a):
a[0] = 100 # 這裏的修改會影響到外部的變量,因爲兩者都指向一個可變數據類型。
print('0-----:',id(a),a)
lst = [1,2,3]
print('1-----:',id(lst),lst)
func_2(lst)
print('2-----:',id(lst),lst)
"""
1-----: 2036762659272 [1, 2, 3]
0-----: 2036762659272 [100, 2, 3]
2-----: 2036762659272 [100, 2, 3]
"""