Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Packing และ Unpacking Arguments ใน Python: *args และ **kwargs

*args และ **kwargs เป็นไวยากรณ์สำคัญใน Python สำหรับรับ/ส่งอาร์กิวเมนต์จำนวนไม่กำหนด

Packing: รวมอาร์กิวเมนต์เข้าด้วยกัน

ใน Function Definition ใช้ * รวม positional args เป็น tuple, ** รวม keyword args เป็น dict

def func(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

func(1, 2, 3, a=4, b=5)
# args: (1, 2, 3)
# kwargs: {'a': 4, 'b': 5}

Unpacking: แยก tuple/dict กลับเป็นอาร์กิวเมนต์

ใน Function Call ใช้ * แยก tuple/list, ** แยก dict

def func1(x, y, z):
    print(x, y, z)

# Unpack list/tuple
args = [1, 2, 3]
func1(*args)  # 1 2 3

# Unpack dict
kwargs = {'x': 1, 'y': 2, 'z': 3}
func1(**kwargs)  # 1 2 3

แก้ปัญหา: ส่ง list ไปฟังก์ชันที่รับ 3 อาร์กิวเมนต์

def func(a, b, c):
    print(a, b, c)

lst = ['python', 'java', 'csharp']
func(*lst)  # python java csharp
# func(lst) จะ error: missing 2 arguments

ประยุกต์: ฟังก์ชันรับจำนวนอาร์กิวเมนต์ไม่จำกัด

def Sum(*args):
    total = 0
    for i in args:
        total += i
    return total

print(Sum(9, 12))           # 21
print(Sum(2, 3, 4, 5, 6))   # 20
print(Sum(20, 30, 40, 12, 40, 54))  # 196

Packing + Unpacking ร่วมกัน: แก้ไขอาร์กิวเมนต์ระหว่างทาง

def func1(x, y, z):
    print("Arg1:", x)
    print("Arg2:", y)
    print("Arg3:", z)

def func2(*args):
    args = list(args)      # แปลง tuple → list เพื่อแก้ไขได้
    args[0] = 'Hello'
    args[1] = 'TutorialsPoint'
    func1(*args)           # unpack กลับไป

func2("I", "Love", "Coding")
# Arg1: Hello
# Arg2: TutorialsPoint
# Arg3: Coding

**kwargs สำหรับ Dictionary

def func(x, y, z):
    print(x, y, z)

d = {'x': 27, 'y': 54, 'z': 81}
func(**d)  # 27 54 81

Use Cases จริง

  • Decorator / Wrapper functions
  • Web frameworks (Django, Flask) ส่ง arguments ไป view functions
  • Socket programming: ส่ง request จำนวนไม่จำกัด
  • Library code ที่ต้อง flexible