站長在線零基礎(chǔ)Python完全自學(xué)教程22:在Python中函數(shù)的參數(shù)傳遞
歡迎你來到站長學(xué)堂,學(xué)習(xí)站長在線出品的在線課程《零基礎(chǔ) Python完全自學(xué)教程》今天給大家分享的是第22課《在Python中函數(shù)的參數(shù)傳遞》。本文是一個(gè)大課程分成了下面5節(jié)小課程:在Python函數(shù)中理解形式參數(shù)和實(shí)際參數(shù)、在Python函數(shù)中參數(shù)傳遞的位置參數(shù)詳解、在Python函數(shù)中的關(guān)鍵字參數(shù)詳解、在Python函數(shù)中的默認(rèn)參數(shù)詳解、在Python函數(shù)中的可變參數(shù)詳解。
永久美國免備案虛擬主機(jī)1元1天,15元1月,100元1年,1000元永久
站長在線旗下答案網(wǎng)站,全站所有題目,免費(fèi)查看答案和答案解析
歡迎你來到站長學(xué)堂,學(xué)習(xí)站長在線出品的在線課程《零基礎(chǔ) python完全自學(xué)教程》今天給大家分享的是第22課《在Python中函數(shù)的參數(shù)傳遞》。本文是一個(gè)大課程分成了下面5節(jié)小課程:在Python函數(shù)中理解形式參數(shù)和實(shí)際參數(shù)、在Python函數(shù)中參數(shù)傳遞的位置參數(shù)詳解、在Python函數(shù)中的關(guān)鍵字參數(shù)詳解、在Python函數(shù)中的默認(rèn)參數(shù)詳解、在Python函數(shù)中的可變參數(shù)詳解。
22.1、在Python函數(shù)中理解形式參數(shù)和實(shí)際參數(shù)
歡迎你來到站長在線的站長學(xué)堂學(xué)習(xí)Python知識,本文學(xué)習(xí)的是《在Python函數(shù)中理解形式參數(shù)和實(shí)際參數(shù)》。本文的主要內(nèi)容有:Python中形式參數(shù)的概念和特點(diǎn),Python中實(shí)際參數(shù)的概念和特點(diǎn),實(shí)際參數(shù)的 值傳遞和引用傳遞。
我們在上一節(jié)課中,講到了函數(shù)的調(diào)用。在Python中調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系,這就是有參數(shù)的函數(shù)形式。函數(shù)參數(shù)的作用是傳遞數(shù)據(jù)給函數(shù)使用,函數(shù)利用接收的數(shù)據(jù)進(jìn)行具體的操作處理。函數(shù)參數(shù)在定義函數(shù)時(shí)放在函數(shù)名稱后面的一對小括號中:
def a (x):
其中,a是函數(shù)名,x是函數(shù)參數(shù)。
我們先來了解形式參數(shù)和實(shí)際參數(shù)
在使用函數(shù)時(shí),經(jīng)常會用到形式參數(shù)和實(shí)際參數(shù)。兩者都叫作參數(shù)。
22.1.1、Python中形式參數(shù)的概念和特點(diǎn)
概念:在定義函數(shù)時(shí),函數(shù)名后面括號中的參數(shù)為“形式參數(shù)”。
特點(diǎn):形式參數(shù)就是變量名。
如:def a(x) 其中x就是形式參數(shù)。
22.1.2、Python中實(shí)際參數(shù)的概念和特點(diǎn)
概念:在調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號中的參數(shù)為“實(shí)際參數(shù)”。也就是將函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)稱為實(shí)際參數(shù)。
特點(diǎn):實(shí)際參數(shù)就是變量值。
如:def a('python') 其中,python就是實(shí)際參數(shù)。
22.1.3、實(shí)際參數(shù)的值傳遞和引用傳遞。
根據(jù)實(shí)際參數(shù)的類型不同,可以分為:
22.1.3.1、將實(shí)際參數(shù)的值傳遞給形式參數(shù)。
22.1.3.2、將實(shí)際參數(shù)的引用傳遞給形式參數(shù)。
其中:
當(dāng)實(shí)際參數(shù)為不可變對象時(shí),進(jìn)行的是值傳遞;
當(dāng)實(shí)際參數(shù)為可變對象時(shí),進(jìn)行的是引用傳遞。
實(shí)際上,值傳遞和引用傳遞的基本區(qū)別就是:
進(jìn)行值傳遞后,改變形式參數(shù)的值,實(shí)際參數(shù)的值不變;
進(jìn)行引用傳遞后,改變形式參數(shù)的值,實(shí)際參數(shù)的值也一同改變。
例如,定義一個(gè)名稱為demo的函數(shù),然后為demo()函數(shù)傳遞一個(gè)字符串類型的變量作為參數(shù)(代表值傳遞),并在函數(shù)調(diào)用前后分別輸出該字符串變量,再為demo()函數(shù)傳遞一下列表類型的變量作為參數(shù)(代表引用傳遞),并在函數(shù)調(diào)用前后分別輸出該列表。 代碼如下:
#定義函數(shù)
def demo(obj):
print("原值:",obj)
obj += obj
#調(diào)用函數(shù)
print("=========值傳遞========")
mot="人生苦短,我用Pyhon。"
print("函數(shù)調(diào)用前:",mot)
demo(mot)
#采用不可變對象--字符串
print("函數(shù)調(diào)用后: ",mot)
print("=========引用傳遞========")
#采用 可變對象--列表
list1 =["優(yōu)雅","明確","簡單"]
print("函數(shù)調(diào)用前: ",list1)
demo(list1)
print("函數(shù)調(diào)用后: ",list1)
運(yùn)行代碼如下:
=========值傳遞========
函數(shù)調(diào)用前: 人生苦短,我用Pyhon。
原值: 人生苦短,我用Pyhon。
函數(shù)調(diào)用后: 人生苦短,我用Pyhon。
=========引用傳遞========
函數(shù)調(diào)用前: ['優(yōu)雅', '明確', '簡單']
原值: ['優(yōu)雅', '明確', '簡單']
函數(shù)調(diào)用后: ['優(yōu)雅', '明確', '簡單', '優(yōu)雅', '明確', '簡單']
>>>
從上面的執(zhí)行結(jié)果中可以看出,在進(jìn)行值傳遞時(shí),改變形式參數(shù)的值后,實(shí)際參數(shù)的值不改變;在進(jìn)行引用傳遞時(shí),改變形式參數(shù)的值后,實(shí)際參數(shù)的值也發(fā)生改變。
函數(shù)定義時(shí)參數(shù)列表中的參數(shù)就是形式參數(shù),而函數(shù)調(diào)用時(shí)傳遞進(jìn)來的參數(shù)就是實(shí)際參數(shù)。
就像劇本選主角一樣,劇本的角色相當(dāng)于形式參數(shù),而演角色的演員就相當(dāng)于實(shí)際參數(shù)。
22.2、在Python函數(shù)中參數(shù)傳遞的位置參數(shù)詳解
歡迎你來到站長在線的站長學(xué)堂學(xué)習(xí)Python知識,本文學(xué)習(xí)的是《在Python函數(shù)中參數(shù)傳遞的位置參數(shù)詳解》。本文的主要內(nèi)容有:實(shí)參和形參數(shù)量必須與定義時(shí)一致和實(shí)參和形參位置必須與定義時(shí)一致。
位置參數(shù),有時(shí)也稱必備參數(shù),指的是必須按照正確的順序?qū)?a href="http://003188.cn/tag/shijicanshu/" target="_blank">實(shí)際參數(shù)傳到函數(shù)中,換句話說,調(diào)用函數(shù)時(shí)傳入實(shí)際參數(shù)的數(shù)量和位置都必須和定義函數(shù)時(shí)保持一致。
22.2.1.實(shí)參和形參數(shù)量必須與定義時(shí)一致
在調(diào)用函數(shù)時(shí),指定的實(shí)際參數(shù)的數(shù)量必須與形式參數(shù)的數(shù)量一致,否則將拋出TypeError異常,提示缺少必要的位置參數(shù)。如:
#可寫函數(shù)說明
def printme( str ):
"打印任何傳入的字符串"
print (str)
return
# 調(diào)用 printme 函數(shù),不加參數(shù)會報(bào)錯(cuò)
printme()
運(yùn)行結(jié)果為:
Traceback (most recent call last):
File "D:\Python\Python310\Doc\000.py", line 8, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
>>>
22.2.2、實(shí)參和形參位置必須與定義時(shí)一致
在調(diào)用函數(shù)時(shí),指定的實(shí)際參數(shù)的位置必須與形式參數(shù)的位置一致,否則將產(chǎn)生以下兩種結(jié)果。
22.2.2.1、拋出TypeError異常
拋出異常的情況主要是因?yàn)閷?shí)際參數(shù)的類型與形式參數(shù)的類型不一致,并且在函數(shù)中,這兩種類型不能正常轉(zhuǎn)換。如:
def div (height,width):
return height*width/2
print(div("站長在線",3))
運(yùn)行結(jié)果:
Traceback (most recent call last):
File "D:\Python\Python310\Doc\000.py", line 3, in <module>
print(div("站長在線",3))
File "D:\Python\Python310\Doc\000.py", line 2, in div
return height*width/2
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>>
22.2.2.2、產(chǎn)生的結(jié)果與預(yù)期不符
站長在線提醒你:由于調(diào)用函數(shù)時(shí),傳遞的實(shí)際參數(shù)的位置與形式參數(shù)的位置不一致時(shí)并不會總是拋出異常,所以在調(diào)用函數(shù)時(shí)一定要確定好位置,否則產(chǎn)生Bug,還不容易被發(fā)現(xiàn)。
例如,設(shè)計(jì)一個(gè)求梯形面積的函數(shù),并利用此函數(shù)求上底為 4cm,下底為 8cm,高為 5cm 的梯形的面積。但如果交互高和下低參數(shù)的傳入位置,計(jì)算結(jié)果將導(dǎo)致錯(cuò)誤:
def area(upper_base,lower_bottom,height):
return (upper_base+lower_bottom)*height/2
print("正確結(jié)果為:",area(4,8,5))
print("錯(cuò)誤結(jié)果為:",area(4,5,8))
運(yùn)行結(jié)果為:
正確結(jié)果為: 30.0
錯(cuò)誤結(jié)果為: 36.0
>>>
22.3、在Python函數(shù)中的關(guān)鍵字參數(shù)詳解
歡迎你來到站長在線的站長學(xué)堂學(xué)習(xí)Python知識,本文學(xué)習(xí)的是《在Python函數(shù)中的關(guān)鍵字參數(shù)詳解》。本文的主要內(nèi)容有:關(guān)鍵字參數(shù)的含義和關(guān)鍵字參數(shù)的應(yīng)用舉例。
22.3.1、關(guān)鍵字參數(shù)的含義:
關(guān)鍵字參數(shù)是指使用形式參數(shù)的名字來確定輸入的參數(shù)值。
通過該方式指定實(shí)際參數(shù)時(shí),不再需要與形式參數(shù)的位置完全一致。只要將參數(shù)名寫正確即可。這樣可以避免用戶需要牢記參數(shù)位置的麻煩,使得函數(shù)的調(diào)用和參數(shù)傳遞更加靈活方便。
22.3.2、關(guān)鍵字參數(shù)的應(yīng)用舉例:
使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致,因?yàn)?Python 解釋器能夠用參數(shù)名匹配參數(shù)值。
例如:定義一個(gè)同學(xué)的語文,數(shù)學(xué),英語的成績,并且輸出他的成績,
#可寫函數(shù)說明
def chengji(yuwen,shuxue,yingyu):
"打印任何傳入的字符串"
print ("語文: ",yuwen)
print ("數(shù)學(xué): ",shuxue)
print ("英語: ",yingyu)
return
#調(diào)用chengji函數(shù)
chengji(shuxue=98,yingyu=90,yuwen=92)
運(yùn)行結(jié)果為:
語文: 92
數(shù)學(xué): 98
英語: 90
>>>
從上面的結(jié)果中可以看出,雖然在指定實(shí)際參數(shù)時(shí),順序與定義函數(shù)時(shí)不一致,但是運(yùn)行結(jié)果與預(yù)期是一致的。
22.4、在Python函數(shù)中的默認(rèn)參數(shù)詳解
歡迎你來到站長在線的站長學(xué)堂學(xué)習(xí)Python知識,本文學(xué)習(xí)的是《在Python函數(shù)中的默認(rèn)參數(shù)詳解》。本文的主要內(nèi)容有:默認(rèn)參數(shù)的概念和默認(rèn)參數(shù)的示例、默認(rèn)參數(shù)不能設(shè)置可變對象。
在調(diào)用函數(shù)時(shí)如果不指定某個(gè)參數(shù),Python 解釋器會拋出異常。為了解決這個(gè)問題,Python 允許為參數(shù)設(shè)置默認(rèn)值。
22.4.1、默認(rèn)參數(shù)的概念
默認(rèn)參數(shù)也叫參數(shù)的默認(rèn)值,即在定義函數(shù)時(shí),直接指定形式參數(shù)的默認(rèn)值。這樣,當(dāng)沒有傳入?yún)?shù)時(shí),則直接使用定義函數(shù)時(shí)設(shè)置的默認(rèn)值。
定義帶有默認(rèn)值參數(shù)的函數(shù)的語法格式如下:
def functionname(...,[parameter1 = defaultvalue1]):
[functionbody]
其中,相關(guān)參數(shù)說明如下:
functionname:函數(shù)名稱,在調(diào)用函數(shù)時(shí)使用;
parameter1 = defaultvalue1:可選參數(shù),用于指定向函數(shù)中傳遞的參數(shù),并且為該參數(shù)設(shè)置默認(rèn)值為defaultvalue1;
functionbody:可選參數(shù),用于指定函數(shù)體,即該函數(shù)被調(diào)用后,要執(zhí)行的功能代碼。
當(dāng)然,上面的內(nèi)容也可以使用中文說明:
def 函數(shù)名(...,形參名,形參名=默認(rèn)值):
代碼塊
站長在線特別提醒:在使用此格式定義函數(shù)時(shí),指定有默認(rèn)值的形式參數(shù)必須在所有沒默認(rèn)值參數(shù)的最后,否則會產(chǎn)生語法錯(cuò)誤。
22.4.2、默認(rèn)參數(shù)的示例
例如:定義一個(gè)同學(xué)的語文,數(shù)學(xué),英語的成績,并且輸出他的成績,
#可寫函數(shù)說明
def chengji(shuxue=98,yingyu=90,yuwen=92):
"打印任何傳入的字符串"
print ("語文: ",yuwen)
print ("數(shù)學(xué): ",shuxue)
print ("英語: ",yingyu)
return
#調(diào)用chengji函數(shù)
chengji(shuxue=100,yingyu=100,yuwen=100)
print("----------")
chengji(shuxue=80,yingyu=80)
運(yùn)行結(jié)果如下:
語文: 100
數(shù)學(xué): 100
英語: 100
----------
語文: 92
數(shù)學(xué): 80
英語: 80
>>>
從上面的運(yùn)行結(jié)果可以看出,我們對上面的成績定義了兩次,第一次全部定義為100分,結(jié)果顯示為100分,第二次定義了兩個(gè)80分的,有一個(gè)沒有定義,就調(diào)用了默認(rèn)參數(shù)了。
Pyhton 中,可以使用“函數(shù)名.__defaults__”查看函數(shù)的默認(rèn)值參數(shù)的當(dāng)前值,其返回值是一個(gè)元組。以本節(jié)中的 chengji() 函數(shù)為例,在最后一行代碼后面添加如下代碼:
print(chengji.__defaults__)
運(yùn)行以后,結(jié)果為:
語文: 100
數(shù)學(xué): 100
英語: 100
----------
語文: 92
數(shù)學(xué): 80
英語: 80
(98, 90, 92)
>>>
22.4.3、默認(rèn)參數(shù)不能設(shè)置可變對象
使用可變對象作為函數(shù)參數(shù)的默認(rèn)值時(shí),多次調(diào)用可能會導(dǎo)致意料之外的情況。例如,編寫一個(gè)名稱為demo()的函數(shù),并為其設(shè)置一個(gè)帶默認(rèn)值的參數(shù),代碼如下:
def demo(a=[]): # 定義函數(shù)并為參數(shù)a指定默認(rèn)值
print("a的值: ",a)
a.append(1)
調(diào)用demo()函數(shù),代碼如下:
def demo(a=[]): # 定義函數(shù)并為參數(shù)a指定默認(rèn)值
print("a的值: ",a)
a.append(1)
demo() # 調(diào)用demo()函數(shù)
將顯示以下結(jié)果:
a的值: []
連續(xù)兩次調(diào)用demo()函數(shù),并且都不指定實(shí)際參數(shù),代碼如下:
def demo(a=[]): # 定義函數(shù)并為參數(shù)a指定默認(rèn)值
print("a的值: ",a)
a.APPend(1)
demo() # 調(diào)用demo()函數(shù)
demo() # 調(diào)用demo()函數(shù)
將顯示以下結(jié)果:
a的值: []
a的值: [1]
>>>
從上面的結(jié)果看,這顯然不是我們想要的結(jié)果。為了防止出現(xiàn)這種情況,最好使用None作為可變對象的默認(rèn)值,這時(shí)還需要加上必要的檢查代碼。修改后的代碼如下:
def demo(a=None):
if a==None:
a=[]
print("a的值: ",a)
a.append(1)
demo()
demo()
運(yùn)行結(jié)果如下:
a的值: []
a的值: []
>>>
上面的問題,就告訴我們:定義函數(shù)時(shí),為形式參數(shù)設(shè)置默認(rèn)值要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不可變對象。
22.5、在Python函數(shù)中的可變參數(shù)詳解
歡迎你來到站長在線的站長學(xué)堂學(xué)習(xí)Python知識,本文學(xué)習(xí)的是《在Python函數(shù)中的可變參數(shù)》。本文的主要內(nèi)容有:可變參數(shù)的定義、帶一個(gè)星號*的可變參數(shù)和帶兩個(gè)星號**的可變參數(shù)。
我們在上一節(jié)內(nèi)容《在Python函數(shù)中的默認(rèn)參數(shù)詳解》中,提到了默認(rèn)參數(shù)不能設(shè)置可變對象。這一節(jié)內(nèi)容,我們就來專門講講可變參數(shù)。
22.5.1、可變參數(shù)的定義
可變參數(shù)也稱不定長參數(shù),即傳入函數(shù)中的實(shí)際參數(shù)可以是零個(gè)、一個(gè)、兩個(gè)甚至任意個(gè)。
定義可變參數(shù)時(shí),主要有兩種形式,一種是帶一個(gè)星號的*,另一種是帶兩個(gè)星號的**。下面分別進(jìn)行介紹。
22.5.2、帶一個(gè)星號*的可變參數(shù)
一個(gè)星號:函數(shù)可以接收任意個(gè)數(shù)的參數(shù),只需要在形參前面加一個(gè)*(星號),一個(gè)星號形參的函數(shù)會把多個(gè)位置參數(shù)值當(dāng)成元祖的形式傳入,也就是傳入的多個(gè)參數(shù)值可以在函數(shù)內(nèi)部進(jìn)行元祖遍歷。
例如,定義一個(gè)函數(shù),讓其可以接收多個(gè)實(shí)際參數(shù),代碼如下:
def kecheng(*jianzhan): # 定義輸出建站課程的函數(shù)
"打印任何傳入的參數(shù)"
print ("\n要學(xué)習(xí)的建站課程有: ")
for item in jianzhan:
print (item) # 輸出建站課程的內(nèi)容
# 調(diào)用kecheng 函數(shù)3次,分別指定不同多個(gè)實(shí)際參數(shù)
kecheng('html','CSS','JavaScript')
kecheng('php','mysql')
kecheng('Thinkphp')
運(yùn)行上面的代碼如下:
要學(xué)習(xí)的建站課程有:
html
css
javascript
要學(xué)習(xí)的建站課程有:
PHP
MySQL
要學(xué)習(xí)的建站課程有:
thinkphp
>>>
如果使用,一個(gè)已經(jīng)存在的列表作為函數(shù)的可變參數(shù),可以在列表的名稱前加“*”。例如下面的代碼:
def kecheng(*jianzhan): # 定義輸出建站課程的函數(shù)
"打印任何傳入的參數(shù)"
print ("要學(xué)習(xí)的建站課程有: ")
for item in jianzhan:
print (item) # 輸出建站課程的內(nèi)容
jianzhan = ['HTML','CSS','javaScript'] # 定義一個(gè)列表
kecheng(*jianzhan) # 通過列表指定函數(shù)的可變參數(shù)
運(yùn)行結(jié)果如下:
要學(xué)習(xí)的建站課程有:
HTML
CSS
JavaScript
>>>
22.5.3、帶兩個(gè)星號**的可變參數(shù)
兩個(gè)星號:形參前面加兩個(gè)*(星號),注意是兩個(gè)星號哦,兩個(gè)星號形參的函數(shù)會把關(guān)鍵字參數(shù)值當(dāng)成字典的形式傳入,在函數(shù)內(nèi)部會把關(guān)鍵字參數(shù)當(dāng)成字典在函數(shù)內(nèi)部進(jìn)行遍歷。
例如,定義一個(gè)函數(shù),讓其可以接收任意多個(gè)顯式賦值的實(shí)際參數(shù),代碼如下:
def chengji(**chengji): # 定義輸出課程和成績的函數(shù)
print () # 輸出一個(gè)空行
for key ,value in chengji.items(): # 遍歷字典
print(key,"的成績是:",value) # 輸出組合后的信息
調(diào)用兩次chengji()函數(shù),代碼如下:
def chengji(**chengji): # 定義輸出課程和成績的函數(shù)
print () # 輸出一個(gè)空行
for key ,value in chengji.items(): # 遍歷字典
print(key,"的成績是:",value) # 輸出組合后的信息
chengji(語文=92,數(shù)學(xué)=98,英語=90)
chengji(歷史=88,地理=90)
運(yùn)行結(jié)果如下:
語文 的成績是: 92
數(shù)學(xué) 的成績是: 98
英語 的成績是: 90
歷史 的成績是: 88
地理 的成績是: 90
>>>
同理,如果想要使用一個(gè)已經(jīng)存在的字典作為函數(shù)的可變參數(shù),可以在字典的名稱前加“**”。例如下面的代碼:
def chengji(**chengji): # 定義輸出課程和成績的函數(shù)
print () # 輸出一個(gè)空行
for key ,value in chengji.items(): # 遍歷字典
print(key,"的成績是:",value) # 輸出組合后的信息
dict1 = {'語文':92,'數(shù)學(xué)':98,'英語':90} # 定義一個(gè)字典
chengji(**dict1) # 通過字典指定函數(shù)的可變參數(shù)
上述代碼調(diào)用了chengji()函數(shù)后,運(yùn)行結(jié)果如下:
語文 的成績是: 92
數(shù)學(xué) 的成績是: 98
英語 的成績是: 90
>>>
到此為止,在Python中函數(shù)的參數(shù)傳遞中的在Python函數(shù)中理解形式參數(shù)和實(shí)際參數(shù)、在Python函數(shù)中參數(shù)傳遞的位置參數(shù)詳解、在Python函數(shù)中的關(guān)鍵字參數(shù)詳解、在Python函數(shù)中的默認(rèn)參數(shù)詳解、在Python函數(shù)中的可變參數(shù)詳解。就講解完畢了。
相關(guān)閱讀:
9、Python中運(yùn)算符的優(yōu)先級和條件表達(dá)式
11、Python中的選擇語句
13、Python中的break語句、continue語句和pass語句
15、Python中的列表
21、Python中函數(shù)的創(chuàng)建和調(diào)用
本文地址:http://003188.cn/pythonhanshudecanshuchuandi.html
阿里云虛擬主機(jī)1G空間,120元一年
香港、美國虛擬主機(jī)100元一年,1000元永久
騰訊云雙十一0.4折起,2核8G5M三年僅700元,2核4G8M三年僅198元
猜你喜歡