*args / **kwargs
وقتی نمی دانیم چند ورودی می آید، از *args و **kwargs کمک می گیریم. «آرگومان (Argument)» همان ورودی تابع است. با *args هر تعداد موقعیتی می گیریم؛ با **kwargs هر تعداد کلیدی می گیریم. مثل فرم آنلاین که گزینه های اضافی را جمع می کند.
*args چیست؟
با ستاره قبلِ نام پارامتر، همه آرگومان های موقعیتی در یک «تاپل (Tuple)» جمع می شوند.
def my_function(*kids):
print("The youngest child is " + kids[2])
my_function("Emil", "Tobias", "Linus")
def my_function(*args):
print("Type:", type(args))
print("First argument:", args[0])
print("Second argument:", args[1])
print("All arguments:", args)
my_function("Emil", "Tobias", "Linus")
ترکیب پارامتر عادی با *args
پارامترهای معمولی باید قبل از *args بیایند. بقیه در تاپل می افتند.
def my_function(greeting, *names):
for name in names:
print(greeting, name)
my_function("Hello", "Emil", "Tobias", "Linus")
*args در عمل
انعطاف عالی می دهد؛ مثل جمع هر تعداد عدد دلخواه.
def my_function(*numbers):
total = 0
for num in numbers:
total += num
return total
print(my_function(1, 2, 3))
print(my_function(10, 20, 30, 40))
print(my_function(5))
def my_function(*numbers):
if len(numbers) == 0:
return None
max_num = numbers[0]
for num in numbers:
if num > max_num:
max_num = num
return max_num
print(my_function(3, 7, 2, 9, 1))
**kwargs چیست؟
با دو ستاره، همه «آرگومان های کلیدی» در یک «دیکشنری (Dict)» جمع می شوند.
def my_function(**kid):
print("His last name is " + kid["lname"])
my_function(fname = "Tobias", lname = "Refsnes")
def my_function(**myvar):
print("Type:", type(myvar))
print("Name:", myvar["name"])
print("Age:", myvar["age"])
print("All data:", myvar)
my_function(name = "Tobias", age = 30, city = "Bergen")
ترکیب پارامتر عادی با **kwargs
پارامترهای معمولی باید اول بیایند. سپس **kwargs می آید.
def my_function(username, **details):
print("Username:", username)
print("Additional details:")
for key, value in details.items():
print(" ", key + ":", value)
my_function("emil123", age = 25, city = "Oslo", hobby = "coding")
*args و **kwargs با هم
ترتیب مهم است: عادی ← سپس *args ← سپس **kwargs.
def my_function(title, *args, **kwargs):
print("Title:", title)
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
my_function("User Info", "Emil", "Tobias", age = 25, city = "Oslo")
باز کردن آرگومان ها هنگام فراخوانی
باز کردن لیست با *
می توان لیست را موقع فراخوانی پخش کرد تا جدا جدا برود.
def my_function(a, b, c):
return a + b + c
numbers = [1, 2, 3]
result = my_function(*numbers)
print(result)
باز کردن دیکشنری با **
کلیدها به نام پارامترها می خورند. مقدارها هم ارسال می شوند.
def my_function(fname, lname):
print("Hello", fname, lname)
person = {"fname": "Emil", "lname": "Refsnes"}
my_function(**person)
نکته: در تعریف تابع، * و ** «جمع کننده» هستند؛ در فراخوانی تابع، «بازکننده» هستند. ادامه بحث ورودی ها را در آرگومان ها و پایه توابع را در توابع ببین. برای محدوده متغیرها، به Scope سر بزن.
گام های عملی
- تابعی با *args بساز و جمع برگردان.
- تابعی با **kwargs بساز و کلیدها را چاپ کن.
- هر دو را ترکیب کن و ترتیب را رعایت کن.
جمع بندی سریع
- *args همه موقعیتی ها را تاپل می کند.
- **kwargs همه کلیدی ها را دیکشنری می کند.
- ترتیب: عادی، سپس *args، سپس **kwargs.
- * و ** در تعریف جمع می کنند؛ در فراخوانی باز می کنند.