چگونه پارامترهای فانکشن در پایتون را positional، keyword یا هر دو قرار دهیم؟

آموزش پارامترهای پایتون

با انتشار پایتون ۳.۸ ، در حال حاضر امکان تعریف فانکشن با پارامترهای فقط positional، فقط keyword یا keyword optional وجود دارد.

بیاید به این بپردازیم که فانکشن و انواع پارامتر های آن چه هستند و د رانتها چگونه پارامتر ها را به عنوان positional، keyword یا غیره تعریف کنیم.

فانکشن function – تابع چیست ؟

به صورت خلاصه:

تابع به سری ای از تعدادی دستور که مکررا می توانند فراخوانی شوند گفته می شود.

به این فکر کنید که تعریف فانکشن – تابع به عنوان یه جعبه سیاه باشد به این معنی که هر چه در تابع انجام می شود، داخل همان تابع می ماند. استثنا در این قانون این می باشد که ورودی های مشخص (پارامتر نامهده می شوند) و خروجی مشخص (return نامیده می شود) نیز وجود دارد.

از فانکشن ها برای تمیز بودن کد و همچنین راحتی و آسانی در نگهداری از کد استفاده میشود.

انواع پارامتر های تابع – function

زمانی که تابعی می سازیم، به متغیر هایی که مقادیری که به آنها داده می شوند را نگه می دارند، پارامتر گفته می شود.

به صورت سنتی، ترتیب لیست پارامتر ها حیاتی و مهم هستند که با ترتیب آرگومان ها یکی باشد. این پارامتر های positional نامیده می شوند. به مثال زیر توجه کنید . تو تعریف تابع آرگومان اول a و به ترتیب آرگومان آخر c می باشد. ترتیب پارامتر های ورودی نیز به همین ترتیب می باشد. پس اولین پارامتر همان a می باشد.

def myFunction(a,b,c):
   print(a,b,c)
myFunction(1,2,3) # 1,2,3

در پایتون، پارامتر های positional می توانند به عنوان پارامتر keyword نیز باشند. در این سناریو، نام پارامتر ها زمان فراخوانی تابع-function نیز آورده می شود.در نتیجه صریحا مشخص می شود که کدام مقدار کجا باید برود. به مثال زیر توجه کنید:

def myFunction(a,b,c):
   print(a,b,c)
myFunction(b=2,c=3,a=1) 1,2,3

همچیننی این امکان وجود دارد که مقدار پیش فرض برای یک پارامتر تعریف شود، در نتیجه اون پارامت را به صورت optional در آورده ایم، مثال زیر را ملاحظه کنید :

def myFunction(a,b,c=None):
   print(a,b,c)
myFunction(1,2,3) # 1,2,3
myFunction(1,2)   # 1,2,None

استفاده از آرگومان های keyword زمانی کمک کننده می باشد که تعدادی از پارامترهای تابع optionalباشند و شما فقط بخواهید که پارامتر های مشخصی را به تایع دهید:

def myFunction(a,b,c=None,d=None):
   print(a,b,c,d)
myFunction(1,2,d=4) # 1,2,None,4
# no need to pass a value for c

توجه داشته باشید زمانی که آرگومان ها به صورت پیش فرض به صورت positional در نظر گرفته می شوند، همین که یکی از آرگومان ها به صورت keyword داده شد، تمامی آرگومان های دیگر در فراخوانی باید به صورت keyword استفاده شوند.

def myFunction(a,b,c):
   print(a,b,c)
myFunction(1,b=2,3) # will cause an error
# SyntaxError: positional argument follows keyword argument

این انعظاف پذیری با اثرات و نگرانی هایی آورده شده است. در مثال قبلی اگر ما نام پارامتر های داخل فانکشن را تغییر دهیم، فراخوانی تابع با پارامترهای keword دار دچار ارور خواهد شد.

def myFunction(x,y,z):
   print(a,b,c)
myFunction(1,2,3)       # still works with new definition
myFunction(c=3,b=2,a=1) # this is no longer valid

چگونه پارامترها را positional، Keyword یا هر دو قرار دهیم؟

با شروع پایتون ۳.۸، در حال حاضر امکانش هست که صریحا پارامتر ها را به عنوان فقط positional یا keyword آپشنال یا فقط keyword تعریف کنیم.

با استفاده از نشان های * و / :

پارامترها، ویژگی های پایه فوق الذکر را با توجه به این که نسبت به نشان کجا هستند، خواهند داشت.

positional only / keyword optional * keyword only

خب به صورت عملی این موضوع رو در زیر خواهیم دید که ما a را به صورت فقط positional و b را به صورت keyword آپشنال و c را به صورت فقط keyword خواهیم کرد

def myFunction(a,/,b,*,c):
   print(a,b,c)
myFunction(1,2,3) 
# TypeError: myFunction() takes 2 positional arguments but 3 were given
myFunction(a=1,b=2,c=3) 
# TypeError: myFunction() got some positional-only arguments passed as keyword arguments: 'a'
# valid function calls
myFunction(1,2,c=3)
myFunction(1,b=2,c=3)