Python_從零開始學習_(32) 函式引數和返回值
阿新 • • 發佈:2018-11-02
目錄
1. 函式引數和返回值的作用
函式根據 有沒有引數 以及 有沒有返回值 , 可以 相互相合, 一共有 4 種 組合形式
- 無引數, 無返回值
- 無引數, 有返回值
- 有引數, 無返回值
- 有引數, 有返回值
2. 函式的返回值 進階
- 在程式開發中, 有時候, 會希望 一個函式執行結束後, 告訴呼叫者一個結果
- 返回值 是函式 完成工作後, 最後 給呼叫者的 一個結果
- 在函式中適用 return 關鍵字可以返回結果
- 呼叫函式一方, 可以 使用變數 來 接收 函式的返回結果
問題: 一個函式執行後能否返回多個結果?
示例
def measure(): """測量溫度和溼度""" print("測量開始...") temp = 39 wetness = 50 print("測量結束...") # 元組-可以包含多個數據,因此可以使用元組讓函式一次返回多個值 # 如果函式返回的型別時元組, 小括號可以省略 # return (temp, wetness) return temp, wetness result = measure() # 元組 print(result) # 需要單獨的處理溫度或者溼度 - 不方便 print(result[0]) print(result[1]) # 如果函式返回的型別時元組, 同時希望單獨的處理元組中的元素 # 可以使用多個變數, 一次接收函式的返回結果 -- 推薦 # 注意: 使用多個變數接收結果時, 變數的個數應該和元組中的元素的個數保持一致 gl_temp, gl_wetness = measure() print(gl_temp) print(gl_wetness)
數字交換示例
# 需求:a, b 數字交換
a = 6
b = 100
# 1. 使用其他變數
c = a
a = b
b = c
# 2. 不使用其他變數
a = a + b
b = a - b
a = a - b
# 3. 元組, 括號可以省略(Python專有)
a, b = b, a
print(a)
print(b)
3. 函式的引數 進階
3.1 不可變和可變的引數
問題1: 在函式內部, 針對引數使用 賦值語句, 會不會影響呼叫函式傳遞的 實參變數? -- 不會!
- 無論傳遞的引數是 可變
- 只要 針對引數 使用 賦值語句, 會在 函式內部 修改 區域性變數的引用, 不會影響到 外部變數的引用
def demo(num, num_list):
print("函式內部的程式碼")
# 在函式內部, 針對引數使用賦值語句, 不會修改到外部的實參變數
num = 100
num_list = [4, 5, 6]
print(num)
print(num_list)
print("函式執行完成")
gl_num = 99
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
問題2: 如果傳遞的引數是 可變型別, 在函式內部, 使用 方法 修改了資料的內容, 同樣會影響到外部的資料
def demo(num_list):
print("函式內部的程式碼")
# 使用方法修改列表的內容
num_list.append(4)
print(num_list)
print("函式執行完成")
gl_list = [1, 2, 3]
demo(gl_list)
print(gl_list)
- 在 python 中, 列表變數呼叫 += 本質上是在執行列表變數的 extend 方法, 不會修改變數的引用
def demo(num, num_list):
print("函式內部的程式碼")
# 使用方法修改列表的內容
num += num
# 本質上是在動用列表的 extend 方法
num_list += num_list
print(num)
print(num_list)
print("函式執行完成")
gl_num = 2
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
# 函式執行結果
# 4
# [1, 2, 3, 1, 2, 3]
# 函式執行完成
# 2
# [1, 2, 3, 1, 2, 3]
3.2 預設引數
- 定義函式時, 可以給 某個引數 指定一個 預設值, 具有預設值的引數就叫做 預設引數
- 呼叫函式時, 如果沒有傳入 預設引數 的值, 則在函式內部使用定義函式時指定的 引數預設值
- 函式的預設引數, 將常見的值設定為引數的預設值, 從而 簡化函式的呼叫
- 例如 : 對列表排序的方法
gl_list = [1, 2, 3, 6, 5, 4]
# 預設按照升序排序
# gl_list.sort()
# 如果需要降序排序, 需要傳遞 reverse 引數
gl_list.sort(reverse=True)
print(gl_list)
指定函式的預設引數
- 在引數後使用賦值語句, 可以指定引數的預設值
def print_info(name, gender=True):
"""
:param name: 姓名
:param gender: True 男生 False 女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" % (name, gender_text))
# 假設預設男生多
# 提示: 在指定預設引數的預設值時, 應該使用最常見的值作為預設值!
print_info("xiaoming")
print_info("xiaoxue", False)
提示
- 預設引數, 需要使用 最常見的值 作為預設值!
- 如果一個引數的值 不能確定, 則不應該設定預設值, 具體的數值在呼叫函式時, 由外界傳遞!
預設引數的注意事項
1) 預設引數的定義位置
- 必須保證 帶有預設值的預設引數 在引數列表末尾
2) 呼叫帶有多個預設引數的函式
- 在 呼叫函式時, 如果有 多個預設引數, 需要指定引數名, 這樣直譯器才能夠知道引數的對應關係!
3.3 多值引數
定義支援多值引數的函式
- 有時可能需要 一個函式 能夠處理的引數 個數 是不確定的, 這個時候, 就可以使用 多值引數
- python 中有 兩種 多隻引數:
- 引數名前增加 一個 * 可以接收 元組
- 引數名前增加 兩個 * * 可以接收 字典
- 一般在給多值引數命名時, 習慣使用一下兩個名字
- *args ---- 存放 元組 引數, 前面有一個 *
- **kwargs ---- 存放 字典 引數, 前面有兩個 *
- args 是 arguments 的縮寫, 有變數的含義
- kw 是 keyword 的縮寫, kwargs 可以記憶 鍵值對引數
def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age="18")
# 打印出來的結果
# 1
# (2, 3, 4, 5)
# {'name': '小明', 'age': '18'}
提示: 多值引數 的應用匯經常出現在網路上一些大牛開發的框架中, 知道多值引數, 有利於我們能夠讀懂大牛的程式碼
多值求和:
def sum_numbers(*args):
num = 0
print(args)
# 迴圈遍歷
for n in args:
num += n
return num
result = sum_numbers(1, 2, 3)
print(result)
元組和字典的拆包
- 在呼叫帶有多值引數的函式時, 如果希望:
- 將一個 元組變數, 直接傳遞給 args
- 將一個 字典變數, 直接傳遞給 kwargs
- 就可以使用 拆包, 簡化引數的傳遞, 拆包 的方式是:
- 在 元組變數前, 增加 一個 *
- 在 字典變數前, 增加 兩個*
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 元組變數/字典變數
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}
demo(gl_nums, gl_dict)
# 列印結果 -- 都傳給了args
# ((1, 2, 3), {'name': '小明', 'age': 18})
# {}
# 兩者相同
demo(*gl_nums, **gl_dict) # 拆包語法
demo(1, 2, 3, name="小明", age=18) # 常規寫法
# 列印結果
# (1, 2, 3)
# {'name': '小明', 'age': 18}