เรียน Python: การ Pack และ Unpack ค่าของ Tuple หรือ Dictionary ด้วย * และ **
* และ ** มี 2 บทบาทหลักใน Python
- ตอนประกาศฟังก์ชัน (Function Definition) → ใช้ "รวบ" ค่า
- ตอนเรียกฟังก์ชันหรือสร้างข้อมูล (Call/Expression) → ใช้ "แตก" ค่า (Unpack)
หลายคนจำสลับกันช่วงแรก
1. ใน Function Definition = รวบ
def demo(*args, **kwargs):
print(args)
print(kwargs)
เรียก
demo(1, 2, 3, name="John")
ผลลัพธ์
args = (1, 2, 3)
kwargs = {'name': 'John'}
ตรงนี้
*args
**kwargs
คือ "เก็บรวม"
2. ตอนเรียก Function = แตก
มี Tuple
data = (10, 20)
ฟังก์ชัน
def add(a, b):
return a + b
เรียก
add(*data)
Python จะมองเป็น
add(10, 20)
ตรงนี้ * คือ "แตก Tuple"
แตก List ก็ได้
numbers = [1, 2, 3]
print(*numbers)
ผลลัพธ์
1 2 3
เทียบกับ
print(numbers)
ผลลัพธ์
[1, 2, 3]
** ใช้แตก Dict
data = {
"name": "John",
"age": 25
}
ฟังก์ชัน
def create_user(name, age):
print(name, age)
เรียก
create_user(**data)
Python จะมองเป็น
create_user(
name="John",
age=25
)
ความว้าว: ใช้นอก Function ก็ได้
ตั้งแต่ Python 3 เป็นต้นมา
แตก List
a = [1, 2]
b = [3, 4]
c = [*a, *b]
print(c)
ผลลัพธ์
[1, 2, 3, 4]
เหมือน JavaScript Spread Operator มาก
แตก Tuple
a = (1, 2)
b = (3, 4)
c = (*a, *b)
print(c)
ผลลัพธ์
(1, 2, 3, 4)
แตก Set
a = {1, 2}
b = {3, 4}
c = {*a, *b}
print(c)
ผลลัพธ์
{1, 2, 3, 4}
แตก Dict
user = {
"name": "John"
}
extra = {
"age": 25
}
merged = {
**user,
**extra
}
print(merged)
ผลลัพธ์
{
'name': 'John',
'age': 25
}
ถ้า Key ซ้ำกันล่ะ?
a = {
"name": "John"
}
b = {
"name": "Bob"
}
c = {
**a,
**b
}
ผลลัพธ์
{
'name': 'Bob'
}
ตัวหลังชนะ
วิธีจำง่าย ๆ
ให้มองว่า
*
แปลว่า
"แตกสมาชิกออกทีละตัว"
เช่น
(1, 2, 3)
กลายเป็น
1, 2, 3
และ
**
แปลว่า
"แตก key=value ออกมา"
เช่น
{
"name": "John",
"age": 25
}
กลายเป็น
name="John",
age=25
ดังนั้นคู่ที่สวยที่สุดในการจำคือ
| ฝั่งประกาศ | ฝั่งเรียก |
|---|---|
*args | func(*tuple_or_list) |
**kwargs | func(**dict) |
ฝั่งซ้าย = รวบ (Pack)
def func(*args, **kwargs):
ฝั่งขวา = แตก (Unpack)
func(*items, **options)
นี่คือแนวคิดเดียวกันกับที่อยู่เบื้องหลังการ swap ตัวแปร, tuple unpacking, multiple return values และ framework ต่าง ๆ ใน Python ทั้งหมดเลยครับ
ความคิดเห็น
แสดงความคิดเห็น