一文搞懂Python的函數傳參機制

大傢好,我是Peter~

最近寫瞭Python函數的功能,犯瞭一些錯誤。本文主要是梳理下Python函數的傳參機制,主要內容包含:

一、最簡單的函數(無返回值、參數)

def hello_python():
    print("hello python!")
hello_python()  # 直接調用

輸出:

hello python!

二、最簡單的函數(帶返回值、無參數)

def hello_python():
    data = "hello python!"
    return data  # data就是返回值
hello_python()

輸出:

'hello python!'

三、帶一個參數(無默認值)

def hello(data):
    result = "hello " + data 
    return result
hello("python")

輸出:

'hello python'

傳入另一個值:

hello("java")

輸出:

'hello java'

還可以在內部修改參數的信息:

def hello_name(name):
    result = "Hello " + name.title() + "!"
    return result
hello_name("tom")

'Hello Tom!'

hello_name("jack")

'Hello Jack!'

四、帶有多個參數(無默認值)

def information(name, age):
    data = "我叫" + name.title() + ", 今年" + str(age) + "歲"
    return data
information("tom", 23)

'我叫Tom, 今年23歲'

information("JACK", 18)

'我叫Jack, 今年18歲'

五、參數設置默認值(一個參數)

def hello_name(name="Peter"):
    result = "Hello " + name
    return result

如果不給參數具體的值,就使用默認值

hello_name()  

'Hello Peter'

給參數一個實際的值,比如下面的例子中Tom就是實際的值;這就是常說的實參

hello_name(name="Tom")  

'Hello Tom'

六、參數設置默認值(多個參數)

def information(name="Peter", age=20):
    data = "我是" + name + ", 今年" + str(age) + "歲"
    return data

1、全部使用默認值:

information()

'我是Peter, 今年20歲'

2、全部傳入實際的值:

information(name="Tom", age=27)

'我是Tom, 今年27歲'

3、隻傳入部分參數的實際值;未傳入的使用默認值:

information(name="Tom")

'我是Tom, 今年20歲'

information(age=18)

'我是Peter, 今年18歲'

七、部分參數使用默認值

默認值的參數一定要放在最後面;具有默認值的參數一定要放在最後面

def information(name, age=20):
    data = "我是" + name + ", 今年" + str(age) + "歲"
    return data
information("Peter")  # age默認使用20

'我是Peter, 今年20歲'

information(name="Peter")

'我是Peter, 今年20歲'

information("Peter", age=18)

'我是Peter, 今年18歲'

下面的方式直接報錯:

information(age=18, "Peter")  
  File "<ipython-input-26-2d03cd04a05a>", line 1
    information(age=18, "Peter")
                       ^
SyntaxError: positional argument follows keyword argument

information(age=18, name="Peter")  # age默認使用20

'我是Peter, 今年18歲'

重點:在函數必須先列出沒有默認值的形參,再列出有默認值的形參:

def information(age=20, name):
    data = "我是" + name + ", 今年" + str(age) + "歲"
    return data

  File "<ipython-input-28-d36363c3194c>", line 1
    def information(age=20, name):
                   ^
SyntaxError: non-default argument follows default argument

如何理解有默認值的參數一定要放在最後面?

下面自定義個get_name的函數,傳入第一個、最後一個和中間的名字,但是並不是每個人都有中間名字:

def get_name(first_name, last_name, middle_name=''):
    if middle_name:  # 如果存在中間名字
        name = first_name + middle_name + last_name
    else:
        name = first_name + last_name
        
    return name
get_name(first_name="張", last_name="飛", middle_name='')

'張飛'

get_name(first_name="孫", last_name="空", middle_name='悟')

'孫悟空'

如果不傳遞middle_name的結果肯定不是我們想要的:

get_name(first_name="孫", last_name="空")

'孫空'

八、位置實參

def get_information(name, age):
    data = "我是" + name + ", 今年" + str(age) + "歲"
    return data
get_information("Tom", 20)

'我是Tom, 今年20歲'

get_information("20","Tom")  # 一定要按照原來形參的順序傳遞

'我是20, 今年Tom歲'

上面的結果肯定不是我們想要的

九、關鍵字實參

當使用關鍵字傳遞實參的時候,和順序無關:

get_information(name="Tom", age=20)

'我是Tom, 今年20歲'

get_information(age=20, name="Tom")

'我是Tom, 今年20歲'

十、位置實參和關鍵字實參混合使用

get_information("Tom", age=20)

'我是Tom, 今年20歲'

在使用的時候還是要按照原函數中的順序,否則報錯:

get_information(age=20,"Tom")

  File "<ipython-input-39-bc20bc544493>", line 1
    get_information(age=20,"Tom")
                          ^
SyntaxError: positional argument follows keyword argument

十一、進階:*args使用

有時候我們實現並不知道函數需要接受多少個參數,這個時候可以通過*args或者**kwargs的用法來收集任意數量的參數。

先介紹*args的使用。假設我們想把一個班級中每個同學的身高都變成以米為單位,即除以100:

def height(*args):
    data = args 
    return data
height()

默認情況下函數收集到的是一個空元組:

()

height(178)

當傳入數據的時候,以元組的形式表示:

(178,)

height(178,189)

(178, 189)

def height(*args):
    for data in args:  # 對args中的元素進行循環操作
        print("身高是: {}m".format(data / 100))
height(189,180,167,172)  # 調用

身高是: 1.89m
身高是: 1.8m
身高是: 1.67m
身高是: 1.72m

十二、進階:**kwargs使用

**kwargs允許將不定長度的鍵值對,作為參數傳遞給一個函數

def information(**kwargs):
    data = kwargs
    print(data)

默認情況下收集的是字典:

 information(name="Peter")

{'name': 'Peter'}

information(name="Peter", age=23)

{'name': 'Peter', 'age': 23}

def information(**kwargs):
    for k, v in kwargs.items():
        print("{0} == {1}".format(k,v))
information(name="Peter")

name == Peter

information(name="Peter", age=23)

name == Peter
age == 23

information(name="Peter", age=23, height=175)

name == Peter
age == 23
height == 175

十三、進階:*args 和形參連用

def fun(x, *args):
    print("x:", x)
    print("args:", args)
fun(1)

x: 1
args: ()

fun(1,2)

x: 1
args: (2,)

fun(1,2,3,4)

x: 1
args: (2, 3, 4)

fun(1,2,3,4,"Peter")

x: 1
args: (2, 3, 4, 'Peter')

十四、進階:**kwargs 和形參連用

def fun(x, **kwargs):
    print("x:", x)
    print("kwargs:", kwargs)
fun(1)

x: 1
kwargs: {}

fun(1,name="Peter")

x: 1
kwargs: {'name': 'Peter'}

fun(1,name="Peter",age=23)

x: 1
kwargs: {'name': 'Peter', 'age': 23}

十五、進階:形參+*args+**kwargs連用

def fun(x, *args, **kwargs):
    print("x:", x)
    print("args:", args)
    print("kwargs:", kwargs)
fun(1)

x: 1
args: ()
kwargs: {}

fun(1,2,3)

x: 1
args: (2, 3)
kwargs: {}

fun(1,name="Peter",age=23)

x: 1
args: ()
kwargs: {'name': 'Peter', 'age': 23}

fun(1,2,3,name="Peter",age=23)

x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}
kwargs = {"name":"Peter","age":23}

fun(1,2,3,**kwargs)

x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}

以上就是一文搞懂Python的函數傳參機制的詳細內容,更多關於Python函數傳參機制的資料請關註WalkonNet其它相關文章!

推薦閱讀: