了解Python調(diào)用函數(shù)
哈嘍,大家好,我是了不起。今天給大家?guī)韕ython調(diào)用函數(shù)。
一、定義函數(shù)與調(diào)用函數(shù)的順序
函數(shù)被定義后,本身是不會自動(dòng)執(zhí)行的,只有在被調(diào)用后,函數(shù)才會被執(zhí)行,得到相應(yīng)的結(jié)果。但是在 Python 中我們要注意一個(gè)關(guān)鍵點(diǎn),就是Python不允許前向引用,即在函數(shù)定義之前,不允許調(diào)用該函數(shù)。
例如:
print plus(1,2)
def plus(a,b):
return a+b
運(yùn)行結(jié)果為:
NameError: name 'plus' is not defined
從報(bào)錯(cuò)結(jié)果可以看出,名字為plus的函數(shù)還沒進(jìn)行定義(雖然我們是在后面進(jìn)行了定義)。所以當(dāng)我們在調(diào)用函數(shù)時(shí),一定要確定在調(diào)用之前進(jìn)行了函數(shù)定義。
二、正確使用參數(shù)
我們要在調(diào)用函數(shù)時(shí),需要正確調(diào)用函數(shù)的名稱和參數(shù),例如我們定義了一個(gè)加法函數(shù):
def plus(a,b):
return a+b
我們在調(diào)用plus()函數(shù)時(shí),如果傳入的參數(shù)類型不對,會報(bào)TypeError錯(cuò)誤。而且有時(shí)我們傳入的參數(shù)類型不是規(guī)定類型的話,就算調(diào)用函數(shù)運(yùn)行結(jié)果沒有報(bào)錯(cuò),也會產(chǎn)生邏輯錯(cuò)誤。
例如:
# 定義plus函數(shù),作用是求兩個(gè)正整數(shù)之和
def plus(a,b):
return a+b
# 調(diào)用plus函數(shù),參數(shù)類型為'1','2'
print(plus('1','2'))
輸出結(jié)果:
12
雖然上述例子的程序運(yùn)行結(jié)果沒有報(bào)錯(cuò),但是結(jié)果卻與我們的預(yù)期不符,因?yàn)槲覀兊谋疽馐钦{(diào)用plus()加粗樣式函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的加法。但是如果我們傳入的是字符串類型的數(shù)值時(shí),結(jié)果就是兩個(gè)字符串的拼接。所以這個(gè)例子告訴我們一定要注意傳入?yún)?shù)的類型。當(dāng)我們傳入正常類型的參數(shù)時(shí),傳入的參數(shù)個(gè)數(shù)不一致時(shí),也會報(bào)TypeError錯(cuò)誤。
例如:
# 定義plus函數(shù),作用是求兩個(gè)正整數(shù)之和
def plus(a,b):
return a+b
# 調(diào)用plus函數(shù),參數(shù)為1,2,3
print(plus(1,2,3))
報(bào)錯(cuò):
TypeError: plus() takes 2 positional arguments but 3 were given
報(bào)錯(cuò)原因顯示,因?yàn)閜lus()函數(shù)允許有且僅有2個(gè)參數(shù),但是卻在調(diào)用時(shí)傳入了3個(gè)參數(shù),所以程序報(bào)錯(cuò)。
三、函數(shù)與函數(shù)之間的調(diào)用
1. 第一種情況 程序代碼如下:
def x(f):
def y():
print(1)
return y
def f():
print(2)
x(f)
運(yùn)行結(jié)果:
無結(jié)果
分析:因?yàn)榈?行中的x(f)中的f沒有帶括號,f只是一個(gè)普通的參數(shù),所以程序只調(diào)用執(zhí)行了x(f)函數(shù),沒有調(diào)用執(zhí)行f()函數(shù)。x(f)函數(shù)中雖然也定義了y()函數(shù),但是x(f)函數(shù)中沒有調(diào)用執(zhí)行y()函數(shù),只是執(zhí)行了return y。而y變量也沒有值,所以整個(gè)程序的返回值就為無結(jié)果。
2. 第二種情況 程序代碼如下:
def x(f):
def y():
print(1)
return y
def f():
print(2)
x(f())
運(yùn)行結(jié)果:
2
分析:因?yàn)榈?行中的x(f())中的f()帶括號,所以程序先調(diào)用執(zhí)行f()函數(shù),先輸出2。然后2作為參數(shù)傳入到x(f)函數(shù)中,程序開始調(diào)用執(zhí)行x(f)函數(shù)。x(f)函數(shù)中雖然也定義了y()函數(shù),但是x(f)函數(shù)中沒有調(diào)用執(zhí)行y()函數(shù),只是執(zhí)行了return y。而y變量也沒有值,所以調(diào)用執(zhí)行x(f)函數(shù)沒有產(chǎn)生任何結(jié)果。因此該程序最終只輸出了2。
3. 第三種情況 程序代碼如下:
def x(f):
def y():
print(1)
return y()
def f():
print(2)
x(f)
運(yùn)行結(jié)果:
1
分析:因?yàn)榈?行中的x(f)中的f沒有帶括號,f只是一個(gè)普通的參數(shù),所以程序只調(diào)用執(zhí)行了x(f)函數(shù),沒有調(diào)用執(zhí)行f()函數(shù)。x(f)函數(shù)中也定義了y()函數(shù),并且返回是y()函數(shù)。因此程序調(diào)用執(zhí)行了y()函數(shù),輸出結(jié)果是1。
4. 第四種情況
def x(f):
def y():
print(1)
return y()
def f():
print(2)
x(f())
運(yùn)行結(jié)果:
2
1
分析:因?yàn)榈?行中的x(f())中的f()帶括號,所以程序調(diào)用執(zhí)行了f()函數(shù),先輸出2。然后2作為參數(shù)傳入到x(f)函數(shù)中,程序開始調(diào)用執(zhí)行x(f)函數(shù)。x(f)函數(shù)中也定義了y()函數(shù),并且返回是y()函數(shù)。因此程序也調(diào)用執(zhí)行了y()函數(shù),也輸出了1。最終該程序先后輸出了2和1。
5. 第五種情況 程序代碼如下:
def x(f):
def y():
print(1)
print(f())
return y()
def f():
#print(2)
return 2
x(f)
運(yùn)行結(jié)果:
1
2
分析:因?yàn)榈?行中的x(f)中的f沒有帶括號,f只是一個(gè)普通的參數(shù),所以程序只是先調(diào)用執(zhí)行了x(f)函數(shù)。在x(f)函數(shù)中也定義了y()函數(shù),而且返回值是y()函數(shù),所以程序會調(diào)用執(zhí)行y()函數(shù)。在y()函數(shù)中先是執(zhí)行print(1)語句,輸出1,接著執(zhí)行print(f())語句,所以程序在這時(shí)也會調(diào)用執(zhí)行f()函數(shù),輸出2。最終該程序先后輸出了1和2。
好了,今天就介紹到這兒。