2012-03-17 11 views
135

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

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 देता है और यह वही नहीं है जो मैं चाहता हूं।

+0

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

+2

जबकि लूप का क्या मतलब है? –

+0

में वापसी बयान –

उत्तर

290

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

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

my_i, my_card = select_choice() 

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

यदि आप दो से अधिक मान वापस करना चाहते हैं, तो named tuple का उपयोग करने पर विचार करें। यह फ़ंक्शन के कॉलर को नाम से लौटाए गए मान के फ़ील्ड तक पहुंचने की अनुमति देगा, जो अधिक पठनीय है। आप अभी भी इंडेक्स द्वारा टुपल की वस्तुओं तक पहुंच सकते हैं। उदाहरण के लिए 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) 
15

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

i, card = select_choice() 
7
def test(): 
    .... 
    return r1, r2, r3, .... 

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

अब आप अपने ट्यूपल के साथ अपनी पसंद की सब कुछ कर सकते हैं।

23

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

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

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

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

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

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

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

यह करने के लिए सबसे आसान तरीका है खोलकर है:

a, b = select_choice() 
+1

"यह ऐसा क्यों है" समझाते हुए धन्यवाद। बेस्ट उत्तर इमो। –

0

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

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 
1

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

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

values = select_choice() 

print values[0] 
print values[1] 
0
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 
संबंधित मुद्दे

 संबंधित मुद्दे