一文搞懂Python的函數(shù)傳參機(jī)制
大家好,我是Peter~
最近寫了Python函數(shù)的功能,犯了一些錯誤。本文主要是梳理下Python函數(shù)的傳參機(jī)制,主要內(nèi)容包含:

一、最簡單的函數(shù)(無返回值、參數(shù))
def hello_python():
print("hello python!")
hello_python() # 直接調(diào)用
輸出:
hello python!
二、最簡單的函數(shù)(帶返回值、無參數(shù))
def hello_python():
data = "hello python!"
return data # data就是返回值
hello_python()
輸出:
'hello python!'
三、帶一個參數(shù)(無默認(rèn)值)
def hello(data):
result = "hello " + data
return result
hello("python")
輸出:
'hello python'
傳入另一個值:
hello("java")
輸出:
'hello java'
還可以在內(nèi)部修改參數(shù)的信息:
def hello_name(name):
result = "Hello " + name.title() + "!"
return result
hello_name("tom")
'Hello Tom!'
hello_name("jack")
'Hello Jack!'
四、帶有多個參數(shù)(無默認(rèn)值)
def information(name, age):
data = "我叫" + name.title() + ", 今年" + str(age) + "歲"
return data
information("tom", 23)
'我叫Tom, 今年23歲'
information("JACK", 18)
'我叫Jack, 今年18歲'
五、參數(shù)設(shè)置默認(rèn)值(一個參數(shù))
def hello_name(name="Peter"):
result = "Hello " + name
return result
如果不給參數(shù)具體的值,就使用默認(rèn)值
hello_name()
'Hello Peter'
給參數(shù)一個實(shí)際的值,比如下面的例子中Tom就是實(shí)際的值;這就是常說的實(shí)參
hello_name(name="Tom")
'Hello Tom'
六、參數(shù)設(shè)置默認(rèn)值(多個參數(shù))
def information(name="Peter", age=20):
data = "我是" + name + ", 今年" + str(age) + "歲"
return data
1、全部使用默認(rèn)值:
information()
'我是Peter, 今年20歲'
2、全部傳入實(shí)際的值:
information(name="Tom", age=27)
'我是Tom, 今年27歲'
3、只傳入部分參數(shù)的實(shí)際值;未傳入的使用默認(rèn)值:
information(name="Tom")
'我是Tom, 今年20歲'
information(age=18)
'我是Peter, 今年18歲'
七、部分參數(shù)使用默認(rèn)值
默認(rèn)值的參數(shù)一定要放在最后面;具有默認(rèn)值的參數(shù)一定要放在最后面
def information(name, age=20):
data = "我是" + name + ", 今年" + str(age) + "歲"
return data
information("Peter") # age默認(rèn)使用20
'我是Peter, 今年20歲'
information(name="Peter")
'我是Peter, 今年20歲'
information("Peter", age=18)
'我是Peter, 今年18歲'
下面的方式直接報(bào)錯:
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默認(rèn)使用20
'我是Peter, 今年18歲'
重點(diǎn):在函數(shù)必須先列出沒有默認(rèn)值的形參,再列出有默認(rèn)值的形參:
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
如何理解有默認(rèn)值的參數(shù)一定要放在最后面?
下面自定義個get_name的函數(shù),傳入第一個、最后一個和中間的名字,但是并不是每個人都有中間名字:
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的結(jié)果肯定不是我們想要的:
get_name(first_name="孫", last_name="空")
'孫空'
八、位置實(shí)參
def get_information(name, age):
data = "我是" + name + ", 今年" + str(age) + "歲"
return data
get_information("Tom", 20)
'我是Tom, 今年20歲'
get_information("20","Tom") # 一定要按照原來形參的順序傳遞
'我是20, 今年Tom歲'
上面的結(jié)果肯定不是我們想要的
九、關(guān)鍵字實(shí)參
當(dāng)使用關(guān)鍵字傳遞實(shí)參的時候,和順序無關(guān):
get_information(name="Tom", age=20)
'我是Tom, 今年20歲'
get_information(age=20, name="Tom")
'我是Tom, 今年20歲'
十、位置實(shí)參和關(guān)鍵字實(shí)參混合使用
get_information("Tom", age=20)
'我是Tom, 今年20歲'
在使用的時候還是要按照原函數(shù)中的順序,否則報(bào)錯:
get_information(age=20,"Tom")
File "<ipython-input-39-bc20bc544493>", line 1
get_information(age=20,"Tom")
^
SyntaxError: positional argument follows keyword argument
十一、進(jìn)階:*args使用
有時候我們實(shí)現(xiàn)并不知道函數(shù)需要接受多少個參數(shù),這個時候可以通過*args或者**kwargs的用法來收集任意數(shù)量的參數(shù)。
先介紹*args的使用。假設(shè)我們想把一個班級中每個同學(xué)的身高都變成以米為單位,即除以100:
def height(*args):
data = args
return data
height()
默認(rèn)情況下函數(shù)收集到的是一個空元組:
()
height(178)
當(dāng)傳入數(shù)據(jù)的時候,以元組的形式表示:
(178,)
height(178,189)
(178, 189)
def height(*args):
for data in args: # 對args中的元素進(jìn)行循環(huán)操作
print("身高是: {}m".format(data / 100))
height(189,180,167,172) # 調(diào)用
身高是: 1.89m
身高是: 1.8m
身高是: 1.67m
身高是: 1.72m
十二、進(jìn)階:**kwargs使用
**kwargs允許將不定長度的鍵值對,作為參數(shù)傳遞給一個函數(shù)
def information(**kwargs):
data = kwargs
print(data)
默認(rèn)情況下收集的是字典:
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
十三、進(jìn)階:*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')
十四、進(jìn)階:**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}
十五、進(jìn)階:形參+*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的函數(shù)傳參機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于Python函數(shù)傳參機(jī)制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Python中使用MongoEngine操作數(shù)據(jù)庫教程實(shí)例
這篇文章主要介紹了在Python中使用MongoEngine操作數(shù)據(jù)庫教程實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Python閉包之返回函數(shù)的函數(shù)用法示例
這篇文章主要介紹了 Python閉包之返回函數(shù)的函數(shù)用法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
python讀取與處理netcdf數(shù)據(jù)方式
今天小編就為大家分享一篇python讀取與處理netcdf數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python使用BeautifulSoup庫解析HTML基本使用教程
這篇文章主要介紹了Python使用BeautifulSoup庫解析HTML基本使用教程,文中主要對其適合于制作爬蟲方面的特性進(jìn)行了解析,需要的朋友可以參考下2016-03-03
詳解Django-restframework 之頻率源碼分析
這篇文章主要介紹了Django-restframework 之頻率源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Python爬蟲爬取博客實(shí)現(xiàn)可視化過程解析
這篇文章主要介紹了Python爬蟲爬取博客實(shí)現(xiàn)可視化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Python實(shí)現(xiàn)獲取亂序列表排序后的新下標(biāo)的示例
本文主要介紹了Python實(shí)現(xiàn)獲取亂序列表排序后的新下標(biāo)的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

