'For' ලූප භාවිතා කරමින් ශබ්ද කෝෂ හරහා උපුටා දැක්වීම
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
ශබ්ද කෝෂයේ යතුර කියවීමට පමණක් අවශ්ය බව පයිතන් හඳුනා ගන්නේ කෙසේද? යතුර පයිතන්හි විශේෂ වචනයක්ද? නැතහොත් එය හුදෙක් විචල්යයක්ද?
එය for
ලූප පමණක් නොවේ . මෙහි ඇති වැදගත් වචනය වන්නේ “නැවත සැකසීම” යන්නයි.
ශබ්දකෝෂයක් යනු අගයන් සඳහා යතුරු සිතියම්ගත කිරීමකි:
d = {'x': 1, 'y': 2, 'z': 3}
අපි එය නැවත නැවත කියවන ඕනෑම වේලාවක අපි යතුරු හරහා නැවත කියමු. විචල්ය නාමය key
විස්තර කිරීමට පමණක් අදහස් කර ඇති අතර එය ඒ සඳහා බෙහෙවින් යෝග්ය වේ.
මෙය ලැයිස්තු අවබෝධයකින් සිදු වේ:
>>> [k for k in d]
['x', 'y', 'z']
එය සිදු වන්නේ අප ශබ්දකෝෂය ලැයිස්තු ගත කළ විට (හෝ වෙනත් එකතු කිරීමේ වර්ගයේ වස්තුවක්):
>>> list(d)
['x', 'y', 'z']
පයිතන් පුනරාවර්තනය වන ආකාරය, එය අවශ්ය වන සන්දර්භයකදී, එය __iter__
වස්තුවේ ක්රමය (මෙම අවස්ථාවේදී ශබ්දකෝෂය) ලෙස හඳුන්වන්නේ එය නැවත ක්රියාකරවන්නෙකු ආපසු ලබා දීමයි (මේ අවස්ථාවේ දී, යතුරුපුවරු වස්තුවක්):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
අපි, ඒ වෙනුවට, අප මෙම විශේෂ ක්රම භාවිතා නොකළ යුතු, එය කැඳවීමට අදාළ builtin ක්රියාව භාවිත, iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
අනුකාරකයන්ට __next__
ක්රමයක් ඇත - නමුත් අපි එය බිල්ඩින් ශ්රිතය සමඟ අමතන්නෙමු next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
පුනරාවර්තකය අවසන් වූ විට, එය මතු කරයි StopIteration
. පයිතන් ලූපයකින් for
හෝ ලැයිස්තු අවබෝධයකින් හෝ උත්පාදක ප්රකාශනයකින් හෝ වෙනත් ක්රියාකාරී සන්දර්භයකින් පිටවීමට දන්නා ආකාරය මෙයයි . අනුකාරකයක් මතු StopIteration
කළ පසු එය සැමවිටම එය ඉහළ නංවනු ඇත - ඔබට නැවත නැවත කියවීමට අවශ්ය නම්, ඔබට නව එකක් අවශ්ය වේ.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
අණපනත් වෙත ආපසු යාම
බොහෝ සන්දර්භයන් තුළ අණපනත් ක්රියාත්මක වන ආකාරය අපි දැක ඇත්තෙමු. අප දුටු දෙය නම්, අපි නියෝගයක් නැවත කියවන ඕනෑම වේලාවක අපට යතුරු ලැබෙනු ඇත. මුල් උදාහරණය වෙත ආපසු:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
අපි විචල්ය නාමය වෙනස් කළහොත්, අපට තවමත් යතුරු ලැබේ. ඒක උත්සාහ කරමු:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
අපි වටිනාකම් කට වඩාත් කැපීපෙනේ කිරීමට අවශ්ය නම්, අපි භාවිතා කිරීමට අවශ්ය .values
dicts ක්රමය, හෝ, දෙකම එකට සඳහා .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
ලබා දී ඇති උදාහරණයේ දී, මෙවැනි අයිතමයන් නැවත සැකසීම වඩා කාර්යක්ෂම වනු ඇත:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
නමුත් ශාස්ත්රීය අරමුණු සඳහා, ප්රශ්නයේ උදාහරණය ඉතා හොඳයි.