'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
ডিক্টের পদ্ধতি বা উভয়ের জন্য একত্রে ব্যবহার করতে হবে .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)
তবে একাডেমিক উদ্দেশ্যে, প্রশ্নের উদাহরণটি ঠিক আছে।