python基礎7 - 函式2

weixin_30924079發表於2020-04-04

4. 使用元組讓函式返回多個值

  • 利用 元組 同時返回溫度和溼度
def measure():
    """返回當前的溫度"""
    temp = 39
    wetness = 10
    return (temp, wetness)
    
temp, wetness = measure()

 

提示:如果一個函式返回的是元組,括號可以省略

技巧

  • 在 Python 中,可以 將一個元組 使用 賦值語句 同時賦值給 多個變數
  • 注意:變數的數量需要和元組中的元素數量保持一致
result = temp, wetness = measure()

 

面試題 —— 交換兩個數字

  • 解法 2 —— 不使用臨時變數

# 解法 2 - 不使用臨時變數

a = a + b
b = a - b
a = a - b

 

  • 解法 3 —— Python 專有,利用元組
a, b = b, a

 

5. 函式的引數 進階

5.1 不可變和可變的引數

問題 1:在函式內部,針對引數使用 賦值語句,會不會影響呼叫函式時傳遞的 實參變數? —— 不會!

  • 無論傳遞的引數是 可變 還是 不可變
    • 只要 針對引數 使用 賦值語句,會在 函式內部 修改 區域性變數的引用不會影響到外部變數的引用
def demo(num, num_list):
    print("函式內部")
    # 賦值語句
    num = 200
    num_list = [1, 2, 3]
    print(num)
    print(num_list)
    print("函式程式碼完成")


gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

  

問題 2:如果傳遞的引數是 可變型別,在函式內部,使用 方法 修改了資料的內容,同樣會影響到外部的資料

def mutable(num_list):
    # num_list = [1, 2, 3]
    num_list.extend([1, 2, 3])
    print(num_list)

gl_list = [6, 7, 8]
mutable(gl_list)
print(gl_list)

 

** 面試題 —— +=**

  • 在 python 中,列表變數呼叫 += 本質上是在執行列表變數的 extend 方法,不會修改變數的引用
def demo(num, num_list):
    print("函式內部程式碼")
    # num = num + num
    num += num
    # num_list.extend(num_list) 由於是呼叫方法,所以不會修改變數的引用
    # 函式執行結束後,外部資料同樣會發生變化
    num_list += num_list
    print(num)
    print(num_list)
    print("函式程式碼完成")


gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)

 

5.2 預設引數

  • 定義函式時,可以給 某個引數 指定一個預設值,具有預設值的引數就叫做 預設引數
  • 呼叫函式時,如果沒有傳入 預設引數 的值,則在函式內部使用定義函式時指定的 引數預設值
  • 函式的預設引數,將常見的值設定為引數的預設值,從而 簡化函式的呼叫
  • 例如:對列表排序的方法
gl_num_list = [6, 3, 9]
# 預設就是升序排序,因為這種應用需求更多
gl_num_list.sort()
print(gl_num_list)
# 只有當需要降序排序時,才需要傳遞 `reverse` 引數
gl_num_list.sort(reverse=True)
print(gl_num_list)

 

1) 指定函式的預設引數

  • 在引數後使用賦值語句,可以指定引數的預設值
def print_info(name, gender=True):
    gender_text = "男生"
    if not gender:
        gender_text = "女生"

    print("%s 是 %s" % (name, gender_text))

 

提示

  1. 預設引數,需要使用 最常見的值 作為預設值!
  2. 如果一個引數的值 不能確定,則不應該設定預設值,具體的數值在呼叫函式時,由外界傳遞!

2) 預設引數的注意事項

  • 預設引數的定義位置
    • 必須保證 帶有預設值的預設引數 在引數列表末尾
    • 所以,以下定義是錯誤的!
def print_info(name, gender=True, title):

 

3) 呼叫帶有多個預設引數的函式

  • 呼叫函式時,如果有 多個預設引數需要指定引數名,這樣直譯器才能夠知道引數的對應關係!
def print_info(name, title="", gender=True):
    """

    :param title: 職位
    :param name: 班上同學的姓名
    :param gender: True 男生 False 女生
    """

    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s%s 是 %s" % (title, name, gender_text))


# 提示:在指定預設引數的預設值時,應該使用最常見的值作為預設值!
print_info("小明")
print_info("老王", title="班長")
print_info("小美", gender=False)

 

5.3 多值引數

1) 定義支援多值引數的函式

  • 有時可能需要 一個函式 能夠處理的引數 個數 是不確定的,這個時候,就可以使用 多值引數
  • 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, gender=True)

 

提示:多值引數 的應用會經常出現在網路上一些大牛開發的框架中,知道多值引數,有利於我們能夠讀懂大牛的程式碼

2) 多值引數案例 —— 計算任意多個數字的和

  1. 定義一個函式 sum_numbers,可以接收的 任意多個整數
  2. 功能要求:將傳遞的 所有數字累加 並且返回累加結果
def sum_numbers(*args):
    num = 0
    # 遍歷 args 元組順序求和
    for n in args:
        num += n
    return num

print(sum_numbers(1, 2, 3))

 

3) 元組和字典的拆包

  • 在呼叫帶有多值引數的函式時,如果希望:
    • 將一個 元組變數,直接傳遞給 args
    • 將一個 字典變數,直接傳遞給 kwargs
  • 就可以使用 拆包,簡化引數的傳遞,拆包 的方式是:
    • 元組變數前,增加 一個 *
    • 字典變數前,增加 兩個 *
def demo(*args, **kwargs):
    print(args)
    print(kwargs)

# 需要將一個元組變數/字典變數傳遞給函式對應的引數
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
# 會把 num_tuple 和 xiaoming 作為元組傳遞個 args
# demo(gl_nums, gl_xiaoming)
demo(*gl_nums, **gl_xiaoming)

 

6. 函式的遞迴

函式呼叫自身的 程式設計技巧 稱為遞迴

6.1 遞迴函式的特點

特點

  • 一個函式 內部 呼叫自己
    • 函式內部可以呼叫其他函式,當然在函式內部也可以呼叫自己

程式碼特點

  1. 函式內部的 程式碼 是相同的,只是針對 引數 不同,處理的結果不同
  2. 引數滿足一個條件 時,函式不再執行
    • 這個非常重要,通常被稱為遞迴的出口,否則 會出現死迴圈

示例程式碼

def sum_numbers(num):

    print(num)
    
    # 遞迴的出口很重要,否則會出現死迴圈
    if num == 1:
        return

    sum_numbers(num - 1)
    
sum_numbers(3)

 

 

6.2 遞迴案例 —— 計算數字累加

需求

  1. 定義一個函式 sum_numbers
  2. 能夠接收一個 num 的整數引數
  3. 計算 1 + 2 + ... num 的結果
def sum_numbers(num):

    if num == 1:
        return 1
    
    # 假設 sum_numbers 能夠完成 num - 1 的累加
    temp = sum_numbers(num - 1)

    # 函式內部的核心演算法就是 兩個數字的相加
    return num + temp

print(sum_numbers(2))

 

提示:遞迴是一個 程式設計技巧,初次接觸遞迴會感覺有些吃力!在處理 不確定的迴圈條件時,格外的有用,例如:遍歷整個檔案目錄的結構

  

7. LINUX 上的 Shebang 符號(#!)

  • #!這個符號叫做 Shebang 或者 Sha-bang
  • Shebang 通常在 Unix 系統指令碼的中 第一行開頭 使用
  • 指明 執行這個指令碼檔案解釋程式

使用 Shebang 的步驟

1. 使用 which 查詢 python3 直譯器所在路徑

$ which python3

 

2. 修改要執行的 主 python 檔案,在第一行增加以下內容

#! /usr/bin/python3

 

3. 修改 主 python 檔案 的檔案許可權,增加執行許可權

$ chmod +x cards_main.py

 

4. 在需要時執行程式即可

./cards_main.py

 

 

轉載於:https://www.cnblogs.com/UFO-blogs/p/8987006.html

相關文章