1. 程式人生 > >Python_從零開始學習_(32) 函式引數和返回值

Python_從零開始學習_(32) 函式引數和返回值

目錄

 

1.  函式引數和返回值的作用

 2.  函式的返回值 進階

3.  函式的引數 進階


1.  函式引數和返回值的作用

函式根據 有沒有引數 以及 有沒有返回值 , 可以 相互相合,  一共有 4 種 組合形式

  1. 無引數, 無返回值
  2. 無引數, 有返回值
  3. 有引數, 無返回值
  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. 如果一個引數的值 不能確定, 則不應該設定預設值, 具體的數值在呼叫函式時, 由外界傳遞!

 預設引數的注意事項

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}