এটি সমর্থন করে এমন ভাষাগুলিতে একাধিক মান ফেরত দেওয়ার আধ্যাত্মিক উপায়টি প্রায়শই দুর্বল হয়ে পড়ে ।
বিকল্প: একটি টিপল ব্যবহার করে
এই তুচ্ছ উদাহরণ বিবেচনা করুন:
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']
বিকল্প: একটি ক্লাস ব্যবহার করে
তবে, আরও একটি বিকল্প আছে। আমরা পরিবর্তে একটি বিশেষায়িত কাঠামো ফিরে আসতে পারে। আমি পাইথনের প্রসঙ্গে এটি তৈরি করেছি, তবে আমি নিশ্চিত এটি অন্যান্য ভাষার ক্ষেত্রেও প্রযোজ্য। আসলে আপনি যদি সি তে কাজ করতেন তবে এটি সম্ভবত আপনার একমাত্র বিকল্প হতে পারে। এখানে যায়:
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__
বৈশিষ্ট্যটি for শ্রেণিটি প্রকাশ করা যেতে পারে:
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+)
পাইথন ৩.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
যদিও এটি আমার সবচেয়ে কম প্রিয় পদ্ধতি। আমি মনে করি আমি হাস্কেলের সংস্পর্শে কলঙ্কিত, তবে মিশ্র ধরনের তালিকার ধারণাটি আমার কাছে সর্বদা অস্বস্তি বোধ করে। এই বিশেষ উদাহরণে তালিকাটি হ'ল-মিশ্র প্রকার নয়, তবে এটি অনুমেয় হতে পারে।
এইভাবে ব্যবহৃত তালিকাগুলি টিপলের প্রতি শ্রদ্ধার সাথে আসলে যতটা আমি বলতে পারি কিছুই লাভ করে না। পাইথনের তালিকাগুলি এবং টিপলসের মধ্যে একমাত্র আসল পার্থক্য হ'ল তালিকাগুলি পরিবর্তনযোগ্য , যেখানে টিপলস হয় না।
আমি ব্যক্তিগতভাবে ফাংশনাল প্রোগ্রামিং থেকে সম্মেলনগুলি বহন করার প্রবণতা রাখি: একই ধরণের যে কোনও সংখ্যক উপাদানের জন্য তালিকা ব্যবহার করুন এবং পূর্বনির্ধারিত ধরণের উপাদানগুলির একটি নির্দিষ্ট সংখ্যার জন্য টিপলস ব্যবহার করুন।
প্রশ্ন
দীর্ঘ উপস্থাপকের পরে, অনিবার্য প্রশ্ন আসে। কোন পদ্ধতিটি (আপনার মনে হয়) সবচেয়ে ভাল?
y3
, এটি একই কাজটিও করবে।
y3
তবে y3 কে বিশ্বব্যাপী ঘোষিত না করা হলে এটিNameError: global name 'y3' is not defined
কেবলমাত্র ব্যবহারের ফলস্বরূপ3
?