Python中函式的高階使用

Simon_Zhou發表於2019-04-07

1. 預設引數

1.1預設引數概念

預設引數指函式/方法在定義時為形參賦值,對應的形參稱為預設引數。

預設引數是一個引數定義期的概念,與呼叫無關。

1.2預設引數作用

如果引數定義預設引數,在呼叫函式方法時,未對該引數進行傳值,則使用預設值作為該引數的值。

1.3預設引數基本語法

定義格式:

def 函式名(形參1 = 值1,…):

函式體

……

呼叫格式一(同普通引數,無特殊):

函式名(實參)  使用實參作為形參的值,不使用預設值複製程式碼

呼叫格式二:

函式名() 使用預設值作為形參的值複製程式碼
def test(a,b=100):
    pass​
test(5)複製程式碼

1.4注意事項

1.預設引數的定義必須在位置引數的右側

def test(b=100,a): # 位置引數在預設引數右邊,報錯
    pass複製程式碼

2.預設引數在呼叫傳值時,按照位置引數進行對待,從左至右依次賦值,不能跳過左側的某個引數直接為後面的引數賦值

def test(a,b=100,c=5):
    pass​
test(5,6,7)複製程式碼

2. 關鍵字引數

2.1關鍵字引數概念

Python中函式的高階使用

2.2關鍵字引數作用

按名稱確認實參為指定的形參賦值,呼叫函式時使用。

2.3關鍵字引數基本語法

定義格式(同普通引數定義,無特殊):
def 函式名(形參 ,…):
    函式體
呼叫格式:    函式名( 形參名 = 實參)複製程式碼
def test(a=5,b=100):
    pass
test(b=7)
#  a=5 b=7複製程式碼

2.4注意事項

1.關鍵字引數必須出現在位置引數的後面

2.不允許使用關鍵字引數對同一個形參進行多次賦值

3.關鍵字引數既可以為位置引數賦值,也可以為預設引數賦值。通常使用關鍵字引數解決預設引數選擇性賦值問題。

3. 可變引數

3.1可變引數概念

Python中函式的高階使用

3.2可變引數作用

Python中函式的高階使用

3.3可變引數基本語法

定義格式
def 函式名(*args ,…):
    函式體
呼叫格式(同普通引數,無特殊):函式名( 實參1,…… )
def sum(*args):
    sums = 0
    for num in args:
        sums += num
    print(sums)
​sum(1,2,3,4,5)複製程式碼

3.4注意事項

Python中函式的高階使用

def test( a , b , *args , c = 1 ):
    pass複製程式碼

4. 字典引數

4.1字典引數概念

函式/方法在定義時,定義一個特殊的形參,用於接收未定義直接使用的關鍵字引數,對應的形參稱為字典引數。

4.2字典引數作用

Python中函式的高階使用

4.3字典引數基本語法

定義格式:
def 函式名(**kwargs ,…):
    函式體 
呼叫格式:   函式名( 未定義的變數名1 = 實參1,未定義的變數名2 = 實參2,…… )
def test(**kwargs):
    test(a=1,b=2)   複製程式碼
def test(m,**kwargs):
    print(m)
    print(kwargs)
​test(x=1,y=2,m=1)
# 輸出 1
#     {'x': 1, 'y': 2}複製程式碼

4.4注意事項

1.字典引數在一個函式/方法定義中只能出現一個。

2.定義函式的引數時,先定義位置引數,再定義可變引數,然後定義預設引數,最後定義字典引數

def test( a , b , *args , c = 1 ,**kwargs):
    pass ​test(1,2)# 輸出 a = 1 b = 2
    args = () 
    c = 1
    kwargs = {}
    test(1,2,c=5)# 輸出 a = 1 b = 2 args = () c = 3 kwargs = {}
    test(1, 2, 3, 'a', 'b')  # 輸出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {}
    test(1, 2, 3, 'a', 'b', x=55)
    # 輸出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {'x':55}複製程式碼

3.對於任意函式,都可以通過類似func(*args, **kwargs)的形式呼叫它,無論它的引數是如何定義的。

使用*args**kwargs是Python的習慣寫法,當然也可以用其他引數名。

*args是可變引數,*args接收的是一個tuple

**kwargs是關鍵字引數,**kwargs接收的是一個dict

4.5其他

所有的容器都支援解包操作。

def test(a, b, c):
    print(a, b, c)​
    list1 = [1, 2, 3]
    dict1 ={'a': 1, 'b': 2, 'c': 3}
    test(*list1) # 1 2 3
    test(**dict1) # 1 2 3複製程式碼

如果要強制傳入的引數為關鍵字引數,之後的引數必須以關鍵字引數的形式傳遞,稱之為引數槽。以一個*表示。引數槽通常和預設引數搭配使用。

def test(a, b, *, x, y):
     print(a, b)
     print(x, y) # TypeError: test() takes 2 positional arguments but 4 were given
     test(1, 2, x=3, y=4)   # 輸出 1 2 3 4    複製程式碼

5. 遞迴函式

5.1遞迴函式概念

函式/方法在執行過程中出現了對自身函式/方法的呼叫,稱該過程為遞迴呼叫,稱這樣的函式為遞迴函式。

5.2遞迴函式基本語法

同普通函式

5.3遞迴函式定義要求

1.函式體中具有對自身函式的呼叫

2.函式體中具有明確的函式執行結束判定條件

"""使用遞迴的方法列印出前n個斐波那契數列1,1,2,3,5,8,13...."""
def fb(n):
    if n == 1 or n == 2:
        return 1
    return fb(n - 1) + fb(n - 2)
    s = fb(4)
    print(s)複製程式碼

5.4遞迴函式呼叫要求

Python語言中函式呼叫最大層級為1000層,超過該層級,程式將報錯,遞迴的效率很低,實際開發很少用。

# 如果需要設定遞迴深度,可以使用sys模組中的setrecursionlimit()函式修改預設的最大深度限制。
import sys
sys.setrecursionlimit(2000)複製程式碼

6. 匿名函式

6.1匿名函式概念

匿名函式即沒有名稱的函式,在python語言中,匿名函式是使用lambda關鍵字定義的一個特殊表示式,也稱為lambda表示式。

6.2匿名函式基本語法

# 格式一:
# 定義:   函式名 = lambda 形參 : 返回值
# 呼叫:   結果 = 函式名(實參)
add = lambda a,b : a + b
c = (2,3)
# 格式二:
# 定義並呼叫:    #結果 = (lambda 形參 : 返回值)(實參)
c=(lambda a,b : a + b)(2,3) 複製程式碼

6.3匿名函式特殊語法

無參格式:

結果 = (lambda :返回值)()
 f1 = (lambda : 100)() 複製程式碼

多返回值格式:可使用資料儲存模型返回多個資料

f2, f3 = (lambda: (3, 4))()
print(f2)
print(f3)
f4 = (lambda: [a ** 2 for a in range(5) if a % 2 == 0])()
print(f4)  #輸出 [0, 4, 16]複製程式碼

無返回值格式:必須有具體值或結果為None

x = (lambda: (print("hello"), print("python")))()print(x)複製程式碼


相關文章