iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

Python 微進階系列 第 11

Python 微進階 Day11 - function(函式) - 2 - *args、**kwargs、變數

  • 分享至 

  • xImage
  •  

函式

*args**kwargs

  • 當必要的參數缺少未帶入,會跳出錯誤,但反過來過多的引數則可以利用 *args**kwargs 來將多的引數都放在同一個參數上
  • *args**kwargs 的名稱是慣例,非強制,也可以依需求改用其他名稱
  • *args(位置引數)把多的引數打包成 tuple
  • **kwargs(關鍵字引數)把多的關鍵字引數打包成 dict
  • 可以一起使用,但 *args 必須在 **kwargs 前面
  • **kwargs 傳入時的 key 值不可和函式內原本設定的參數名稱重複,會跳錯誤
  • 結合前面章節,一起使用的順序
    • fun(位置參數, 預設值參數, *args, **kwargs)
def foo(x, y , *z):
    total = [x, y, z]
    print(total)

foo(1, 2, 3, 4)
# [1, 2, (3, 4, 5)]
def foo(x, y , **z):
    total = [x, y, z]
    print(total)

foo(1, 2, a=3, b=4, c=5)
# [1, 2, {'a': 3, 'b': 4, 'c': 5}]
def foo(*args, **kwargs):
    print(args, kwargs)

foo (1, 2, a=3, b=5)
(1, 2) {'a': 3, 'b': 5}

變數

  • local(區域變數):在函式內的變數僅在函式內使用,則為 local(區域變數)
    • 使用賦值 =,就代表宣告一個區域變數
  • global(全域變數):在函式內的變數要存取外部的變數,則使用 global 來宣告
    • 要先宣告才能使用,先 global 才賦值 =
    • 全域指的是主程式(當下執行的那個 py 檔)
  • 注意! 若要修改外部變數,建議要明確宣告 global,避免錯誤
    • 在只讀取一個變數來給其它變數使用時,Python 會先在函式內尋找同名變數,如 a = xxx,若沒有則會往外尋找,都沒有就會出現錯誤異常
    • 往外尋找的變數若為可變物件,可能會被一起變更
    • 讀取一個變數,若想變動,卻未明確賦值,例如直接 +=,會因為變動前,未明確賦值而出現錯誤

local

a = 0

def fun():
    a = 1
    print("fun:", a)

fun()
print("global:", a)

# fun: 1
# global: 0
# 同名也沒關係,函式內的 a 為區域變數與外部的 a 無關

global

a = 0

def fun():
    global a
    b = 5
    print("a:", a)
    a = a + b
    print("a:", a)
    print("b:", b)

fun()
print("global:", a)

# a: 0
# a: 5
# b: 5
# global: 5
# a 變成 global 因此外部也跟著改變

讀取與賦值

a = 0

def fun():
    b = a + 1
    print("a:", a)
    print("b:", b)

fun()
print("global:", a)

# a: 0
# b: 1
# global: 0
# a 直接讀取來給 b 使用
a = 0

def fun():
    print("a:", a)
    a = 1

fun()

# 錯誤
# a 有賦值 =,但卻在賦值之前先被讀取
a = [1, 2, 3]

def fun():
    a.append(4)

fun()
print(a)
# [1, 2, 3, 4]
# a 為可動物件,影響到外層
a = [1, 2, 3]

def fun():
    a += [4]

fun()

# 錯誤
# a 要變動(+),但在變動之前卻未明確賦值(=)

小補充

  • 還有一種是 nonlocal 變數,是用在 def 內還有 def,用來指定上一層的變數使用
  • 使用 nonlocal 來宣告
a = 0

def fun():
    a = 1
    def fun2():
        nonlocal a
        a = 2
        print("fun2:", a)
    fun2()
    print("fun:", a)

fun()
print("global:", a)

fun2: 2
fun: 2
global: 0

參考資料

次回

感覺這幾天有點燒腦,喘口氣明天繼續


上一篇
Python 微進階 Day10 - function(函式) - 1 - 參數
下一篇
Python 微進階 Day12 - module(模組)
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言