Python में प्रोग्रामिंग करते समय, हम फ़ंक्शंस को परिभाषित और कॉल करते समय positional arguments, keyword arguments, या दोनों का मिश्रण इस्तेमाल कर सकते हैं। इन arguments के इस्तेमाल से कोड की पठनीयता (readability) और लचीलापन (flexibility) बढ़ता है।
Positional Arguments
Positional arguments वे होते हैं जिन्हें फ़ंक्शन को एक निश्चित क्रम में देना ज़रूरी होता है। नीचे एक उदाहरण है जहाँ हम एक साधारण फ़ंक्शन बनाते हैं, जो पूरा नाम (full name) तैयार करता है:
def full_name(first_name, last_name):
return f'{first_name} {last_name}' # पहला नाम और अंतिम नाम को मिलाता है
print(full_name('Anna', 'Brown')) # 'Anna Brown' को प्रिंट करता है
ऊपर दिए गए उदाहरण में, 'Anna' पहला argument है और 'Brown' दूसरा argument है। अगर हम इन arguments का क्रम उलट दें, तो परिणाम अलग होगा:
print(full_name('Brown', 'Anna')) # 'Brown Anna' को प्रिंट करता है
Keyword Arguments
इसके विपरीत, keyword arguments हमें फ़ंक्शन को कॉल करते समय argument का नाम निर्दिष्ट करने की सुविधा देते हैं, जिससे कोड की पठनीयता बढ़ती है। साथ ही, हम विवेकाधीन (optional) arguments के लिए डिफ़ॉल्ट मान (default values) सेट करने के लिए भी इनका उपयोग कर सकते हैं.
def full_name(first_name, last_name):
return f'{first_name} {last_name}'
print(full_name(last_name='Brown', first_name='Anna')) # 'Anna Brown' को प्रिंट करता है
print(full_name(first_name='Anna', last_name='Brown')) # 'Anna Brown' को प्रिंट करता है
इससे, आर्ग्यूमेंट के क्रम की परवाह किए बिना, वही आउटपुट मिलता है जो पहले उदाहरण में मिला था।
💡
यह ध्यान रखना महत्वपूर्ण है कि किसी फ़ंक्शन को कॉल करते समय keyword arguments हमेशा positional arguments के बाद ही आने चाहिए।
यदि किसी फ़ंक्शन कॉल में positional arguments से पहले ही keyword arguments का उपयोग किया जाता है, तो Python एक syntax error उत्पन्न करेगा। यह नियम Python को दोनों के बीच अंतर करने में मदद करता है। अगर keyword arguments के बाद positional arguments आते हैं, तो Python का इंटरप्रेटर भ्रमित हो जाता है क्योंकि उसे उम्मीद होती है कि सभी positional arguments पहले ही परिभाषित हो गए होंगे। यहाँ एक गलत फ़ंक्शन कॉल का उदाहरण है जो SyntaxError उत्पन्न करेगा:
यह नियम सुनिश्चित करता है कि फ़ंक्शन कॉल में कोई अस्पष्टता न रहे, जिससे कोड को समझना आसान हो जाता है और उसमें त्रुटियों की संभावना कम होती है।
Combining Positional and Keyword Arguments
आईए एक ऐसे फ़ंक्शन पर गौर करें जो पूरा नाम तैयार करता है, जिसमें मध्य नाम (middle name) भी शामिल हो सकता है:
# middle और last नामों के लिए डिफ़ॉल्ट मान (खाली स्ट्रिंग्स)
def full_name(first, middle='', last=''):
return first + ' ' + middle + ' ' + last
print(full_name('Anna', last='Brown')) # 'Anna Brown'
print(full_name('Anna', middle='Louise', last='Brown')) # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', last='Brown')) # 'Anna Louise Brown'
print(full_name('Anna', 'Louise', 'Brown')) # 'Anna Louise Brown'
print(full_name(first='Anna', 'Louise', last='Brown')) # SyntaxError
इस उदाहरण में, पहला नाम (first) एक positional argument के रूप में दिया जाता है, जबकि अंतिम नाम (last) एक keyword argument है। मध्य नाम (middle) नहीं दिया गया है, इसलिए वह उसका डिफ़ॉल्ट मान (एक खाली स्ट्रिंग) इस्तेमाल करता है।
एक और महत्वपूर्ण नियम यह है कि यदि आपने एक बार keyword arguments का उपयोग शुरू कर दिया, तो उसके बाद आने वाले सभी arguments भी keyword arguments होने चाहिए। मिसाल के तौर पर, print(full_name(first='Anna', 'Louise', last='Brown')) एक त्रुटि उत्पन्न करेगा क्योंकि एक positional argument (Louise) एक keyword argument (first='Anna') के बाद आ रहा है।
अंत में, आइए एक व्यवहारिक (real-world) उदाहरण देखें: ऐसा फ़ंक्शन जो खरीद की कुल लागत को गणना करता है और जिसके पास वैकल्पिक (optional) पैरामीटर tax और discount होते हैं।
# tax और discount के डिफ़ॉल्ट मान 0 पर सेट हैं
def calculate_total_cost(price, tax=0.0, discount=0.0):
return price + price * tax - discount
print(calculate_total_cost(100, tax=0.05)) # 105.0
print(calculate_total_cost(100, discount=10)) # 90.0
print(calculate_total_cost(100, tax=0.05, discount=10)) # 95.0
इस स्थिति में, price एक अनिवार्य (required) positional argument है, जबकि tax और discount ऐच्छिक (optional) keyword arguments हैं। अगर ये नहीं दिए जाते हैं, तो ये अपने डिफ़ॉल्ट मान 0 ले लेते हैं।