*args and **kwarg in Python

Grassroot Engineer
2 min readFeb 8, 2020

--

*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 ด้วย

รหัส 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: 21
f(name="Peter", age=21, hero="Spiderman")#========================================
<class 'dict'>
{'name': 'Peter', 'age': 21, 'hero': 'Spiderman'}
21

keyword arguments ที่ใส่เข้ามาจะถูกแปลงเป็น key และ value นะคับ ฉะนั้นการเข้าถึง value จึงต้องเรียกไปที่ “key”

ต่อไปมาดูอีกตัวอย่างนะคับ

**kwargs example

จากรูปจะเห็นว่าใช้ **part แทน **kwargs ได้เลย และเราสามารถเรียกใช้งาน function full_name ได้หลายครั้งเลย โดยใน function จะมี if k in parts คอยทำหน้าที่เช็คว่าเป็นค่าที่อยู่ใน parts หรือไม่ ไม่อย่างงั้นจะมี error (Key Error: ‘middle_name’) ที่เกิดจากที่ เรียก key แล้วไม่เจอ

ดูอีก used case นึงนะ

ถ้าใช้ **kwargs อย่างเดียว เราจะมองไม่เห็น required params นะ

แล้วพบกันตอนถัดไปครับ
GRASSROOT ENGINEER

--

--

Grassroot Engineer
Grassroot Engineer

Written by Grassroot Engineer

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com

No responses yet