Python自定義函式基礎概念
一、函式定義語法:
def 函式名(形參列表):
語句塊
二、函式定義規則
1. 函式的名字就是語句塊的名稱
2. 函式名的命名規則與變數名相同(函式名必須是識別符號)
3. 函式名是一個變數(不要輕易對其賦值)
4. 函式有自己的名字空間,在函式外部不可以訪問函式內部的變數,在函式內可以訪問函式外部的變數,但不能修改此變數。
5. 函式如果不需要傳入引數,形參列表可以為空
6. 語句塊部分,內容不能為空,如果為空需要填充pass
三、形參定義方式
形參:函式呼叫時,接收呼叫時傳遞的資料
【1】位置形參
【2】關鍵字形參
【3】預設引數
def 函式名(形參名=預設實參1, 形參名2=預設實參2, ...):
pass
預設引數必須自右至左依次存在,如果一個引數是預設引數,則其右側的所有引數都必須是預設引數。
【4】*args
星號元組形參,收集多餘的位置傳參
def 函式名(*元組形參名):
pass
【5】**kwargs
雙星號字典形參,收集多餘的關鍵字傳參
def 函式名(**字典形參名):
pass
【6】不定長形參
星號元組形參,雙星號字典形參
可以接受任意的位置傳參和關鍵字傳參
def fun(*args,**kwargs):
pass
位置形參,預設引數,星號元組形參,雙星號字典形參可以混合使用.
函式形參自左至右的順序為:
位置形參
星號元組形參
命名關鍵字形參
雙星號字典形參
四、函式呼叫
函式名(實參)
注:
1. 函式呼叫是一個表示式
2. 如果函式內部沒有return語句,函式呼叫完畢後返回None物件
3. 如果函式需要返回其它的物件需要用到 return 語句
4.函式名是一個變數,繫結的是函式物件
六、函式呼叫時引數的傳遞形式
【1】位置傳參
實參和形參的位置對應,將實引數據傳遞給函式形參。
實參和形參按位置一一對應。
實參個數和形參個數必須一致。
【2】序列傳參
位置傳參的一種。
用 * 將序列拆解後按位置進行傳遞的傳參方式
【3】關鍵字傳參
按形參的名稱將實引數據傳遞給形參。
實參和形參按形參名稱匹配。
【4】字典關鍵字傳參
實參為字典,將字典用 '**' 拆解後再進行關鍵字傳參的傳參方式。
字典的鍵名必須和形參一致,切數量相同。
字典的鍵必須為字串。
七、全域性變數與區域性變數
【1】全域性變數
① 定義在函式外部,模組內部的變數稱為全域性變數
②全域性變數所有函式都可以直接訪問(但函式內不能將其直接賦值)
【2】區域性變數
① 定義在函式內部的變數稱為區域性變數(函式的形參也是區域性變數)
② 區域性變數只能在函式內部使用
③區域性變數在函式呼叫時才能夠被建立,在函式呼叫之後會自動銷燬
八、函式的功能性
① 一個函式可以作為另一個函式呼叫時的實參,傳遞給此函式
def f1():
print("f1被呼叫")
def f2():
print("f2被呼叫")
def fx(fn):
print(fn)
fn() # 此時這是呼叫什麼呢?
fx(f1)
fx(f2)
#結果
<function f1 at 0x7f7a52ed6f28>
f1被呼叫
<function f2 at 0x7f7a51757c80>
f2被呼叫
#---------------------
def goodbye(L):
for x in L:
print("再見:", x)
def hello(L):
for x in L:
print("你好:", x)
def operator(fn, L):
fn(L)
operator(hello, ['Tom', 'Jerry', 'Spike'])
#結果
你好: Tom
你好: Jerry
你好: Spike
② 一個函式可以作為另一個函式的返回值
def fx():
return max
fn = fx()
print(fn([1, 3, 5, 7]))
#結果
7
③ 函式可以巢狀
九、函數語言程式設計
用一系列函式解決問題。
優點:
【1】用每一個函式完成細小的功能,一系列函式的任意組合可以完成大問題
【2】函式僅接受輸入併產生輸入,不包含任何能影響輸出的內部狀態
要求:
def 語句建立的函式最好不要訪問區域性作用域以外的變數,這樣可以保證返回結果的唯一性(可重入性)
十、函式的 可重入性(結果唯一性)
如果一個函式的輸入引數一定,則返回結果必須一定的函式稱為可重入函式
【1】 可重入函式,傳入引數一定.結果必然一定
def myadd(x, y):
return x + y
【2】不可重入函式:
y = 200
def myadd2(x):
return x + y
print(myadd2(10)) # 210
y = 300
print(myadd2(10)) # 310