آموزش پایتون - آرگومانهای اختیاری و متغیر
آرگومانهای اختیاری و متغیر (*args)
ممکن است بخواهید تابعی تعریف کنید که قادر به پذیرش تعداد متغیر یا دلخواهی از آرگومانها باشد. علاوه بر این، این تعداد دلخواه از آرگومانها ممکن است از نوع موقعیتی (positional) یا کلید-مقداری (keyword arguments) باشند.
-
آرگومانی که پیشوند آن یک ستاره * است برای آرگومانهای موقعیتی متغیر استفاده میشود.
-
آرگومانی که پیشوند آن دو ستاره ** است برای آرگومانهای کلید-مقداری متغیر استفاده میشود.
مثالی از آرگومانهای متغیر
در ادامه مثالی از آرگومانهای موقعیتی با طول متغیر یا دلخواه آورده شده است −
# sum of numbers
def add(*args):
s=0
for x in args:
s=s+x
return s
result = add(10,20,30,40)
print (result)
result = add(1,2,3)
print (result)
متغیر args که پیشوند "*" دارد، تمام مقادیر پاس داده شده به خود را ذخیره میکند. در اینجا args به یک تاپل (tuple) تبدیل میشود. میتوانیم یک حلقه روی آیتمهای آن اجرا کنیم تا اعداد را با هم جمع کنیم.
این کد خروجی زیر را تولید خواهد کرد −
100
6
آرگومانهای اجباری همراه با آرگومانهای متغیر
همچنین امکان داشتن تابعی وجود دارد که چند آرگومان اجباری قبل از توالیِ مقادیرِ با تعداد متغیر داشته باشد.
مثال
مثال زیر دارای تابع avg() است. فرض کنید یک دانشآموز میتواند در هر تعداد آزمونی شرکت کند. آزمون اول اجباری است. او میتواند در هر تعداد آزمونی که میخواهد شرکت کند تا نمره خود را بهبود ببخشد. این تابع میانگین نمرات آزمون اول و بیشترین نمره او در مابقی آزمونها را محاسبه میکند.
این تابع دارای دو آرگومان است؛ اولی آرگومان اجباری و دومی برای نگهداری هر تعداد مقدار دیگر است.
#avg of first test and best of following tests
def avg(first, *rest):
second=max(rest)
return (first+second)/2
result=avg(40,30,50,25)
print (result)
فراخوانی تابع avg() در ادامه، اولین مقدار را به آرگومان اجباری first و مقادیر باقیمانده را به تاپلی به نام rest منتقل میکند. سپس بیشترین مقدار را پیدا کرده و از آن برای محاسبه میانگین استفاده میکنیم.
این کد خروجی زیر را تولید خواهد کرد −
45.0
آرگومانهای کلید-مقداری متغیر (**kwargs)
اگر متغیری در لیست آرگومانها دارای دو ستاره به عنوان پیشوند باشد، تابع میتواند تعداد دلخواهی از آرگومانهای کلید-مقداری را بپذیرد. این متغیر به یک دیکشنری از جفتهای کلید:مقدار تبدیل میشود.
مثال
کد زیر مثالی از تابعی با آرگومانهای کلید-مقداری متغیر است. تابع addr() دارای آرگومان **kwargs است که میتواند هر تعداد از عناصر آدرس مانند نام، شهر، شماره تلفن، کد پستی و غیره را بپذیرد. در داخل تابع، دیکشنری kwargs که شامل جفتهای کلید:مقدار است با استفاده از متد items() پیمایش میشود.
def addr(**kwargs):
for k,v in kwargs.items():
print ("{}:{}".format(k,v))
print ("pass two keyword args")
addr(Name="John", City="Mumbai")
print ("pass four keyword args")
# pass four keyword args
addr(Name="Raam", City="Mumbai", ph_no="9123134567", PIN="400001")
این کد خروجی زیر را تولید خواهد کرد −
pass two keyword args
Name:John
City:Mumbai
pass four keyword args
Name:Raam
City:Mumbai
ph_no:9123134567
PIN:400001
آرگومانهای متعدد همراه با آرگومانهای کلید-مقداری متغیر
اگر تابع از انواع مختلفی از آرگومانها استفاده میکند، آرگومانهای کلید-مقداری متغیر باید بعد از آرگومانهای موقعیتی، کلید-مقداری و آرگومانهای موقعیتی متغیر در لیست آرگومانها قرار گیرند.
مثال
حالت را تصور کنید که در آن دروس علوم و ریاضی اجباری هستند و علاوه بر آنها دانشآموز میتواند هر تعداد درس اختیاری را انتخاب کند.
کد زیر یک تابع percent() تعریف میکند که در آن نمرات علوم و ریاضی در آرگومانهای اجباری، و نمرات مربوط به تعداد متغیر دروس اختیاری در آرگومان **optional ذخیره میشوند.
def percent(math, sci, **optional):
print ("maths:", math)
print ("sci:", sci)
s=math+sci
for k,v in optional.items():
print ("{}:{}".format(k,v))
s=s+v
return s/(len(optional)+2)
result=percent(math=80, sci=75, Eng=70, Hist=65, Geo=72)
print ("percentage:", result)
این کد خروجی زیر را تولید خواهد کرد −
maths: 80
sci: 75
Eng:70
Hist:65
Geo:72
percentage: 72.4
پیشرفت مطالعه: وضعیت خواندهشدن این درس فقط در همین مرورگر ذخیره میشود؛ بدون نیاز به حساب کاربری.