知識點回顧:
- 函數的定義
- 變量作用域:局部變量和全局變量
- 函數的參數類型:位置參數、默認參數、不定參數
- 傳遞參數的手段:關鍵詞參數
- 傳遞參數的順序:同時出現三種參數類型時
def function_name(parameter1, parameter2, ...):"""Docstring: 描述函數的功能、參數和返回值 (可選但強烈推薦)"""# 函數體: 實現功能的代碼# ...return value # 可選,用于返回結果
函數的基本寫法如上,注意冒號、縮進、三引號包起來的注釋,函數的參數我們有如下稱呼:
- Parameters (形參): 在函數定義中列出的變量名 (如 name, feature1, feature2)。
- Arguments (實參): 在函數調用時傳遞給函數的實際值 (如 "張三", 10, 25),也就是實際的數值(實參)傳給了 形參(定義時候的變量)
但是形參/實參還有更具體的參數類型:
- 位置參數 (Positional Arguments): 調用時按順序匹配,也可以說是普通形參
- 默認參數值 (Default Parameter Values): 定義函數時給參數指定默認值,調用時如果未提供該參數,則使用默認值? ? ??注意點:帶默認值的參數必須放在沒有默認值的參數之后
- 可變數量參數 (*args 和 **kwargs):
? ????????? - *args: 將多余的位置參數收集為一個元組
? ????????? - **kwargs: 將多余的關鍵字參數收集為一個字典
Python?先用傳的參數按順序填滿普通參數,如果還有剩下的位置參數,全部塞進?*args?這個元組里,如果沒多余參數,*args?就是個空元組?()
def make_pizza(size, *toppings):"""概述要制作的比薩。*toppings 會將所有額外的位置參數收集到一個元組中。"""print(f"\n制作一個 {size} 寸的比薩,配料如下:")if toppings: # 只要toppings不為空元組,就會執行for topping in toppings:print(f"- {topping}")else:print("- 原味 (無額外配料)")make_pizza(12, "蘑菇")
make_pizza(16, "香腸", "青椒", "洋蔥")
make_pizza(9) # toppings 會是空元組# ---------- 結果如下 -----------
制作一個 12 寸的比薩,配料如下:
- 蘑菇制作一個 16 寸的比薩,配料如下:
- 香腸
- 青椒
- 洋蔥制作一個 9 寸的比薩,配料如下:
- 原味 (無額外配料)
Python?先處理所有位置參數(包括普通參數和*args),把能匹配普通參數名的關鍵字參數用掉,剩下的所有 參數名=值 都塞進?**kwargs?這個字典里
def build_profile(first_name, last_name, **user_info):"""創建一個字典,其中包含我們知道的有關用戶的一切。**user_info 會將所有額外的關鍵字參數收集到一個字典中。"""profile = {}profile['first_name'] = first_nameprofile['last_name'] = last_namefor key, value in user_info.items():profile[key] = valuereturn profileuser_profile = build_profile('愛因斯坦', '阿爾伯特',location='普林斯頓',field='物理學',hobby='小提琴')
print(f"\n用戶信息: {user_profile}")# ------------ 結果如下 --------------
用戶信息:{'first_name': '愛因斯坦', 'last_name': '阿爾伯特', 'location': '普林斯頓', 'field': '物理學', 'hobby': '小提琴'}
關鍵字參數 (Keyword Arguments)并非是一種參數,而是一種傳遞參數的手段: 調用時通過 參數名=值 的形式指定,可以不按順序。他可以傳位置參數的值,也可以傳默認參數的值,也可以傳可變參數的值,也可以傳關鍵字參數的值。為了可讀性,更推薦對所有參數均采取關鍵字參數傳遞
假設一個復雜的繪圖函數
plot_data(data, x_col, y_col, "blue", "-", True, False, "My Plot", "X-axis", "Y-axis") # 不清晰使用關鍵字參數
plot_data(data=my_data, x_column='time', y_column='value',color='blue', linestyle='-', show_grid=True, use_log_scale=False,title="My Awesome Plot", xlabel="Time (s)", ylabel="Value") # 非常清晰
- 局部變量 (Local Variables): 在函數內部定義的變量,只在該函數內部有效。當函數執行完畢后,局部變量通常會被銷毀
- 全局變量 (Global Variables): 在所有函數外部定義的變量,可以在程序的任何地方被訪問(但在函數內部修改全局變量需要特殊聲明,如 global 關鍵字,初學階段可以先避免)
收獲心得:
還有幾道作業就沒放上來了,說實話大部分概念都是之前接觸C或者C++見過并且熟知的,就是*args 和 **kwargs需要稍微注意一下
@浙大疏錦行