به آموزشگاه مجازی سینا خوش آمدید!

آموزش پارامترهای args* و kwargs** در پایتون

امتیاز
(0)

به طور پیش‌فرض، وقتی که می‌خواهیم یک تابع را صدا بزنیم(فراخوانی کنیم)، باید آرگومان‌های صحیحی را برای آن مشخص کنیم. اما، گاهی اوقات ممکن است ندانیم که باید چه تعداد آرگومان به این تابع (پاس) بدهیم. پارامترهای *args و **kwargs به تابع‌ها امکان می‌دهند تا تعداد نامعلومی آرگومان را بپذیرند. 


آرگومان‌های دلخواه(Arbitrary Arguments) با دستور *args 

اگر نمی‌دانید که چه تعداد آرگومان قرار است به تابع شما پاس داده شود، یک علامت ستاره(*) را قبل از نام پارامتر مورد نظر قرار دهید. به این طریق، تابع ما یک تاپل از آرگومان‌ها را دریافت می‌کند و بر طبق آن، می‌تواند به این آیتم‌ها(یعنی به مقدار آرگومان‌ها) دسترسی داشته باشد:

مثال شماره 1

استفاده از *args برای پذیرفتن هر تعداد از آرگومان‌ها:

def my_function(*kids):
  print("The youngest child is " + kids[2])

my_function("Emil", "Tobias", "Linus")

نتیجه:

The youngest child is Linus
امتحان کنید

نکته: در مستندات پایتون، اغلب از *args بعنوان خلاصه‌ی عبارت Arbitrary Arguments (آرگومان‌های دلخواه) استفاده می‌شود. 


دستور *args چیست؟

پارامتر *args به یک تابع امکان می‌دهد تا هر تعداد آرگومان موقعیت‌دار(positional arguments) را بپذیرد. در درون تابع، دستور args به یک تاپل تبدیل می‌شود که حاوی تمام آرگومان‌های پاس داده شده می‌باشد:

مثال شماره 2

دسترسی به آرگومان‌های شخصی از طریق *args:

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")

نتیجه:

Type: <class 'tuple'>
First argument: Emil
Second argument: Tobias
All arguments: ('Emil', 'Tobias', 'Linus')
امتحان کنید

استفاده از *args به همراه آرگومان‌های عادی(Regular Arguments)

ما می‌توانیم پارامترهای عادی را با *args ترکیب کنیم. پارامترهای عادی، باید قبل از *args قرار گیرند:

مثال شماره 3

def my_function(greeting, *names):
  for name in names:
    print(greeting, name)

my_function("Hello", "Emil", "Tobias", "Linus")

نتیجه:

Hello Emil
Hello Tobias
Hello Linus
امتحان کنید

در این مثال، "Hello" به پارامتر greeting انتساب پیدا می‌کند و بقیه در داخل پارامتر names قرار می‌گیرند. 


دو تمرین عملی با استفاده از *args

*args وقتی مفید است که بخواهیم تابع‌های انعطاف‌پذیر ایجاد کنیم:

مثال شماره 4

یک تابع که جمع اعدادی که به آن می‌دهیم را محاسبه می‌کند:

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))

نتیجه:

6
100
5
امتحان کنید

مثال شماره 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))

نتیجه:

9
امتحان کنید

آرگومان‌های کلمه‌ی‌کلیدی‌دلخواه - **kwargs

اگر نمی‌دانید چه تعداد آرگومانِ کلمه‌ی کلیدی(keyword arguments) قرار است به تابع شما پاس داده شود، دو علامت ستاره(**) را قبل از نام پارامتر مورد نظر قرار دهید. به این طریق، تابع ما یک دیکشنری از آرگومان‌ها دریافت می‌کند و بر این اساس، می‌تواند به آیتم‌ها دسترسی پیدا کند:

مثال شماره 6

استفاده از **kwargs برای پذیرفتن هر تعداد آرگومان کلمه‌ی‌کلیدی:

