日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python函數參數分類使用與新特性詳細分析講解_python

作者:楊jun堅 ? 更新時間: 2023-03-18 編程語言

函數參數看似很平常,在深究后發現其中還是有很多東西,參數分類、用法和新特性等,都可以體會到Python是真的靈活好用。

參數分類

一,定義與使用角度

形參:函數定義時定義的參數。

實參:函數調用時傳入的參數。

參數傳遞的過程,就是把實參的引用傳遞給形參,使用實參的值來執行函數體的過程,形參的定義決定了實參傳入方式。

def print_num(num):
    print(num)
a = 10
print_num(a)  # 實參引用傳遞給 形參 num

二,傳參方式角度

Python 傳參方式有兩種:

按位置順序傳參:調用時根據參數位置順序傳遞,包括位置參數、默認參數(缺省參數)和可變參數

按關鍵字傳參:調用時以“關鍵字=值”形式傳遞參數,包括關鍵字參數

1,位置參數

按照聲明時的位置順序關系依次傳遞參數,形參與實參的數量、順序、數據類型必須對應,否則報錯。

def locationParams(m,n):
    print('第一個參數',m)
    print('第一個參數',n)
locationParams(1,2)

2,默認參數

定義函數時,為某個參數賦予一個默認值,具有默認值的參數稱為默認參數

def defaultParams(m,n='xiaoming'):
    print('第一個參數',m)
    print('第一個參數',n)
defaultParams('Hello','xiaoli')
defaultParams('Hello') #未傳入默認參數
"""
第一個參數 Hello
第二個參數 xiaoli
第一個參數 Hello
第二個參數 xiaoming
"""

Tips:

(1)默認參數不能在非默認參數之前,Python 按照順序傳參,無法識別默認參數,聲明函數時,也會報錯:

SyntaxError: non-default argument follows default argument

def defaultParams(m='xiaoming',n):
    print('第一個參數',m)
    print('第二個參數',n)
defaultParams('Hello')  #Python 按照順序傳參,那么沒有實參會傳遞給形參n

(2)默認參數不能時可變參數,默認參數的值時固定的,如果是可變參數,則參數值會被修改。

def f(a,l=[]):
    l.append(a)
    return l
print(f(1))
print(f(2))
print(f(3))   
## 默認參數l為list,其對應的值也被修改了
"""
[1]
[1, 2]
[1, 2, 3]
"""

3,可變參數

可變參數是指參數個數是可以變化的,可以是0、1或多個,可變參數定義時符號“ * ” 表示。在函數調用時,可變參數接收的實參會被封裝成一個元組。

def variableParams(*params):
    print("參數: ",params)
    sum = 0
    for i in params:
        sum+=i
    print(sum)
variableParams()  # 不傳入參數
variableParams(1,2,3,4)  # 傳入多個參數
num_list = [1,2,3,4]
variableParams(*num_list) # num_list 加上“*” 將num_list拆解,否則num_list被當成一個參數傳入
variableParams(num_list[0],num_list[1]) 

"""
參數: ?() ? # 元組
0
參數: ?(1, 2, 3, 4) ?# 元組
10
參數: ?(1, 2, 3, 4) ? # 元組
10
參數: ?(1, 2)
3
"""

4,關鍵字參數

關鍵字參數與可變參數類似,參數的個數都是可變的,所以也被稱作可變關鍵字參數。

關鍵字參數與可變參數區別

(1)關鍵字參數會被封裝成一個字典,可變參數接收的實參會被封裝成一個元組。

(2)函數調用時,關鍵字參數以以“關鍵字=值”形式傳遞參數

def keyWordParams(**params):
    print(params)
keyWordParams()  ## 不傳參數
keyWordParams(name='xiaoming',age='11',gender='male')  ## 關鍵字傳參
person_info = {'name': 'xiapli', 'age': '20', 'gender': 'male'}
keyWordParams(**person_info)  # **person_info 將字典拆分
"""
{}
{'name': 'xiaoming', 'age': '11', 'gender': 'male'}
{'name': 'xiapli', 'age': '20', 'gender': 'male'}
"""

四類參數可以混合使用,但在聲明時,需要注意順序:位置參數、默認參數、可變參數和關鍵字參數。否則Python將無法正常解析。

三,參數新特性

1,僅位置參數

Python3.8 新特性中,新增了僅位置參數。**新的函數參數語法 使用 “ / ” 指明有些函數參數必須被指定為位置參數, 不能被用作關鍵字參數。 僅位置參數 在“ / ”之前,“ / ”之后可以是任意類型參數 **

def pos_only(a,/):
    print(a)
pos_only(1)  # 1
pos_only(a=1)  
# TypeError: pos_only() got some positional-only arguments passed as keyword arguments: 'a'

2,僅關鍵字參數(命名關鍵字參數)

與僅位置參數,對應的是僅關鍵字參數,不過并非Python3.8 新特性,僅關鍵字參數也被稱為命名關鍵字參數。聲明函數時,在第一個關鍵字形參前添加“ * ”,表明必須以關鍵字參數形式傳參。

def stu_info(name,gender,*,age,city):
    print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',city='BJ',age=10)

關鍵字參數和命名關鍵字參數的區別在于,前者可以傳遞任何名字的參數,而后者只能傳遞 后面名字的參數。

stu_info('Lucy','F',city='BJ',addr=10)
# stu_info() got an unexpected keyword argument 'addr'

如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個“ * ”了

#args可以傳遞一個tuple 其后只能傳遞age和city參數
def stu_info(name,gender,*args,age,city):
    print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
    for i in args:
        print('args:',i)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',(2,3),city='BJ',age=10)
"""
name is: Bob  gender is: M  age: 7  city: TJ
name is: Lucy  gender is: F  age: 10  city: BJ
args: (2, 3)
"""

最后幾個題目,大家可以測試下是否掌握:

def function1(a, b, c=0, *arg, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)
function1(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}
def function2(a,/, b, c=0, *arg, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)
function2(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}
def function3(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)  
function3(1,2,3,d=4,A=1,B=2)
# a = 1 b = 2 c = 3 d = 4 kw = {'A': 1, 'B': 2}
def function4(a, b, c=0, *arg, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'd =', d, 'kw =', kw)
function4(1,2,3,4,5,d=6,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) d = 6 kw = {'A': 1, 'B': 2}

原文鏈接:https://blog.csdn.net/yangjjuan/article/details/128731062

欄目分類
最近更新