在上一篇教程中,我們瞭解了函數的定義以及參數的設定。
這一篇教程,我們繼續瞭解一些更加靈活的參數設定。
先來看一段示例代碼。
例如,我們定義一個根據輸入的姓名參數,返回一個姓名列表的方法。
示例代碼:
def creat_name_list(name_list,name1,name2,name3): # 定義函數並設定參數 name_list.append(name1) # 爲列表添加新元素 name_list.append(name2) name_list.append(name3) lst = [] # 創建空列表 creat_name_list(lst,'小樓老師','蒼井老師','吉澤老師') #調用函數並傳入參數 print(lst) # 顯示輸出結果爲:['小樓老師', '蒼井老師', '吉澤老師']
特別說明:在上方的代碼中,大家應該能夠注意到,雖然我們沒有對lst這個列表進行直接操作,但是它發生了改變。也就是說我們在函數外部創建的lst和函數內部的參數name_list是同一個列表。這樣的操作僅限於可變的數據結構,而數字、字符串以及元組是不能夠被改變的,所以無法進行這樣的修改。
示例代碼:
def change_number(num): # 定義函數並設定參數 num = 1 # 修改參數變量的值 n = 0 # 創建變量 change_number(n) # 調用函數並傳入參數 print(n) # 顯示輸出結果爲:0
以上是關於對修改函數外部變量的舉例,讓我們能夠知道當外部變量是不可變的數據結構,作爲參數傳入函數時,在函數內部的修改操作無法對外部變量產生影響;而當外部變量是可變的數據結構,作爲參數傳入函數時,在函數內部的修改能夠讓外部變量發生改變。
接下來,我們回過頭來看第一段代碼。
當我們希望輸入多個姓名,創建一個姓名列表時,往往姓名的數量是不固定的。
而我們定義參數時,位置參數或者關鍵字參數的數量卻是固定的。
很顯然,當我們想寫入4個姓名時,第一段代碼沒有辦法滿足我們的需求。
我們只有通過將參數增加爲4個才能實現。
但是,如果忽然我們改變了主意,要寫入5個姓名呢?
所以,改變函數的參數數量並不是一個好方法。
這裏,我們來使用收集參數來解決這個問題。
示例代碼:
def creat_name_list(name_list, *names): # 定義函數並設定參數,*names爲收集參數 print(type(names)) # 顯示輸出參數names的數據類型,結果爲:<class 'tuple'> if names: # 判斷收集參數names不爲空值 for name in names: # 循環遍歷names name_list.append(name) # 爲列表添加新元素 lst = [] # 創建空列表 creat_name_list(lst, '小樓老師', '蒼井老師', '吉澤老師', '櫻井老師') # 調用函數並傳入參數 print(lst) # 顯示輸出結果爲:['小樓老師', '蒼井老師', '吉澤老師', '櫻井老師']
在上方的代碼中,大家能夠看到,參數中除了位置參數name_lsit,只設定了一個參數“*names”。
這個names在第2句代碼中,我們獲取到它是一個元組類型。
也就是說,這個收集參數是一個元組類型的變量,它把我們傳入的多個姓名(無論幾個),全部存放在了一個元組中。
然後,我們對names進行循環遍歷,就能夠取出這些姓名,添加到列表中。
到這裏,大家一定都已知道收集參數的設定只需要給變量名稱前面加上一個拼接(Splicing)操作符“*”就可以了。
特別說明:上方代碼中,是在函數外部創建了列表,並作爲參數傳入到函數中。我們也可以在函數內部去創建這個列表,然後通過return語句返回。
示例代碼:
def creat_name_list(*names): # 定義函數並設定參數,*names爲收集參數 print(type(names)) # 顯示輸出參數names的數據類型,結果爲:<class 'tuple'> name_list = list(names) # 將元組names轉換爲列表並存入變量name_list return name_list # 返回列表 lst = creat_name_list('小樓老師', '蒼井老師', '吉澤老師', '櫻井老師') # 調用函數並傳入參數,通過變量接收返回值 print(lst) # 顯示輸出結果爲:['小樓老師', '蒼井老師', '吉澤老師', '櫻井老師']
另外,也可以通過收集參數的方式,靈活的傳入多個關鍵字參數。
設定參數時,在變量名稱前加上拼接操作符“**”即可。
例如,我們通過輸入用戶的姓名、年齡、身高、體重信息,創建一個用戶信息的列表。
示例代碼:
def creat_user(**user_info): # 定義函數並設定參數,*user_info爲收集參數 print(type(user_info)) # 顯示輸出參數user_info的數據類型,結果爲:<class 'dict'> return user_info # 返回參數值 user=creat_user( name='小樓老師',age=18, height='182',weight= '90KG') # 調用函數並傳入參數 print(user) # 顯示輸出結果爲:{'name': '小樓老師', 'age': 18, 'height': '182', 'weight': '90KG'}
在上方代碼中,我們設定了一個收集參數獲取所有傳入的關鍵字參數。
在代碼第二句中,我們能夠獲取到變量user_info的類型爲字典。
那麼,這個字典我們可以直接作爲返回值,通過return語句返回。
——————————————————————–
在之前的案例中,大家能夠看到拼接操作符“*”和“**”在設定參數時的作用。
實際上,這兩個操作符,我們還能夠反過來使用。
示例代碼:
def get_volume(length, width, height): # 定義函數並設定參數 return length * width * height # 返回計算結果 params = (3, 4, 5) # 創建參數元組 print(get_volume(*params)) # 顯示輸出結果爲:60
在上方的示例代碼中,我們定義了一個計算體積的函數,並且設定了固定數量的參數。
然後,我們有一個變量params,是一個元素數量與函數參數數量相等的數組。
當我們調用這個函數時,就無需把數組中的元素取出,而是直接在變量名稱前面加上“*”,做爲參數傳入函數中。
這樣的做法和我們分開傳入參數的結果是一樣的。
當然,“**”也可以類似使用。
例如,我們通過一組用戶信息,返回一個用戶描述的字符串。
示例代碼:
def user_info(name,age,height,sex='男'): # 定義函數並設定參數 info = '姓名-%s 性別-%s 年齡-%s 身高-%s'% (name,sex,age,height) # 格式化字符串 return info # 返回結果 params = {'name': '小樓', 'age': '18', 'height': '180CM'} # 創建參數字典 print(user_info(**params)) # 調用函數,並傳入參數,顯示輸出結果爲:姓名-小樓 性別-男 年齡-18 身高-180CM
本節知識點:
1、函數內部修改外部變量值;
2、使用收集參數,獲取非固定數量的參數;
3、使用拼接操作符。
本節英文單詞與中文釋義:
1、create:創建
2、info:信息
3、age:年齡
4、height:高度
5、width:寬度
6、weight:重量
7、splicing:拼接
8、params:參數
9、volume:體積
練習:從參數(18,7,4,26,8,23,20,17,2,11)中取出所有的偶數。
答案:(見原文評論1樓)
轉載自:魔力 • Python » Python3萌新入門筆記(19)