क्या पायथन में वैकल्पिक तरीके से किसी फ़ंक्शन को कॉल करने के लिए इसे पास करने का कोई तरीका है और फ़ंक्शन परिभाषा में "केवल यदि वैकल्पिक पैरामीटर पारित किया गया है" पर आधारित कुछ कोड हैं
क्या पायथन में वैकल्पिक तरीके से किसी फ़ंक्शन को कॉल करने के लिए इसे पास करने का कोई तरीका है और फ़ंक्शन परिभाषा में "केवल यदि वैकल्पिक पैरामीटर पारित किया गया है" पर आधारित कुछ कोड हैं
जवाबों:
अजगर 2 प्रलेखन, 7.6। फ़ंक्शन परिभाषाएँ आपको यह पता लगाने के लिए कुछ तरीके देती हैं कि क्या एक कॉलर ने वैकल्पिक पैरामीटर की आपूर्ति की है।
सबसे पहले, आप विशेष औपचारिक पैरामीटर सिंटैक्स का उपयोग कर सकते हैं *। यदि फ़ंक्शन परिभाषा में एक एकल से पहले एक औपचारिक पैरामीटर है *, तो पायथन उस पैरामीटर को किसी भी स्थितीय मापदंडों के साथ पॉप्युलेट करता है जो औपचारिक मापदंडों से पहले मेल नहीं खाते हैं (टुपल के रूप में)। यदि फ़ंक्शन परिभाषा में पहले से एक औपचारिक पैरामीटर है **, तो पायथन उस पैरामीटर को किसी भी कीवर्ड पैरामीटर के साथ पॉप्युलेट करता है , जो औपचारिक मापदंडों से पहले मेल नहीं खाते हैं (एक तानाशाह के रूप में)। फ़ंक्शन का कार्यान्वयन आपके इच्छित प्रकार के किसी भी "वैकल्पिक पैरामीटर" के लिए इन मापदंडों की सामग्री की जांच कर सकता है।
उदाहरण के लिए, यहाँ एक समारोह है opt_funजो दो स्थितीय पैरामीटर लेता है x1और x2"वैकल्पिक" नामक एक अन्य कीवर्ड पैरामीटर के लिए, और दिखता है।
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
... if ('optional' in keyword_parameters):
... print 'optional parameter found, it is ', keyword_parameters['optional']
... else:
... print 'no optional parameter, sorry'
...
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry
दूसरा, आप कुछ मूल्य के एक डिफ़ॉल्ट पैरामीटर मान की आपूर्ति कर सकते हैं जैसे Noneकि एक कॉलर कभी भी उपयोग नहीं करेगा। यदि पैरामीटर में यह डिफ़ॉल्ट मान है, तो आपको पता है कि कॉलर ने पैरामीटर निर्दिष्ट नहीं किया था। यदि पैरामीटर में एक गैर-डिफ़ॉल्ट मान है, तो आप जानते हैं कि यह कॉलर से आया था।
formal parameters preceded by * (इसे क्या कहा जाता है?) A से keyword parameter। जैसा कि मैंने इसे समझा था, =फ़ंक्शन कॉल में ऑपरेटर का उपयोग करके कीवर्ड पैरामीटर निर्दिष्ट किए जाते हैं (इसलिए opt_fun(1,2, optional="yes")एक फ़ंक्शन के लिए एक कीवर्ड तर्क "हाँ" प्रदान करता है जो पूर्वानुमान करता है, लेकिन जरूरी नहीं कि पैरामीटर की आवश्यकता हो option)।
formal parameters preceded by * बस "कॉलर द्वारा प्रदान की गई दलीलें समझीं, जो किसी भी तर्क वितर्क से पहले जाने वाली स्थिति संबंधी तर्कों के अनुरूप नहीं है"। उदाहरण के लिए, में opt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018"), "blah"और 3.14कर रहे हैं forma arguments preceded by *, क्योंकि यह दो स्थितीय तर्क और तर्क का उपयोग करता है के बीच में है =पर हस्ताक्षर। परिणामस्वरूप टपल positional_parameterको डंपल किया जाएगा ("blah", 3.14):। क्या ये सही है?
parameter" नहीं " parameters" के लिए preceded by *"। भाषा *identifierपैरामीटर सूची में केवल एक के लिए अनुमति देती है । b) docs.python.org/2/reference/… , c) read docs.python.org/2/reference/expressions.html#calls पढ़ें । क्षमा करें, इस टिप्पणी में अनुमत वर्णों से बाहर चल रहा है।
def my_func(mandatory_arg, optional_arg=100):
print(mandatory_arg, optional_arg)
http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
मुझे यह उपयोग करने से अधिक पठनीय लगता है **kwargs।
यह निर्धारित करने के लिए कि क्या कोई तर्क पारित किया गया था, मैं डिफ़ॉल्ट मूल्य के रूप में एक कस्टम उपयोगिता वस्तु का उपयोग करता हूं:
MISSING = object()
def func(arg=MISSING):
if arg is MISSING:
...
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
def op(a=4,b=6):
add = a+b
print add
i)op() [o/p: will be (4+6)=10]
ii)op(99) [o/p: will be (99+6)=105]
iii)op(1,1) [o/p: will be (1+1)=2]
Note:
If none or one parameter is passed the default passed parameter will be considered for the function.
op(b=2)
यदि आप एक पैरामीटर असाइन मान () में कुछ डिफ़ॉल्ट मान देना चाहते हैं। जैसे (x = 10)। लेकिन महत्वपूर्ण पहले अनिवार्य तर्क तो डिफ़ॉल्ट मान होना चाहिए।
जैसे।
(y, x = 10)
परंतु
(x = 10, y) गलत है
*arg **kargफ़ंक्शन तर्कों के रूप में कुछ का उपयोग कर सकते हैं । गूगल पर खोजें।
आप वैकल्पिक तर्क के लिए कुछ के साथ एक डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं जो फ़ंक्शन में कभी नहीं जाएगा और इसे isऑपरेटर के साथ जांचें :
class _NO_DEFAULT:
def __repr__(self):return "<no default>"
_NO_DEFAULT = _NO_DEFAULT()
def func(optional= _NO_DEFAULT):
if optional is _NO_DEFAULT:
print("the optional argument was not passed")
else:
print("the optional argument was:",optional)
तब तक जब तक आप नहीं करते func(_NO_DEFAULT)हैं, तब तक आप सटीक रूप से पता लगा सकते हैं कि क्या तर्क पारित किया गया था या नहीं, और स्वीकृत उत्तर के विपरीत आपको ** नोटेशन के दुष्प्रभावों के बारे में चिंता करने की आवश्यकता नहीं है:
# these two work the same as using **
func()
func(optional=1)
# the optional argument can be positional or keyword unlike using **
func(1)
#this correctly raises an error where as it would need to be explicitly checked when using **
func(invalid_arg=7)
_NO_DEFAULT = object()।
help(func)हैं तो आपको एक स्पष्ट विचार मिलता है कि यदि स्पष्ट रूप से पारित नहीं किया जाता है तो तर्क की व्याख्या कैसे की जाती है।
positional_parametersएक टपल है, औरkeyword_parametersएक शब्दकोश है।