Python 函數(shù)詳解
轉(zhuǎn)載請(qǐng)注明 來(lái)源:http://www.eword.name/
Author:eword
Email:eword@eword.name
Python 函數(shù)詳解
一、認(rèn)識(shí)Python函數(shù):
- 函數(shù)的本質(zhì)就是功能的封裝。使用函數(shù)可以大大提高編程效率與程序的可讀性。
- 函數(shù)是能夠?qū)崿F(xiàn)特定功能的計(jì)算機(jī)代碼而已,他是一種特定的代碼組結(jié)構(gòu)。
- 函數(shù)的作用
- 1.提升代碼的重復(fù)利用率,避免重復(fù)開(kāi)發(fā)相同代碼
- 2.提高程序開(kāi)發(fā)效率
- 3.便于程序維護(hù)
定義一個(gè)函數(shù):
- 你可以定義一個(gè)由自己想要功能的函數(shù),以下是簡(jiǎn)單的規(guī)則:
- 函數(shù)代碼塊以 def 關(guān)鍵詞開(kāi)頭,后接函數(shù)標(biāo)識(shí)符名稱(chēng)和圓括號(hào) ()。
- 任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間,圓括號(hào)之間可以用于定義參數(shù)。
- 函數(shù)的第一行語(yǔ)句可以選擇性地使用文檔字符串—用于存放函數(shù)說(shuō)明。
- 函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
- return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
二、函數(shù)的定義格式:
-
基本函數(shù)格式
-
帶有參數(shù)的函數(shù)格式
-
帶有默認(rèn)值的參數(shù)
-
關(guān)鍵字參數(shù)
-
收集參數(shù)(帶*)
-
多種參數(shù)混合
(一)基本函數(shù)格式:
# 源碼
# 基本函數(shù)定義格式
"""
def 函數(shù)名():
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù): 函數(shù)名()
"""
# 定義函數(shù)
def show_name():
# 函數(shù)內(nèi)功能代碼
print("My name is Eword!")
# 調(diào)用函數(shù)
show_name()
# 結(jié)果
My name is Eword!
- 特征:函數(shù)定義之后不會(huì)自動(dòng)執(zhí)行,必須在調(diào)用函數(shù)后函數(shù)才會(huì)執(zhí)行.
- 函數(shù)名的命名規(guī)則:和變量基本一樣
- 1.推薦使用英文或者拼音,禁止使用中文
- 2.可以使用數(shù)字,但是不能用數(shù)字開(kāi)頭
- 3.不可以使用特殊字符,除了_
- 4.函數(shù)名嚴(yán)格區(qū)分大小寫(xiě)
- 5.函數(shù)名必須要有意義。
- 6.不能和系統(tǒng)已經(jīng)存在的保留關(guān)鍵字沖突!
- 7.禁止使用和系統(tǒng)提供函數(shù)相同的函數(shù)名
(二) 帶有參數(shù)的函數(shù)格式
- **形參:**形式上的參數(shù),聲明函數(shù)時(shí)()中的參數(shù)是形參
- **實(shí)參:**實(shí)際上的參數(shù),調(diào)用函數(shù)時(shí)()中的參數(shù)是實(shí)參
實(shí)參將值傳遞給形參的過(guò)程本質(zhì)上和變量賦值相同
# 源碼
# 定義帶參數(shù)的函數(shù)
"""
def 函數(shù)名(參數(shù),參數(shù)...):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù):函數(shù)名(參數(shù),參數(shù)...)
"""
# 計(jì)算面積函數(shù)
def area(width, height):
return width * height
# 顯示姓名
def show_name(name):
# 函數(shù)內(nèi)功能代碼
print("My name is ", name, " !")
# 調(diào)用函數(shù)
# 參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時(shí)的數(shù)量必須和聲明時(shí)的一樣。
# 例如:調(diào)用show_name()函數(shù),你必須傳入一個(gè)參數(shù),不然會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。
w = 4
h = 5
print("寬 =", w, " 高 =", h, " 面積 =", area(w, h))
show_name("Eword")
# 結(jié)果
寬 = 4 高 = 5 面積 = 20
My name is Eword !
(三) 關(guān)鍵字參數(shù):
- 關(guān)鍵字參數(shù)就是調(diào)用函數(shù)時(shí),在實(shí)參前面指定形參的做法,為了防止參數(shù)按照位置傳遞出現(xiàn)的錯(cuò)誤
- 關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來(lái)確定傳入的參數(shù)值。
- 使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致,因?yàn)?Python 解釋器能夠用參數(shù)名匹配參數(shù)值。
# 源碼
# 定義函數(shù)
"""
def 函數(shù)名(形參=默認(rèn)值,形參=默認(rèn)值...):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù):函數(shù)名(形參=實(shí)參,形參=實(shí)參...)
"""
# 顯示人員信息
def person_info(name, sex, age):
# 函數(shù)內(nèi)功能代碼
print("我的姓名叫{0},性別{1},年齡{2} !".format(name, sex, age))
# 調(diào)用函數(shù)
person_info("呂嬤嬤", "女", "30")
print("========我是驕傲又可愛(ài)的分割線===========")
person_info(sex="男", name="黃大大", age="20") # 函數(shù)參數(shù)的使用不需要使用指定順序:
# 結(jié)果
我的姓名叫呂嬤嬤,性別女,年齡30 !
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫黃大大,性別男,年齡20 !
(四) 函數(shù)參數(shù)帶有默認(rèn)值
- 調(diào)用函數(shù)時(shí),如果沒(méi)有傳遞參數(shù),則會(huì)使用默認(rèn)參數(shù)。以下實(shí)例中如果沒(méi)有傳入 age 參數(shù),則使用默認(rèn)值。
- 調(diào)用函數(shù)時(shí),如果有傳遞參數(shù),使用實(shí)參值覆蓋原有形參的默認(rèn)值,本質(zhì)上就是變量的重新賦值操作。
# 源碼
# 定義參數(shù)帶有默認(rèn)值的函數(shù)
"""
def 函數(shù)名(形參=默認(rèn)值,形參=默認(rèn)值...):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù):
函數(shù)名() 調(diào)用函數(shù)時(shí)所有形參采用默認(rèn)值操作
函數(shù)名(實(shí)參,實(shí)參...) 調(diào)用時(shí)形參使用實(shí)參的值而拋棄默認(rèn)值
"""
# 顯示人員信息
def person_info(name="Eword", sex="男", age="18"):
# 函數(shù)內(nèi)功能代碼
print("我的姓名叫{0},性別{1},年齡{2} !".format(name, sex, age))
# 調(diào)用函數(shù)
person_info();
print("========我是驕傲又可愛(ài)的分割線===========")
person_info(name="呂嬤嬤", sex="女", age="30")
print("========我是驕傲又可愛(ài)的分割線===========")
person_info(name="黃大大", age="20")
# 結(jié)果
我的姓名叫Eword,性別男,年齡18 !
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫呂嬤嬤,性別女,年齡30 !
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫黃大大,性別男,年齡20 !
(五)收集參數(shù):
- 1.非關(guān)鍵字收集參數(shù)
- 特征:
- 1.非關(guān)鍵字收集參數(shù),在形參前添加一個(gè)*即可
- 2.非關(guān)鍵字收集參數(shù)收集實(shí)參組成一個(gè)元組
- 3.非關(guān)鍵字收集參數(shù),僅收集沒(méi)有任何形參接受的非關(guān)鍵字實(shí)參
- 4.非關(guān)鍵字收集參數(shù)和普通的形參可以共存
- 特征:
# 源碼
# 非關(guān)鍵字收集參數(shù)
# 定義函數(shù)
"""
def 函數(shù)名(*參數(shù)名):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù):函數(shù)名(實(shí)參,實(shí)參...) 沒(méi)有數(shù)量限制
"""
# 顯示人員信息
def person_info(name, sex, age, *args):
# 函數(shù)內(nèi)功能代碼
# 拼接 args 傳入的任何參數(shù)
if args.__len__() > 0:
_str = ", 其他信息:"
for i in args:
_str += ", " + i
else:
_str = ""
print("我的姓名叫{0},性別{1},年齡{2}{3}!".format(name, sex, age, _str))
# 調(diào)用函數(shù)
person_info("呂嬤嬤", "女", "30")
print("========我是驕傲又可愛(ài)的分割線===========")
person_info("呂嬤嬤", "女", "30", "國(guó)籍:中國(guó)", "籍貫:福建泉州", "婚姻狀況:已婚")
# 結(jié)果
我的姓名叫呂嬤嬤,性別女,年齡30!
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫呂嬤嬤,性別女,年齡30, 其他信息:, 國(guó)籍:中國(guó), 籍貫:福建泉州, 婚姻狀況:已婚!
- 2.關(guān)鍵字收集參數(shù)
- 特征:
- 1.關(guān)鍵字收集參數(shù),在形參前添加兩個(gè)**即可
- 2.關(guān)鍵字收集參數(shù),收集的結(jié)果組成一個(gè)字典,關(guān)鍵字成為字典的鍵,實(shí)參成為值
- 3.關(guān)鍵字收集參數(shù),僅收集沒(méi)有任何形參接受的關(guān)鍵字參數(shù)
- 4.關(guān)鍵字參數(shù)可以和普通的形參共存
- 特征:
# 源碼
# 關(guān)鍵字收集參數(shù)
# 定義函數(shù)
"""
def 函數(shù)名(**參數(shù)名):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
調(diào)用函數(shù): 函數(shù)名(形參=實(shí)參,形參=實(shí)參...) 沒(méi)有數(shù)量限制
"""
# 顯示人員信息
def person_info(name, sex, age, **args):
# 函數(shù)內(nèi)功能代碼
# 拼接 args 傳入的任何參數(shù)
if args.__len__() > 0:
_str = ", 其他信息:"
_str += "國(guó)籍:" + args["country"]
_str += ", 籍貫:" + args["province"]
else:
_str = ""
print("我的姓名叫{0},性別{1},年齡{2}{3}!".format(name, sex, age, _str))
# 調(diào)用函數(shù)
person_info(name="黃大大", sex="男", age="20")
print("========我是驕傲又可愛(ài)的分割線===========")
person_info(name="黃大大", sex="男", age="20", country="中國(guó)", province="福建泉州")
print("========我是驕傲又可愛(ài)的分割線===========")
person_info("黃小小", "女", "30", country="中國(guó)", province="福建廈門(mén)")
# 結(jié)果
我的姓名叫黃大大,性別男,年齡20!
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫黃大大,性別男,年齡20, 其他信息:國(guó)籍:中國(guó), 籍貫:福建泉州!
========我是驕傲又可愛(ài)的分割線===========
我的姓名叫黃小小,性別女,年齡30, 其他信息:國(guó)籍:中國(guó), 籍貫:福建廈門(mén)!
(六)多種參數(shù)混合
- 定義函數(shù)時(shí)盡量避免多種參數(shù)格式混合(普通參數(shù)/非關(guān)鍵字參數(shù),關(guān)鍵字參數(shù),非關(guān)鍵字收集參數(shù),關(guān)鍵字收集參數(shù))
- 1.普通參數(shù)(非關(guān)鍵字參數(shù))和關(guān)鍵字參數(shù)必須在兩種收集參數(shù)之前
- 2.非關(guān)鍵字收集參數(shù),必須在關(guān)鍵字收集參數(shù)之前
- 3.如果多種參數(shù)在一起,必須注意進(jìn)制參數(shù)多次賦值操作(相同賦值賦值之后,關(guān)鍵字參數(shù)在此賦值!)
(七)函數(shù)返回值
- 函數(shù)根據(jù)執(zhí)行完畢是否可以得到一個(gè)結(jié)果,將函數(shù)分為2個(gè)類(lèi)型:
- 執(zhí)行過(guò)程函數(shù),例如:print()
- 函數(shù)執(zhí)行完畢之后,不會(huì)有任何結(jié)果可以被接受的函數(shù)。
- 具有返回值的函數(shù),例如:id(),type()
- 函數(shù)執(zhí)行完畢之后,會(huì)產(chǎn)生一個(gè)結(jié)果,可以被變量接受或者使用的函數(shù)
- 執(zhí)行過(guò)程函數(shù),例如:print()
# 源碼
# 定義函數(shù)
"""
def 函數(shù)名(參數(shù)....):
函數(shù)功能代碼...
函數(shù)功能代碼...
...
[return 語(yǔ)句]
"""
# 顯示姓名
def show_name(name):
# 函數(shù)內(nèi)功能代碼
_str = "我的名字是:{}!".format(name)
print("內(nèi)部打印:{}".format(_str))
return _str
# 調(diào)用函數(shù)并賦值
my_name = show_name("Eword")
print("外部打印:{}".format(my_name))
# 結(jié)果
內(nèi)部打印:我的名字是:Eword!
外部打印:我的名字是:Eword!
- return的特征:
- 1.具有return語(yǔ)句的函數(shù)稱(chēng)為具有返回值的函數(shù)
- 2.return可以為當(dāng)前函數(shù)執(zhí)行完畢返回一個(gè)結(jié)果,這樣的函數(shù)調(diào)用可以被接受
- 3.return執(zhí)行之后,函數(shù)則會(huì)終止,所有return之后的語(yǔ)句不會(huì)被執(zhí)行
- 4.一個(gè)函數(shù)可以書(shū)寫(xiě)多個(gè)return語(yǔ)句,但是一般會(huì)放入分支結(jié)構(gòu)當(dāng)中。
- 5.一個(gè)函數(shù)如果需要返回多個(gè)數(shù)據(jù),需要借助復(fù)合數(shù)據(jù)類(lèi)型(list,tuple,set,dict)來(lái)操作即可!
- 6.不帶參數(shù)值的return語(yǔ)句返回None。
三、函數(shù)文檔
- 函數(shù)文檔就是用來(lái)查看當(dāng)前函數(shù)相關(guān)信息介紹的一個(gè)特定格式而已。
- 查看函數(shù)文檔的方法:
# 源碼
# 定位函數(shù),并定義函數(shù)的文檔
"""
def 函數(shù)名(參數(shù)...):
'''
在此處聲明函數(shù)文檔
'''
函數(shù)功能代碼...
函數(shù)功能代碼...
。。。
"""
# 顯示姓名
def show_name(name):
"""
函數(shù) show_name 是用來(lái)顯示傳入的姓名,顯示格式如下:
我的名字是:{name}!
:param name:姓名
:return:姓名
"""
# 函數(shù)內(nèi)功能代碼
_str = "我的名字是:{}!".format(name)
print(_str)
return _str
# 顯示函數(shù)文檔
help(show_name)
# 結(jié)果
Help on function show_name in module __main__:
show_name(name)
函數(shù) show_name 是用來(lái)顯示傳入的姓名,顯示格式如下:
我的名字是:{name}!
:param name:姓名
:return:姓名
- 注意:函數(shù)文檔的作用是對(duì)函數(shù)進(jìn)行說(shuō)明,便于閱讀和快速掌握函數(shù)的使用,通常函數(shù)文檔需要具有以下信息:
- 函數(shù)的作用
- 函數(shù)的參數(shù)介紹(個(gè)數(shù),數(shù)據(jù)類(lèi)型)
- 函數(shù)的返回值(數(shù)據(jù)和類(lèi)型)
四、局部變量與全局變量
- 定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,定義在函數(shù)外的擁有全局作用域。
- 局部變量只能在其被聲明的函數(shù)內(nèi)部訪問(wèn),而全局變量可以在整個(gè)程序范圍內(nèi)訪問(wèn)。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱(chēng)都將被加入到作用域中。
- 在局部?jī)?nèi)同名的全局變量和局部變量,一般情況下局部變量會(huì)優(yōu)先與全局變量。
# 源碼
# 定義全局變量
name = "我是全局的黃大大"
# 定義函數(shù)
# 顯示姓名
def show_name():
# 函數(shù)內(nèi)功能代碼
name = "我是局部的呂嬤嬤"
print("內(nèi)部打印的是局部變量:{}".format(name))
return name
# 調(diào)用函數(shù)
show_name()
print("外部打印的是全局變量:{}".format(name))
# 結(jié)果
內(nèi)部打印的是局部變量:我是局部的呂嬤嬤
外部打印的是全局變量:我是全局的黃大大
五、匿名函數(shù)
- python 使用 lambda 來(lái)創(chuàng)建匿名函數(shù)。
- 所謂匿名,意即不再使用 def 語(yǔ)句這樣標(biāo)準(zhǔn)的形式定義一個(gè)函數(shù)。
- lambda 只是一個(gè)表達(dá)式,函數(shù)體比 def 簡(jiǎn)單很多。
- lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
- lambda 函數(shù)擁有自己的命名空間,且不能訪問(wèn)自己參數(shù)列表之外或全局命名空間里的參數(shù)。
- 雖然lambda函數(shù)看起來(lái)只能寫(xiě)一行,卻不等同于C或C++的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時(shí)不占用棧內(nèi)存從而增加運(yùn)行效率。
lambda 函數(shù)的語(yǔ)法:
lambda [arg1 [,arg2,.....argn]]:expression
示例:
# 源碼
# 定義匿名函數(shù)
ares = lambda width, height: width * height
# 調(diào)用函數(shù)
print("面積:{}".format(ares(3, 4)))
# 結(jié)果
面積:12

浙公網(wǎng)安備 33010602011771號(hào)