ইটারেবল, ইটারেটরঃ
আমরা জানি পাইথনে সবকিছুই অবজেক্ট হিসাবে কাজ করে। Python এ ইটারেবল অবজেক্ট এর অর্থ হল একটি for loop বা while loop ব্যবহার করে অবজেক্টটিকে ট্রাভার্স করা যায়। আর ইটারেবল অবজেক্ট কে ইটারেট করার জন্য ইটারেটর ব্যবহার করা হয়। মজার বিষয় হলো ইটারেটর নিজেও একটি অবজেক্ট।
সহজ ভাবে বলতে গেলে ,
ইটারেবল : যে অবজেক্ট **কে** ইটারেট করা যায়।
ইটারেটর : যে অবজেক্ট **দিয়ে** ইটারেট করা যায়।
নিচে কয়েকটি ডাটা টাইপ উল্লেখ করা হয়েছে ,এই ডাটা টাইপের অবজেক্ট গুলোকে ইটারেটর অবজেক্ট দিয়ে ট্রেভরর্স করা যায় :
- তালিকা(List)
- স্ট্রিংস(Strings)
- ডিকশনারি(Dictionary)
- টাপলস(Tuples)
- সেট(Set)
উদাহরণস্বরূপ, আপনি সংখ্যার একটি তালিকা(List) ট্রাভার্স করতে পারেন:
আপনি একটি স্ট্রিং অক্ষরগুলোকে অনুরূপ ভাবে ট্রাভার্স করতে পারেন:
ইটারেবল করার জন্যঃ
টেকনিক্যাল দিক থেকে চিন্তা করলে একটি অবজেক্ট যে ক্লাস থেকে তৈরি করা হয় সেই ক্লাস এ যদি __iter__
মেথড ইমপ্লিমেন্ট করা থাকে তাহলে ঐ অবজেক্ট কে ইটারেবল বলা হয়। __iter__
মেথড একটি iterator রিটার্ন করে,যার মধ্যমে উক্ত অবজেক্ট কে লুপের মত ট্রাভার্স করা যায়।
চলুন Vivasoft নামে একটি ক্লাস তৈরি করি:
এই ক্লাস এর একটি অবজেক্ট তৈরি করি।
vivasoft অবজেক্টটি ট্রাভার্স করার চেষ্টা করি:
এরর এর মাধ্যমে আমরা বুঝতে পারছি অবজেক্ট টি ইটারেবল না। কারণ এই ক্লাস টিতে __iter__
মেথড টি ইমপ্লিমেন্ট করা হয় নি। এখন এই ক্লাস টিকে পরিবর্তন করে ইটারেবল অবজেক্ট এ রূপান্তর করি। এর জন্য আমাদের যা করতে হবে।
১। __iter__ method.
২। __next__ method.
মেথড দুটি ইমপ্লিমেন্ট করা। পরিবর্তিত কোড টি দেখা যাক।
ইটারেবল হিসাবে ট্রাভারর্স করার জন্য ,অবজেক্ট টিকে __iter__
পদ্ধতি প্রয়োগ করতে হবে। আসুন বিল্ট-ইন dir() পদ্ধতি ব্যবহার করে সংখ্যার একটি তালিকা(List) পরিদর্শন করি যে এটিতে একটি __iter__
আছে কিনা:
আপনি দেখতে পাবেন iterable_object তালিকাটিতে __iter__
মেথড টি রয়েছে। এটি এইভাবে একটি ইটারেবল । লুপ কাজ করার জন্য, এটি List এর __iter__
মেথড কে কল করে।__iter __() মেথড টি কল করলে এটি একটি ইটারেটর অবজেক্ট দেয় এবং কোথা থেকে প্রথম ইটারেশন শুরু হবে তা মনে রাকে। ইটারেটর টি জানে কিভাবে পরবর্তী মান পেতে হয় এবং __next__ মেথড ব্যবহার করে পরবর্র্তী মান রিটার্র্ন করে।
iterator অবজেক্ট টি প্রিন্ট করে দেখা যাক।
__next__
মেথড একটি ইটারেবল অবজেক্ট কে চিহ্নিত করে।
সংক্ষেপে:
১। একটি তালিকা ইটারেবল হওয়ার কারণ এটিতে __iter__() মেথড রয়েছে।
২। __iter__() মেথড টি ইটারেবিলিটি প্রদান করে।
৩। একটি ইটারেবল অবজেক্ট এর পরবর্তী মান পেতে __next__() মেথড টি রয়েছে।
আসুন অবজেক্ট টির __next__
মেথড টি বার বার কল করি কি হয় তা দেখি:
পরবর্তী (iterator) কল করা সর্বদা List এর পরবর্তী নম্বরটি ফেরত দেয়।
এটি সম্ভব কারণ একটি পুনরাবৃত্তিকারী একটি স্টেট সহ একটি অবজেক্ট । শেষবার __next__
কল করার সময় এটি কোথায় ছেড়ে ছিল তা মনে রাখে।
এখন, আসুন “next() “` কে আরও একবার কল করুন:
List এর মান শেষ হয়ে যাওয়ার কারণে একটি StopIteration এক্সেপশন দেখায়। পরবর্তীতে Advance সেকশনে আমরা ইটারেবল, ইটারেটর নিয়ে বিস্তর আলোচনা করবো।
১। demo_class কি ইটারেবল?
২। demo_class টিকে ইটারেবল করেন-
৩। ইটারেটর ব্যবস্থার করে একটি লিস্ট বিপরীত দিক থেকে ট্রাভারর্স করুন।
৪। কাস্টম ইটারেটর তৈরি তৈরী করুন।
৫।একটি ইফাইনাইট ইটারেটর তৈরী করুন।
গুরুত্বপূর্ন প্রশ্নসমুহ
- iter মেথড কি রিটার্ন করে?
- iteration শেষ হয়ে গেলে next() অবজেক্ট কি রিটার্ন করে?
- Iterator এর ব্যবহার এবং তাদের গুরুত্ব ব্যাখ্যা কর
- যেকোনো অবজেক্ট কে ইটারেবল বানানো যাবে কি ?
- custom ইটারেটর তৈরি করুন যেখানে ইটারে টি ৫ ইনডেক্স থেকে শুরু হবে এবং প্রত্যেক ইটারেশন ২ করে ইনডেক্স সামনের দিকে যাবে।