Python之函數(shù)一

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容