1.函數(shù)的簡介
- 函數(shù)也是一個對象
對象是內(nèi)存中專門用來存儲數(shù)據(jù)的一塊區(qū)域 - 函數(shù)用來保存一些可執(zhí)行的代碼,并且可以在需要時,對這些語句進行多次調(diào)用
語法
def 函數(shù)名 ([形參1,形參2,形參3......]):
代碼塊
注意:
函數(shù)名必須符合標識符的規(guī)范(可以包含字母、數(shù)字、下劃線但是不能以數(shù)字開頭)
print 是函數(shù)對象, **print() ** 是調(diào)用函數(shù)
2函數(shù)的參數(shù)
2.1形參和實參
形參(形式參數(shù))定義形參就相當于在函數(shù)內(nèi)部聲明了變量,但是并不是賦值
-
實參(實際參數(shù))指定了形參,那么再調(diào)用函數(shù)時必須傳遞實參,實參將會賦值給對應(yīng)的形參,,簡單來說有幾個形參就要有幾個實參
在定義函數(shù)的時候,可以在函數(shù)名后邊的括號中定義數(shù)量不等的形參,多個形參之間用 , 隔開
a,b是形參
1,3是實參
def sunAB(a,b) :
print(a+b)
sunAB(1,3)
輸出結(jié)果:
4
2.2函數(shù)的傳遞方式
- 定義形參時,可以為形參指定默認值.指定默認值以后,如果用戶傳遞了參數(shù),則默認值不會生效,如果用戶沒有傳遞,則默認值就會生效
- 位置參數(shù): 位置參數(shù)就是將對應(yīng)位置的實參賦值給對應(yīng)位置的形參
- 關(guān)鍵字參數(shù): 關(guān)鍵字參數(shù)可以不按照形參定義的順序去傳遞,而根據(jù)參數(shù)名進行傳遞
- 混合使用位置參數(shù)和關(guān)鍵參數(shù)時候必須將位置參數(shù)寫到關(guān)鍵字參數(shù)前面去
位置傳參
def fna(a,b):
print(a+b)
fna(2,3)
輸出結(jié)果:
5
**************************
關(guān)鍵字傳參
def fna(a=1,c=2,b=3):
print('a=',a)
print('b=',b)
print('c=',c)
fna()
輸出結(jié)果:
a= 1
b= 3
c= 2
**************************
混用(正確使用)
def fna(a,c=3,b=2):
print('a=',a)
print('b=',b)
print('c=',c)
fna(5)
輸出結(jié)果:
a= 5
b= 2
c= 3
*****************************
混用(錯誤使用)
#函數(shù)調(diào)用的時候,如果第一個參數(shù)使用了關(guān)鍵字綁定,后面的參數(shù)也必須使用關(guān)鍵字綁定!也就是位置參數(shù)必須寫到關(guān)鍵字參數(shù)前面
def fna(a=1,c=3,b):
print('a=',a)
print('b=',b)
print('c=',c)
fna(5)
輸出結(jié)果:
報錯:SyntaxError: non-default argument follows default argument
2.3可變對象
a = [1,2,3]
a[0]=10 #(改變對象里邊的value)
這個操作是在通過變量去修改對象的值,不會改變變量所指向的對象
a = [1,2,3]
a = [4,5,6]#(改變變量,改變對象里邊的value,同時還改變了id)
這個操作是在給變量重新賦值,會改變變量所指向的對象
舉個??
a = [1,2,3]
b=a
b[0]=10
print('a',a,id(a))
print('b',b,id(b))
輸出結(jié)果:
a [10, 2, 3] 140691446173056
b [10, 2, 3] 140691446173056
**************************************
a = [1,2,3]
b=a
b=[10,2,3]
print('a',a,id(a))
print('b',b,id(b))
輸出結(jié)果:
a [1, 2, 3] 140507735637696
b [10, 2, 3] 140507735644224
2.4實參的類型
- 可以是任意對象
def fn(a):
print('a=',a)
b=123
b=True
b=None
b='hello'
fn(b)
輸出結(jié)果分別是:
a= 123
a= True
a= None
a= hello
- 在函數(shù)中對形參重新賦值,不會影響其他變量
def fn(a):
# 在函數(shù)中對形參重新賦值,不會影響其他變量
a=10
print('a=',a)
c=20
fn(c)
print('c=',c)
輸出結(jié)果:
a= 10
c= 20
- 如果形參執(zhí)行的是一個對象,通過形參去修改對象的時候,會影響到所指向該對象的變量.
def fn(a):
#a和c指向的是同一個對象,a修改,c跟著修改
a[0]=10
print('a=',a,id(a))
c=[1,2,3]
fn(c)
print('c=',c,id(c))
輸出結(jié)果:
a= [10, 2, 3] 140484574711488
c= [10, 2, 3] 140484574711488
****************************************
如果要使2個獨立,各自修改各自的,如下
def fn(a):
a[0]=10
print('a=',a,id(a))
c=[1,2,3]
fn(c[:]) # fn(c.copy())也行
print('c=',c,id(c))
輸出結(jié)果:
a= [10, 2, 3] 140262443059200
c= [1, 2, 3] 140262444350848
3.不定長傳參
- 定義函數(shù)時,可以在形參前面加一個 * ,這樣這個形參可以獲取到所有的實參,他將會所有的實參保存在一個元組中
def s(*a):
print(a,type(a))
s(1,2,3)
輸出結(jié)果:
(1, 2, 3) <class 'tuple'>
- 帶 * 號的形參只能有一個,可以和其他參數(shù)配合使用
def s(a,b,*c):
print('a',a)
print('b',b)
print('c',c)
s(1,2,3,4,5,6)
輸出結(jié)果:
a 1
b 2
c (3, 4, 5, 6)
*****************************
def s(a,*b,c):
print('a',a)
print('b',b)
print('c',c)
s(1,2,3,4,5,6)
輸出結(jié)果報錯:
TypeError: s() missing 1 required keyword-only argument: 'c'
#如果帶星號的參數(shù)不在最后邊,后邊的參數(shù)必須以關(guān)鍵字傳參
s(1,2,3,4,5,c=6)
輸出結(jié)果:
a 1
b (2, 3, 4, 5)
c 6
****************************
帶 * 號的形參只能有一個
def s(*a,*b,c):
print('a',a)
print('b',b)
print('c',c)
s(1,2,3,b=4,5,c=6)
輸出結(jié)果報錯:
SyntaxError: invalid syntax
- *形參只能接受位置參數(shù),不能接受關(guān)鍵字參數(shù)
def s(*c):
print('a',a)
print('b',b)
print('c',c)
s(a=1,b=2)
輸出結(jié)果報錯:
TypeError: s() got an unexpected keyword argument 'a'
- ** 形參可以接受其他關(guān)鍵字參數(shù),他會將這些參數(shù)統(tǒng)一保存到字典中。字典的key就是參數(shù)的名字 ,字典的value就是參數(shù)的值。
- **形參只有一個,并且必須寫在所有參數(shù)的后邊
def s(a,**c):
print('a',a)
print('c',c)
s(1,b=2,c=3)
輸出結(jié)果:
a 1
c {'b': 2, 'c': 3}
************************************
def s(**a,c):
print('a',a)
print('c',c)
s(a=1,b=2,c=3)
輸出結(jié)果報錯:
SyntaxError: invalid syntax
4.參數(shù)的解包
- 傳遞實參時,也可以在序列類型的參數(shù)前添加星號,這樣他會自動將序列中的元素以此作為參數(shù)傳遞
- 要求序列中的元素的個數(shù)必須和形參的個數(shù)一致
def s(a,b,c):
print('a',a)
print('b',b)
print('c',c)
t=(10,20,30)
s(*t)
輸出結(jié)果:
a 10
b 20
c 30
*************************
def s(a,b,c):
print('a',a)
print('b',b)
print('c',c)
t = {'a':1,'b':2,'c':3}
s(**t)
輸出結(jié)果:
a 1
b 2
c 3