*args and **kwarg in Python
*args คือ parameter ที่ใช้รับค่าเข้ามาได้หลายๆค่านะคับ (ไม่มีชื่อ) แบบเราไม่ทราบจำนวนว่าจะมีกี่ arguments (ไม่รู้ล่วงหน้า), data type คือ Tuple เวลาเรียกใช้งาน เรียกจาก index เหมือนกับ List, tuple
**kwargs คือ parameter ที่ใช้รับค่าเข้ามาเช่นกัน (แต่มีชื่อ), data type คือ Dictionary เวลาเรียกใช้งานก้อเรียกจาก “key” เพื่อให้ได้ “value”
จะพูดถึง *args กันก่อนนะคับ เรามาดูตัวอย่างกันเลยดีกว่า
def avg(*args):
print(type(args))
print(args)
print(args[3])
total = 0
for i in args:
total += i
return total / len(args)a = avg(4, 7, 8, 12, 9)
print(a)
print(1,2,3,4,5, sep="-")#========================
<class 'tuple'>
(4, 7, 8, 12, 9)
12
8.0
1-2-3-4-5
จาก snippet code ข้างบนนะคับ จะพบว่าเราจะเขียน parameter args เพียงค่าเดียวเท่านั้น แต่เพราะมี * อยู่ด้านหน้า (* เป็น keyword ให้รู้ว่ารับได้หลายค่า, ส่วน args เราจะใช้คำอะไรมาแทนก็ได้)
ฉะนั้น ในเคสนี้จะให้ print ค่าตามนี้นะคับ
- data type ของ args (ซึ่งจะพบว่า *args มี datatype คือ Tuple)
- ค่าทั้งหมดใน args (ซึ่งจะพบว่า เราสามารถใส่ค่าลงไปใน args กี่ตัวก็ได้)
- ค่า args ตำแหน่งที่ 3 (ในการนับค่า ก็ไล่จาก index 0 นะคับ ฉะนั้น ตำแหน่งที่ 3 จึงมีค่าเท่ากับ 8)
- ค่า a ซึ่งเป็นการหา average จาก total / len(args)
ต่อไปจะเป็นอีกตัวอย่างนึงนะคับ แสดงให้เห็นว่าเราสามารถใส่ parameter อะไรก็ได้ และตัวอย่างของการใส่ unicode ด้วย
ในกรณีที่เราไม่ได้กำหนดค่า default bullet=”\u0049" หรือ เราต้องการเปลี่ยนจากค่า default เราสามารถใส่เพิ่มใน argument ได้เลยนะคับ เช่น
def print_bullet(*items, bullet="\u00A9"):
for e in items:
print("{} {}".format(bullet, e))
print_bullet("lily", "rose", "jasmine", "forget me not", bullet = 'o')
#=================================================================o lily
o rose
o jasmine
o forget me not
ต่อไปมาพูดถึง **kwargs (keyword argument) กันบ้างนะคับ
*kwargs คือ การผ่านค่าแบบ keyword argument นะคับ ซึ่ง datatype จะเป็นแบบ dict นะคับ นั่นคือ จะต้องมีทั้ง key และ value
มาดูตัวอย่างกันนะคับ
def f(**kwargs):
print(type(kwargs))
print(kwargs)
print(kwargs["age"]) # เรียก key "age" จะได้ value: 21f(name="Peter", age=21, hero="Spiderman")#========================================
<class 'dict'>
{'name': 'Peter', 'age': 21, 'hero': 'Spiderman'}
21
keyword arguments ที่ใส่เข้ามาจะถูกแปลงเป็น key และ value นะคับ ฉะนั้นการเข้าถึง value จึงต้องเรียกไปที่ “key”
ต่อไปมาดูอีกตัวอย่างนะคับ
จากรูปจะเห็นว่าใช้ **part แทน **kwargs ได้เลย และเราสามารถเรียกใช้งาน function full_name ได้หลายครั้งเลย โดยใน function จะมี if k in parts คอยทำหน้าที่เช็คว่าเป็นค่าที่อยู่ใน parts หรือไม่ ไม่อย่างงั้นจะมี error (Key Error: ‘middle_name’) ที่เกิดจากที่ เรียก key แล้วไม่เจอ
ดูอีก used case
นึงนะ
แล้วพบกันตอนถัดไปครับ
GRASSROOT ENGINEER