भाषाओं में कई मूल्यों को वापस लाने के लिए विहित तरीका जो इसका समर्थन करता है वह अक्सर तुच्छ होता है ।
विकल्प: ट्यूपल का उपयोग करना
इस तुच्छ उदाहरण पर विचार करें:
def f(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return (y0, y1, y2)
हालांकि, यह जल्दी से समस्याग्रस्त हो जाता है क्योंकि मूल्यों की संख्या बढ़ जाती है। यदि आप चार या पाँच मान वापस करना चाहते हैं तो क्या होगा? ज़रूर, आप उन्हें टपका सकते हैं, लेकिन यह भूलना आसान है कि कौन सा मूल्य कहाँ है। आप उन्हें प्राप्त करना चाहते हैं, जहां भी उन्हें अनपैक करना बल्कि बदसूरत है।
विकल्प: एक शब्दकोश का उपयोग करना
लगता है कि अगला तार्किक कदम किसी तरह के 'रिकॉर्ड नोटेशन' को पेश करेगा। पायथन में, ऐसा करने का स्पष्ट तरीका ए है dict
।
निम्नलिखित को धयान मे रखते हुए:
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0': y0, 'y1': y1 ,'y2': y2}
(बस स्पष्ट होने के लिए, y0, y1 और y2 केवल सार पहचानकर्ता के रूप में हैं। जैसा कि बताया गया है, व्यवहार में आप सार्थक पहचानकर्ताओं का उपयोग करेंगे।)
अब, हमारे पास एक ऐसा तंत्र है जिससे हम लौटे हुए ऑब्जेक्ट के किसी विशेष सदस्य को प्रोजेक्ट कर सकते हैं। उदाहरण के लिए,
result['y0']
विकल्प: कक्षा का उपयोग करना
हालांकि, एक और विकल्प है। हम इसके बजाय एक विशेष संरचना वापस कर सकते हैं। मैंने इसे पायथन के संदर्भ में फंसाया है, लेकिन मुझे यकीन है कि यह अन्य भाषाओं पर भी लागू होता है। वास्तव में, यदि आप C में काम कर रहे थे तो यह आपके लिए एकमात्र विकल्प हो सकता है। यहाँ जाता हैं:
class ReturnValue:
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
पायथन में पिछले दो शायद नलसाजी के संदर्भ में बहुत समान हैं - आखिरकार { y0, y1, y2 }
आंतरिक में प्रविष्टियां होने __dict__
के बाद ReturnValue
।
पायथन द्वारा प्रदान की गई एक अतिरिक्त विशेषता है, हालांकि छोटी वस्तुओं के लिए, __slots__
विशेषता। वर्ग के रूप में व्यक्त किया जा सकता है:
class ReturnValue(object):
__slots__ = ["y0", "y1", "y2"]
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
से अजगर संदर्भ मैनुअल :
__slots__
घोषणा हर चर के लिए एक मूल्य धारण करने के लिए प्रत्येक उदाहरण में उदाहरण चर और भंडार सिर्फ पर्याप्त जगह का एक अनुक्रम लेता है। अंतरिक्ष सहेजा गया है क्योंकि__dict__
प्रत्येक उदाहरण के लिए नहीं बनाया गया है।
विकल्प: डेटाकल्स का उपयोग करना (पायथन 3.7+)
पायथॉन 3.7 के नए डेटास्केल्स का उपयोग करते हुए, एक वर्ग को स्वचालित रूप से जोड़े गए विशेष तरीकों, टाइपिंग और अन्य उपयोगी टूल के साथ लौटाएं:
@dataclass
class Returnvalue:
y0: int
y1: float
y3: int
def total_cost(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
विकल्प: किसी सूची का उपयोग करना
एक और सुझाव जिसे मैंने अनदेखा किया वह बिल द छिपकली से आता है:
def h(x):
result = [x + 1]
result.append(x * 3)
result.append(y0 ** y3)
return result
हालांकि यह मेरी सबसे कम पसंदीदा विधि है। मुझे लगता है कि मैं हास्केल के संपर्क में हूं, लेकिन मिश्रित प्रकार की सूचियों का विचार मुझे हमेशा असहज लगा। इस विशेष उदाहरण में सूची -not- मिश्रित प्रकार है, लेकिन यह बोधगम्य हो सकता है।
इस तरह से इस्तेमाल की जाने वाली एक सूची वास्तव में टपल के संबंध में कुछ भी हासिल नहीं करती है जहां तक मैं बता सकता हूं। अजगर में सूचियों और tuples के बीच केवल वास्तविक अंतर यह है कि सूचियों हैं परिवर्तनशील है, जबकि tuples नहीं हैं।
मैं व्यक्तिगत रूप से कार्यात्मक प्रोग्रामिंग से सम्मेलनों को आगे बढ़ाता हूं: एक ही प्रकार के तत्वों की किसी भी संख्या के लिए सूचियों का उपयोग करें, और पूर्व निर्धारित प्रकार के तत्वों की निश्चित संख्या के लिए ट्यूपल्स।
सवाल
लंबी प्रस्तावना के बाद, अपरिहार्य प्रश्न आता है। कौन सा तरीका (आपको लगता है) सबसे अच्छा है?
y3
हैं, वही काम भी करेगा।
y3
, लेकिन जब तक y3 को वैश्विक घोषित नहीं किया जाता है, यहNameError: global name 'y3' is not defined
शायद सिर्फ उपयोग होगा3
?