එයට අනුබල දෙන භාෂාවලින් බහුවිධ අගයන් ආපසු ලබා දීමට කැනොනිකල් ක්රමය බොහෝ විට හීලෑ වේ.
විකල්පය: ටුපල් එකක් භාවිතා කිරීම
මෙම සුළු උදාහරණය සලකා බලන්න:
def f(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return (y0, y1, y2)
කෙසේ වෙතත්, ආපසු ලබා දුන් අගයන් ගණන වැඩි වන විට මෙය ඉක්මනින් ගැටළු සහගත වේ. ඔබට අගයන් හතරක් හෝ පහක් ආපසු ලබා දීමට අවශ්ය නම් කුමක් කළ යුතුද? අනිවාර්යෙන්ම, ඔබට ඒවා දිගින් දිගටම හසුකර ගත හැකිය, නමුත් කුමන වටිනාකම කොතැනද යන්න අමතක කිරීම පහසුය. ඔබට ඒවා ලැබීමට අවශ්ය ඕනෑම තැනක ඒවා ඉවත් කිරීම තරමක් කැතයි.
විකල්පය: ශබ්ද කෝෂයක් භාවිතා කිරීම
මීළඟ තාර්කික පියවර වන්නේ යම් ආකාරයක 'වාර්තා අංකනයක්' හඳුන්වා දීමයි. පයිතන්හි, මෙය කළ හැකි පැහැදිලි ක්රමය වන්නේ a 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)
Python වූ අතර එය පසුගිය දෙකක් ජලනල අනුව සමහර විට ඉතා සමාන වේ - සියලු පසු { 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
සිට Python විමර්ශන අත්පොත :
මෙම
__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
මෙය මගේ අවම ප්රියතම ක්රමයයි. හැස්කෙල්ට නිරාවරණය වීමෙන් මා කැළැල් වී ඇතැයි සිතමි, නමුත් මිශ්ර ආකාරයේ ලැයිස්තු පිළිබඳ අදහස සෑම විටම මට අපහසුතාවයක් දැනුනි. මෙම විශේෂිත උදාහරණයේ දී ලැයිස්තුව-මිශ්ර නොවන වර්ගයකි, නමුත් එය සිතිය හැකි ය.
මේ ආකාරයෙන් භාවිතා කරන ලැයිස්තුවක් මට කිව හැකි තාක් දුරට ටුපල් සම්බන්ධයෙන් කිසිවක් ලබා ගන්නේ නැත. පයිතන් හි ලැයිස්තු සහ ටුපල් අතර ඇති එකම සැබෑ වෙනස නම් ලැයිස්තු විකෘති වන අතර ටුපල් නැත.
ක්රියාකාරී ක්රමලේඛනයේ සම්මුතීන් මම පෞද්ගලිකව ගෙනයාමට නැඹුරු වෙමි: එකම වර්ගයේ ඕනෑම මූලද්රව්ය ගණනක් සඳහා ලැයිස්තු භාවිතා කරන්න, සහ කලින් තීරණය කළ වර්ගවල මූලද්රව්ය ගණනක් සඳහා ටුපල් භාවිතා කරන්න.
ප්රශ්නය
දීර් pre පෙරවදනෙන් පසු නොවැළැක්විය හැකි ප්රශ්නය පැමිණේ. වඩාත්ම සුදුසු ක්රමය කුමක්ද?
y3
කරනු ඇත.
y3
, නමුත් y3 ගෝලීය ලෙස ප්රකාශයට පත් නොකළහොත් මෙයNameError: global name 'y3' is not defined
භාවිතයට පමණක් හේතු3
වේද?