函數(shù)的定義

Python的函數(shù)定義使用關(guān)鍵字def,如定義一個(gè)返回絕對(duì)值的函數(shù)my_abs

1
2
3
4
5
def my_abs(x):
    if x>=0:
        return x
    else:
        return -x

函數(shù)調(diào)用

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

參數(shù)錯(cuò)誤

如果在調(diào)用函數(shù)時(shí),傳給函數(shù)的參數(shù)增多或減少,python解釋器都會(huì)檢查出來

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

TypeError:提示my_abs()只需一個(gè)參數(shù),但是調(diào)用時(shí)給了兩個(gè)

雖然python解釋器能檢查到參數(shù)個(gè)數(shù)的變化,但當(dāng)給函數(shù)一個(gè)非法類型的參數(shù)時(shí),就無法準(zhǔn)確檢測到

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

解釋器雖然給出了錯(cuò)誤,但是沒有定義具體是哪種錯(cuò)誤

參數(shù)類型檢查

python提供了內(nèi)置函數(shù)isinstance()來判斷參數(shù)的數(shù)據(jù)類型

1
2
3
4
5
6
7
def my_abs(x):
    if not isinstance(x, (intfloat)):
        raise TypeError('wrong type......')
    if x >= 0:
        return x
    else:
        return -x

改寫了my_abs函數(shù)后,如果傳參不是int或float類型,則會(huì)報(bào)錯(cuò)并給出錯(cuò)誤信息'wrong type'

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

函數(shù)的參數(shù)

python的函數(shù)定義雖然相對(duì)簡單,但是參數(shù)種類非常靈活。如正常的必須參數(shù),還有默認(rèn)參數(shù)、可變參數(shù)以及關(guān)鍵字參數(shù)

位置參數(shù)

即必須參數(shù),在傳參時(shí)按照函數(shù)定義的順序賦給函數(shù)

1
2
3
4
5
6
def power(x, n):
    = 1
    while n > 0:
        = - 1
        = * x
    return s

定義一個(gè)函數(shù)power()來求x的n次方,在調(diào)用時(shí)根據(jù)函數(shù)定義的順序傳參。不同的位置順序得到不同的結(jié)果

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

默認(rèn)參數(shù)

同其他編程語言一樣,python在定義函數(shù)時(shí)可通過設(shè)置默認(rèn)參數(shù)來避免因某些參數(shù)沒有傳入而導(dǎo)致的錯(cuò)誤

如power(x, n),如果沒有傳入?yún)?shù)n則會(huì)引起錯(cuò)誤

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

解釋器提示power()缺少一個(gè)必須的參數(shù)n。來使用默認(rèn)參數(shù)來改進(jìn)一下power函數(shù)

1
2
3
4
5
6
def power(x, n=2):
    = 1
    while n > 0:
        = - 1
        = * x
    return s

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

兩種形式的函數(shù)調(diào)用都能正常運(yùn)行,這正是因?yàn)槟J(rèn)函數(shù)的作用。當(dāng)參數(shù)都給全時(shí),函數(shù)按照給定的參數(shù)進(jìn)行運(yùn)算;當(dāng)參數(shù)n未傳入時(shí),函數(shù)按照設(shè)置的默認(rèn)參數(shù)進(jìn)行運(yùn)算

可變參數(shù)

可變參數(shù)即參數(shù)的個(gè)數(shù)是可變的,在定義函數(shù)時(shí),無需一個(gè)一個(gè)的給定

1
2
3
4
5
def add(*numbers):
    sum = 0
    for in numbers:
        sum = sum + n
    return sum

定義一個(gè)add函數(shù)用來計(jì)算參數(shù)的和

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

通過可變參數(shù),我們可以傳入任意個(gè)參數(shù)來調(diào)用函數(shù)進(jìn)行運(yùn)算

關(guān)鍵字參數(shù)

不同于可變參數(shù),關(guān)鍵字參數(shù)允許傳入0或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組合成dict

1
2
def student(name, age, **args):
    print('name: ', name, 'age: ', age, 'other: ', args)

**args:代表傳入的是關(guān)鍵字參數(shù)

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 命名關(guān)鍵字參數(shù)

上述student函數(shù)可以接收除name,age外的任意參數(shù),但是如果需要限制接收的參數(shù)就要用到命名關(guān)鍵字參數(shù)

假設(shè)對(duì)于student信息還只需要一個(gè)city信息,可以改寫student函數(shù)如下

1
2
def student(name, age, *, city):
    print(name, age, city)

運(yùn)行結(jié)果如下

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了,如

1
2
def student(name, age, *args, city):
    print(name, age, args, city)

http://www.cnblogs.com/feanmy/p/6980352.html