ปัญหา
ต้องการเขียนฟังก์ชันที่รับจำนวนอาร์กิวเมนต์ไม่จำกัด (any number of arguments)
โซลูชัน
1. รับ positional arguments ไม่จำกัดด้วย *args
*rest_arg จะเป็น tuple ของอาร์กิวเมนต์เพิ่มเติมทั้งหมด
def define_average(first_arg, *rest_arg):
average = (first_arg + sum(rest_arg)) / (1 + len(rest_arg))
print(f"Output \n *** The average for the given numbers {average}")
define_average(1, 2) # 1.5
define_average(1, 2, 3, 4) # 2.5
2. รับ keyword arguments ไม่จำกัดด้วย **kwargs
**player_titles จะเป็น dictionary ของ keyword arguments
def player_stats(player_name, player_country, **player_titles):
print(f"Type of player_titles: {type(player_titles)}") # dict
titles = ' AND '.join(f'{key} : {value}' for key, value in player_titles.items())
stats = 'The player - {name} from {country} has {titles}'.format(
name=player_name, country=player_country, titles=titles)
return stats
player_stats('Roger Federer', 'Switzerland', Grandslams=20, ATP=103)
# 'The player - Roger Federer from Switzerland has Grandslams : 20 AND ATP : 103'
3. รับทั้ง positional และ keyword ด้วย *args และ **kwargs
def func_anyargs(*args, **kwargs):
print(args) # tuple
print(kwargs) # dict
Positional arguments ทั้งหมดอยู่ใน tuple args, keyword arguments ทั้งหมดอยู่ใน dict kwargs
สรุป
*args→ tuple ของ positional arguments**kwargs→ dict ของ keyword arguments- รวมกันได้:
def func(*args, **kwargs) - เรียกใช้:
func(1, 2, 3, a=4, b=5)→ args=(1,2,3), kwargs={'a':4,'b':5}