मैं पायथन में एक फ़ंक्शन से दो मान कैसे लौटा सकता हूं?


195

मैं एक फ़ंक्शन से दो मानों को दो अलग-अलग चर में वापस करना चाहूंगा। उदाहरण के लिए:

def select_choice():
    loop = 1
    row = 0
    while loop == 1:
        print('''Choose from the following options?:
                 1. Row 1
                 2. Row 2
                 3. Row 3''')

        row = int(input("Which row would you like to move the card from?: "))
        if row == 1:
            i = 2
            card = list_a[-1]
        elif row == 2:
            i = 1
            card = list_b[-1]
        elif row == 3:
            i = 0
            card = list_c[-1]
        return i
        return card

और मैं इन मूल्यों का अलग से उपयोग करने में सक्षम होना चाहता हूं। जब मैंने उपयोग करने की कोशिश की return i, card, तो यह रिटर्न एtuple और यह वह नहीं है जो मैं चाहता हूं।


कृपया इस अपेक्षित फ़ंक्शन को कॉल करने और इसके वापसी मूल्य (एस) का उपयोग करने का एक उदाहरण प्रदान करें, ताकि यह स्पष्ट हो सके कि आप ट्यूपल्स क्यों नहीं चाहते हैं।
बेरील

2
जबकि लूप का क्या मतलब है?
स्वेन मार्नाच

else: continueवापसी बयानों से पहले होना चाहिए
मशीन


हाँ, मैंने यह भी देखा कि यह stackoverflow.com/questions/38508/…
lpapp

जवाबों:


399

आप दो मान नहीं लौटा सकते, लेकिन आप एक tupleया एक वापसी कर सकते हैं listऔर कॉल के बाद इसे अनपैक कर सकते हैं :

def select_choice():
    ...
    return i, card  # or [i, card]

my_i, my_card = select_choice()

ऑन लाइन का return i, card i, cardमतलब है एक टपल बनाना। आप जैसे कोष्ठक का उपयोग भी कर सकते हैं return (i, card), लेकिन टुपल्स अल्पविराम द्वारा बनाए जाते हैं, इसलिए परेंस अनिवार्य नहीं हैं। लेकिन आप अपने कोड को अधिक पठनीय बनाने के लिए या कई लाइनों पर टपल को विभाजित करने के लिए पार्न्स का उपयोग कर सकते हैं। यही बात लाइन पर भी लागू होती है my_i, my_card = select_choice()

यदि आप दो से अधिक मान लौटना चाहते हैं, तो नामित टपल का उपयोग करने पर विचार करें । यह फ़ंक्शन के कॉलर को नाम से लौटे मूल्य के क्षेत्रों तक पहुंचने की अनुमति देगा, जो अधिक पठनीय है। आप अभी भी अनुक्रमणिका द्वारा टपल की वस्तुओं का उपयोग कर सकते हैं। उदाहरण के लिए Schema.loadsविधि में मार्शमैलो ढांचा रिटर्न देता है UnmarshalResultजो एक है namedtuple। तो आप कर सकते हैं:

data, errors = MySchema.loads(request.json())
if errors:
    ...

या

result = MySchema.loads(request.json())
if result.errors:
    ...
else:
    # use `result.data`

अन्य मामलों में आप dictअपने कार्य से लौट सकते हैं :

def select_choice():
    ...
    return {'i': i, 'card': card, 'other_field': other_field, ...}

लेकिन आप एक उपयोगिता वर्ग के एक उदाहरण को वापस करने पर विचार कर सकते हैं, जो आपके डेटा को लपेटता है:

class ChoiceData():
    def __init__(self, i, card, other_field, ...):
        # you can put here some validation logic
        self.i = i
        self.card = card
        self.other_field = other_field
        ...

def select_choice():
    ...
    return ChoiceData(i, card, other_field, ...)

choice_data = select_choice()
print(choice_data.i, choice_data.card)

26

मैं एक फ़ंक्शन से दो मानों को दो अलग-अलग चर में वापस करना चाहूंगा।

क्या आप इसे कॉलिंग एंड पर देखने की उम्मीद करेंगे? आप ऐसा नहीं लिख सकते a = select_choice(); b = select_choice()क्योंकि यह फ़ंक्शन को दो बार कॉल करेगा।

मान "चर में" वापस नहीं किए जाते हैं; यह नहीं है कि पायथन कैसे काम करता है। एक फ़ंक्शन मान (ऑब्जेक्ट) देता है। एक चर किसी दिए गए संदर्भ में एक मूल्य के लिए सिर्फ एक नाम है। जब आप किसी फ़ंक्शन को कॉल करते हैं और रिटर्न मूल्य कहीं पर असाइन करते हैं, तो आप जो कर रहे हैं वह कॉलिंग संदर्भ में एक नाम प्राप्त कर रहा है। फ़ंक्शन आपके लिए "वैरिएबल" में वैल्यू नहीं डालता है, असाइनमेंट करता है (कभी ध्यान नहीं देता कि वैल्यू के लिए वेरिएबल "स्टोरेज" नहीं है, लेकिन फिर से, बस एक नाम है)।

जब मैंने उपयोग करने की कोशिश की return i, card, तो यह एक रिटर्न देता है tupleऔर यह वह नहीं है जो मैं चाहता हूं।

वास्तव में, यह वही है जो आप चाहते हैं। आपको बस tupleफिर से अलग करना होगा।

और मैं इन मूल्यों का अलग से उपयोग करने में सक्षम होना चाहता हूं।

तो बस मूल्यों को पकड़ो tuple

ऐसा करने का सबसे आसान तरीका अनपैकिंग है:

a, b = select_choice()

1
"ऐसा क्यों है यह समझाने के लिए धन्यवाद"। सबसे अच्छा जवाब imo।
एडवर्ड कोल्हो

17

मुझे लगता है कि आप जो चाहते हैं वह एक तुक है। यदि आप उपयोग करते हैं return (i, card), तो आप इन दो परिणामों को प्राप्त कर सकते हैं:

i, card = select_choice()

8
def test():
    ....
    return r1, r2, r3, ....

>> ret_val = test()
>> print ret_val
(r1, r2, r3, ....)

अब आप अपनी पसंद के अनुसार सब कुछ कर सकते हैं।


5
def test():
    r1 = 1
    r2 = 2
    r3 = 3
    return r1, r2, r3

x,y,z = test()
print x
print y
print z


> test.py 
1
2
3

2

और यह एक विकल्प है। यदि आप सूची के रूप में वापस आ रहे हैं तो मूल्यों को प्राप्त करना सरल है।

def select_choice():
    ...
    return [i, card]

values = select_choice()

print values[0]
print values[1]

2

आप यह कोशिश कर सकते हैं

class select_choice():
    return x, y

a, b = test()

1

आप सूची का उपयोग करके भी एक से अधिक मान लौटा सकते हैं। नीचे दिए गए कोड की जाँच करें

def newFn():    #your function
  result = []    #defining blank list which is to be return
  r1 = 'return1'    #first value
  r2 = 'return2'    #second value
  result.append(r1)    #adding first value in list
  result.append(r2)    #adding second value in list
  return result    #returning your list

ret_val1 = newFn()[1]    #you can get any desired result from it
print ret_val1    #print/manipulate your your result
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.