目錄
一. 函數進階
1. 默認參數:?
2. 關鍵字參數:?
3. 可變參數:?
4. 裝飾器:?
5. 匿名函數lambda:
6. 高階函數:
7. 遞歸函數:?
8. 類型注解:?
二.函數參數的高級使用
缺省參數
命名參數
不定長參數
三.返回值拆包
一. 函數進階
Python函數的進階使用包含多個重要的知識點,這些知識點可以幫助開發人員編寫更為高效、靈活且強大的代碼。以下是一些關鍵的進階概念:
1. 默認參數:?
- 函數可以定義默認參數,讓函數調用時某些參數可選。這提高了函數的可用性和靈活性。
- 默認參數值通過在函數定義時賦值給參數實現。
2. 關鍵字參數:?
- 函數調用時可以通過鍵=值的形式指定參數,這樣參數的順序就不重要了。
- 關鍵字參數增加了代碼的可讀性。
3. 可變參數:?
- 使用星號*args允許函數接受任意數量的位置參數。
- 使用雙星號**kwargs允許函數接受任意數量的關鍵字參數。
- ?這使得函數能夠處理不確定數量的輸入參數。
4. 裝飾器:?
- 裝飾器是一種特殊的函數,用于修改另一個函數的行為,而不需要改動其代碼。
- 通過在函數之前添加@decorator_name來應用裝飾器。
- 常用于日志記錄、性能測試、事務處理等場景。
5. 匿名函數lambda:
- 通過lambda關鍵字創建匿名函數,通常用于短小的函數定義。
- lambda函數可以接受任意數量的參數,但僅能有一個表達式。
- ?一般與高階函數(如filter、map、reduce)一同使用。
6. 高階函數:
- 高階函數是將函數作為參數或返回值的函數。
- 常見的高階函數包括map(), filter(), reduce()等。
- 這些函數通常用于數據處理和函數式編程。
7. 遞歸函數:?
- 函數可以調用自身,這稱為遞歸。
- 遞歸通常用于解決可以分解為相同問題的小規模問題的場景,如遍歷目錄、解析嵌套數據等。
- 需要謹慎使用遞歸以避免無限遞歸和棧溢出的問題。
8. 類型注解:?
- 從Python 3.5開始,可以通過類型注解來指定函數的參數和返回值類型。
- 類型注解不影響Python的動態類型特性,主要用于代碼提示和靜態類型檢查。
這些進階知識點幫助開發者更好地理解和利用Python中的函數,從而編寫出更加簡潔、高效和健壯的代碼。了解并掌握這些概念對于成為高級Python程序員至關重要
二.函數參數的高級使用
缺省參數
引入
缺省參數也叫做默認參數,是指定義函數時形參變量有默認值,如果調用函數時沒有傳遞參數,那么函數就用默認值,如果傳遞了參數就用傳遞的那個數據。
示例:
def print_info(name, age=35):print(f'name: {name}')print(f'age: {age}')print_info('小明')
print_info('小明', 18)
缺省參數的作用
當調用函數時,有些參數不必傳遞,而是用默認值,這樣的場景往往都用缺省參數
例如,一個學校現在開始檢查每個學生的信息,學生說:報告老師我是xxx學校xxx系xxx年級xxx班學生,名字叫xxxx,大家想只要是這學校的學生那么xxx學校就可以省略不用說了,因為大家都知道。所以就可以認為默認的學校就是xxx,而當其他學校的學生介紹時yyy學校名字案例說就一定要說清楚,否則會讓人混淆。
示例:
def print_info(name, class_name, grade, department_name, school_name="清華大學"):print("老師好:我是來自 %s(大學) %s系 %s年級 %s班級 的學生,我叫%s" % (school_name,department_name,grade,class_name,name))print_info("小明", "爬蟲", "二", "軟件工程")
print_info("小明", "爬蟲", "二", "軟件工程", "北京大學")
注意點
- 缺省參數只能在形參的最后(即最后側)
- 缺省參數全挨在一起(在右側),不是缺省參數挨在一起(在左側)
>>> def printinfo(name, age=35, sex):
... print(name)
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
命名參數
引入
命名參數是指:在調用函數時,傳遞的實參帶有名字,這樣的參數叫做命名參數
示例:
def test(a, b):print('-----')print(f'a={a}')print(f'b={b}')test(11, 22)
test(a=11, b=22)
test(a=22, b=11) # 根據名稱將值傳入到指定的變量中
命名參數的作用
命名參數能夠在調用函數的時候,不受位置的影響,可以給需要的參數指定傳遞數據
注意點
- 命名參數的名字要與形參中的名字相同,不能出現命名參數名字叫做num,而形參中沒有變量num
- 如果形參左側有普通的形參,調用函數時傳遞的參數一定要先滿足這些形參,然后再根據需要編寫命名參數
def test(a, b, c=100, d=200):print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)# 下面的方式都失敗
test(c=1, d=2) # 缺少a、b的值
test(c=1, d=2, 11, 22) # 11, 22應該在左側
不定長參數
引入
不定長參數:定義函數的時候形參不確定到底有多少個,這樣的參數就叫做不定長參數
不定長參數有兩種方式表示:
- *args :表示調用函數時多余的未命名參數都會以元組的方式存儲到args中
- **kwargs:表示調用函數時多余的命名參數都會以鍵值對的方式存儲到kwargs中
注意:
- *和**是必須要寫的,否則就變成了普通的形參了
- 當我們說不定長參數的時候,就是指*args和**kwargs
示例:
def test(a, b, *args, **kwargs):print(a, type(a))print(b, type(b))print(args, type(args))print(kwargs, type(kwargs))test(11, 22, 33, 44, 55, 66, name='小明', address='蘭州')
不定長參數的作用
通過不定長參數,能夠實現調用函數時傳遞實參個數可以隨意變換的需求
注意點
- 加了星號*的變量args會存放所有未命名的變量參數,args為元組
- 而加**的變量kwargs會存放命名參數,即形如key=value的參數, kwargs為字典
- 一般情況下*args、**kwargs會在形參的最右側
- args與kwargs的名字可以變,例如叫*aa,**bb都是可以,但一般為了能夠讓其他的開發者快速讀懂我們的代碼最好還是不改
特殊情況
缺省參數在*args的后面
def sum_nums_3(a, *args, b=22, c=33, **kwargs):print(a)print(b)print(c)print(args)print(kwargs)sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)輸出結果:100
1
2
(200, 300, 400, 500, 600, 700)
{'mm': 800, 'nn': 900}
說明:
- *args后可以有缺省參數,想要給這些缺省參數在調用時傳遞參數,需要用命名參數傳遞,否則多余的未命名參數都會給args
- 如果有**kwargs的話,**kwargs必須是最后的
三.返回值拆包
返回值拆包概述
函數返回值拆包:如果一個函數通過return返回了一個元組、列表、集合,可以通過拆包的方式將返回值進行拆分到每個變量中,這就是返回值拆包。
示例:
def test():return 11, 22, 33a, b, c = test()
print(a, b, c)
返回值拆包的作用
通過函數返回值拆包,可以快速的將具體的數據用變量進行存儲,這樣對數據的處理會更加方便
示例:
def test():return 11, 22, 33# 通過返回值拆包,快速使用每個數據
a, b, c = test()
print(a + b + c)# 沒有通過返回值拆包,這樣用數據時稍微復雜
ret = test()
print(ret[0] + ret[1] + ret[2])
拆包的使用
def get_my_info():high = 178weight = 100age = 18return high, weight, age# result = get_my_info()
# print(result)# 通過返回值拆包,能夠更加方便的對每個數據使用
my_high, my_weight, my_age = get_my_info()
print(my_high)
print(my_weight)
print(my_age)
使用拆包時的注意點
- 拆包時要注意,需要拆的數據的個數要與變量的個數相同,否則程序會異常