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

浙公網安備 33010602011771號