*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