def my_function(**kid):
  print("His last name is " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

نتیجه:

His last name is Refsnes
امتحان کنید

نکته: در مستندات پایتون، آرگومان‌های کلمه‌ی کلیدی دلخواه(Arbitrary Keyword Arguments)، اغلب به صورت خلاصه شده‌ی **kwargs نشان داده می‌شوند. 


پارامتر **kwargs چیست؟

پارامتر **kwargs به یک تابع امکان می‌دهد تا هر تعداد آرگومانِ کلمه‌ی کلیدی(keyword arguments) که لازم داشته باشد را بپذیرد. پارامتر kwargs در درون تابع به یک دیکشنری تبدیل می‌شود که حاوی تمام آرگومان‌های کلمه‌ی کلیدی می‌باشد:

مثال شماره 7

دسترسی به مقادیر **kwargs:

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")

نتیجه:

Type: <class 'dict'>
Name: Tobias
Age: 30
All data: {'name': 'Tobias', 'age': 30, 'city': 'Bergen'}
امتحان کنید

استفاده از **kwargs با آرگومان‌های عادی(Regular Arguments)

ما می‌توانیم پارامترهای عادی را با پارامتر **kwargs ترکیب کنیم. پارامترهای عادی، باید قبل از پارامتر **kwargs قرار گیرند:

مثال شماره 8

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")

نتیجه:

Username: emil123
Additional details:
age: 25
city: Oslo
hobby: coding
امتحان کنید

ترکیب *args و **kwargs

ما می‌توانیم از *args و **kwargs در یک تابع استفاده کنیم. ترتیب قرارگیری باید به صورت زیر باشد:

  1. پارامترهای عادی
  2. *args
  3. **kwargs

مثال شماره 9

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")

نتیجه:

Title: User Info
Positional arguments: ('Emil', 'Tobias')
Keyword arguments: {'age': 25, 'city': 'Oslo'}
امتحان کنید

باز کردن آرگومان‌ها(Unpacking Arguments)

ما همچنین می‌توانیم از عملگرهای * و ** به هنگام صدا زدن(فراخوانی) تابع‌ها، برای باز کردن(unpack) یک لیست یا دیکشنری، (و دادن مقادیر آنها) به آرگومان‌های جداگانه، استفاده کنیم. 

باز کردن(unpack) لیست‌ها با *

اگر مقادیری دارید که در داخل یک لیست ذخیره شده‌اند، می‌توانید از عملگر * برای باز کردن(unpack) آنها به صورت آرگومان‌های تکی، استفاده کنید:

مثال شماره 10

استفاده از * برای باز کردن(unpack) یک لیست بعنوان آرگومان‌ها:

def my_function(a, b, c):
  return a + b + c

numbers = [1, 2, 3]
result = my_function(*numbers)
print(result)

نتیجه:

6
امتحان کنید

باز کردن(unpack) دیکشنری‌ها با **

اگر تعدادی آرگومانِ کلمه‌ی کلیدی(keyword arguments) دارید که در داخل یک دیکشنری ذخیره شده‌اند، می‌توانید از عملگر ** برای باز کردن(unpack) آنها استفاده کنید:

مثال شماره 11

استفاده از عملگر ** برای باز کردن(unpack) یک دیکشنری به صورت آرگومان‌های کلمه‌ی کلیدی(keyword arguments):

def my_function(fname, lname):
  print("Hello", fname, lname)

person = {"fname": "Emil", "lname": "Refsnes"}
my_function(**person)

نتیجه:

Hello Emil Refsnes
امتحان کنید

نکته: از عملگرهای *  و ** در تعریف تابع‌ها استفاده کنید، تا آرگومان‌ها را جمع‌آوری کنید و از آنها در صدا زدنِ(فراخوانی) تابع‌ها، برای باز کردن(unpack) آرگومان‌ها استفاده کنید. 

 


منبع: www.w3schools.com/python

 

  • بازدید: 29

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال