मेरे पास कई संख्याओं के उत्पाद की गणना करने के लिए एक फ़ंक्शन था, लेकिन यह परीक्षण भाग पास नहीं कर सकता:

def mul(*numbers):
    product = 1
    for n in numbers:
        product = product * n
    return product

# Tests that pass
assert mul(5) == 5
assert mul(5, 6) == 30

# Tests that fail!
try:
  mul()
  assert false, "Expected a TypeError exception to be raised"
except TypeError:
  pass

अगर मैं इस तरह कोड को संशोधित करता हूं:

def mul(x, y=1, *numbers):
    product = x*y
    for n in numbers:
        product = product * n
    return product

यह अच्छी तरह से काम करता है। मेरा प्रश्न यह है कि हमें product = x*y लिखने की आवश्यकता क्यों है?

0
Lila Greco 19 मार्च 2021, 06:30

3 जवाब

सबसे बढ़िया उत्तर

*संख्याएं यदि हम इस कथन का उपयोग करते हैं तो फ़ंक्शन में तर्क के रूप में पारित सभी संख्याएं tuple numbers में मौजूद हैं

लेकिन दूसरे मामले में हम आप इस कथन का उपयोग करते हैं x, y=1, *numbers तो पहले दो पैरामीटर numbers tuple में मौजूद नहीं हैं। इसलिए हमने उनके उत्पाद को स्पष्ट रूप से लिया है और अगले मूल्यों का उत्पाद लेना शुरू कर दिया है

उदाहरण:

def mul(*numbers): ... 
mul(1, 2, 3, 4, 5)

तो, संख्याएँ = (1, 2, 3, 4, 5)

def mul(x, y=1, *numbers): ... 
mul(1, 2, 3, 4, 5)

तो, संख्याएँ = (3, 4, 5)

1
Exploore X 19 मार्च 2021, 06:43

mul() का आपका प्रारंभिक कार्यान्वयन बिना किसी तर्क के कॉल स्वीकार करेगा।

तो... जांचें कि numbers सूची खाली तो नहीं है?

3
Bill Lynch 19 मार्च 2021, 06:34

"हमें product = x*y लिखने की आवश्यकता क्यों है?" उत्तर: आप नहीं।

यदि आप चाहते हैं कि फ़ंक्शन को कम से कम एक तर्क की आवश्यकता हो, और TypeError के साथ विफल हो जाए यदि यह पारित नहीं हुआ है, तो बस एक एकल गैर-डिफ़ॉल्ट, गैर-varargs तर्क स्वीकार करें। सुविधाजनक रूप से, आप इसे केवल product नाम के रूप में स्वीकार कर सकते हैं और product के लिए 1 के प्रारंभिक मान से बच सकते हैं (प्रोटोटाइप को भ्रमित करने की कीमत पर):

def mul(product, *numbers):
    for n in numbers:
        product *= n
    return product

या बस इसे किसी दूसरे नाम से स्वीकार करें और product को इनिशियलाइज़ करने के लिए इसका इस्तेमाल करें:

def mul(firstnum, *numbers):
    product = firstnum
    for n in numbers:
        product *= n
    return product

किसी भी तरह से, एक गैर-डिफ़ॉल्ट पहले तर्क के साथ, आप फ़ंक्शन को अब बिना किसी तर्क के कॉल नहीं कर सकते हैं, और इसे इस तरह लिखने के लिए जटिलता में कोई बड़ी वृद्धि नहीं है। पायथन आपके लिए तर्कों की संख्या की जाँच करने और TypeError को बढ़ाने का काम करता है यदि कोई पारित नहीं होता है।

2
ShadowRanger 19 मार्च 2021, 06:48