ইটারেবল, ইটারেটরঃ

আমরা জানি পাইথনে সবকিছুই অবজেক্ট হিসাবে কাজ করে। Python এ ইটারেবল অবজেক্ট এর অর্থ হল একটি for loop বা while loop ব্যবহার করে অবজেক্টটিকে ট্রাভার্স করা যায়। আর ইটারেবল অবজেক্ট কে ইটারেট করার জন্য ইটারেটর ব্যবহার করা হয়। মজার বিষয় হলো ইটারেটর নিজেও একটি অবজেক্ট।

সহজ ভাবে বলতে গেলে ,
ইটারেবল : যে অবজেক্ট **কে** ইটারেট করা যায়।
ইটারেটর : যে অবজেক্ট **দিয়ে** ইটারেট করা যায়।

নিচে কয়েকটি ডাটা টাইপ উল্লেখ করা হয়েছে ,এই ডাটা টাইপের অবজেক্ট গুলোকে ইটারেটর অবজেক্ট দিয়ে ট্রেভরর্স করা যায় :

  • তালিকা(List)
  • স্ট্রিংস(Strings)
  • ডিকশনারি(Dictionary)
  • টাপলস(Tuples)
  • সেট(Set)

উদাহরণস্বরূপ, আপনি সংখ্যার একটি তালিকা(List) ট্রাভার্স করতে পারেন:

numbers = [1, 2, 3] 
for number in numbers: 
    print(number, end= ' ') 


#Output: 1 2 3

 

আপনি একটি স্ট্রিং অক্ষরগুলোকে অনুরূপ ভাবে ট্রাভার্স করতে পারেন:

word = "vivaSoft" 
for character in word: 
    print(character, end=' ') 


#Output: v i v a S o f t

ইটারেবল করার জন্যঃ 

টেকনিক্যাল দিক থেকে চিন্তা করলে একটি অবজেক্ট যে ক্লাস থেকে তৈরি করা হয় সেই ক্লাস এ যদি __iter__ মেথড ইমপ্লিমেন্ট করা থাকে তাহলে ঐ অবজেক্ট কে ইটারেবল বলা হয়। __iter__ মেথড একটি iterator রিটার্ন করে,যার মধ্যমে উক্ত অবজেক্ট কে লুপের মত ট্রাভার্স করা যায়।

চলুন Vivasoft নামে একটি ক্লাস তৈরি করি:

class Vivasoft: 
    employees = ["Mehedi", "Hasan", "Mim"]

 

এই ক্লাস এর একটি অবজেক্ট তৈরি করি।

vivasoft = Vivasoft()

 

vivasoft অবজেক্টটি ট্রাভার্স করার চেষ্টা করি:

for employe in vivasoft:
    print(employe)

Traceback (most recent call last):
#Output: 
#    File "main.py", line 5, in <module>
#    for employe in vivasoft:
#    TypeError: 'vivaSoft' object is not iterable

 

এরর এর মাধ্যমে আমরা বুঝতে পারছি অবজেক্ট টি ইটারেবল না। কারণ এই ক্লাস টিতে __iter__ মেথড টি ইমপ্লিমেন্ট করা হয় নি। এখন এই ক্লাস টিকে পরিবর্তন করে ইটারেবল অবজেক্ট এ রূপান্তর করি। এর জন্য আমাদের যা করতে হবে।

    ১। __iter__ method.
    ২। __next__ method.

মেথড দুটি ইমপ্লিমেন্ট করা। পরিবর্তিত কোড টি দেখা যাক।

class Vivasoft:
    employees = ["Mehedi", "Hasan", "Mim"]

    def __iter__(self):
        return iter(self.employees)

    def __next__(self):
        while True:
            try:
                value = next(self)
            except StopIteration:
                break
        return value


vivasoft = vivaSoft()

for employe in vivasoft:
    print(vivasoft)


#Output:
#Mehedi
#Hasan
#Mim

 

ইটারেবল হিসাবে ট্রাভারর্স করার জন্য ,অবজেক্ট টিকে __iter__ পদ্ধতি প্রয়োগ করতে হবে। আসুন বিল্ট-ইন dir() পদ্ধতি ব্যবহার করে সংখ্যার একটি তালিকা(List) পরিদর্শন করি যে এটিতে একটি __iter__ আছে কিনা:

iterable_object = [1,2,3,4,5]
print(dir(iterable_object))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__',
 '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', 
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

 

আপনি দেখতে পাবেন iterable_object তালিকাটিতে __iter__ মেথড টি রয়েছে। এটি এইভাবে একটি ইটারেবল । লুপ কাজ করার জন্য, এটি List এর __iter__ মেথড কে কল করে।__iter __() মেথড টি কল করলে এটি একটি ইটারেটর অবজেক্ট দেয় এবং কোথা থেকে প্রথম ইটারেশন শুরু হবে তা মনে রাকে। ইটারেটর টি জানে কিভাবে পরবর্তী মান পেতে হয় এবং __next__ মেথড ব্যবহার করে পরবর্র্তী মান রিটার্র্ন করে।

iterator   অবজেক্ট টি প্রিন্ট করে দেখা যাক।

iterator = iter(iterable_object)
print(dir(iterator))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', 
'__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

__next__ মেথড একটি ইটারেবল অবজেক্ট কে চিহ্নিত করে।

সংক্ষেপে:

১। একটি তালিকা ইটারেবল হওয়ার  কারণ এটিতে __iter__() মেথড  রয়েছে।
২। __iter__() মেথড টি ইটারেবিলিটি  প্রদান করে।
৩। একটি ইটারেবল অবজেক্ট এর  পরবর্তী মান পেতে __next__() মেথড টি  রয়েছে।

আসুন অবজেক্ট টির __next__ মেথড টি বার বার কল করি কি হয় তা দেখি:

ierable_object = [1,2,3,4,5]
iterator = iter(ierable_object)

next(iterator) #1 next(iterator) #2 next(iterator) #3 next(iterator) #4 next(iterator) #5

 

পরবর্তী (iterator) কল করা সর্বদা List এর পরবর্তী নম্বরটি ফেরত দেয়।

এটি সম্ভব কারণ একটি পুনরাবৃত্তিকারী একটি স্টেট সহ একটি অবজেক্ট । শেষবার __next__ কল করার সময় এটি কোথায় ছেড়ে ছিল তা মনে রাখে।

এখন, আসুন “next() “` কে আরও একবার কল করুন:

>>> next(iter_numbers)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
 

List এর মান শেষ হয়ে যাওয়ার কারণে একটি StopIteration এক্সেপশন দেখায়। পরবর্তীতে Advance সেকশনে আমরা ইটারেবল, ইটারেটর নিয়ে বিস্তর আলোচনা করবো।

উদাহরন
mystr = "apple"
myit = iter(mystr)

print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))


# Output
#a
#p
#p
#l
#e
iterable_object = [1,2,3,4,5]
iterator = iter(iterable_object)

 

iterable_object = {
    "name" : "Mehedi Mim",
    "age" : 26,
    "Nationality" : "Bangladesh"
}

iterator = iter(iterable_object)

print(next(iterator))

 

iterable_object = ("apple","bananna","simsim")

iterator = iter(iterable_object)

print(next(iterator))

 

iterable_object = ["12","apple","firstname", "secodnname",20,40]

iterator = iter(iterable_object)

print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))

 

এসো নিজে করি

১। demo_class কি ইটারেবল?

class DemoClass:
    x = [1, 4, 5, 8, 3, 9]
demo_class = DemoClass()

 

২। demo_class টিকে ইটারেবল করেন-

class DemoClass:
    x = [1, 4, 5, 8, 3, 9]
    def __iter()__:
        #modify with requirements
demo_class = DemoClass()

 

৩। ইটারেটর ব্যবস্থার করে একটি লিস্ট বিপরীত দিক থেকে ট্রাভারর্স করুন। 

৪। কাস্টম ইটারেটর তৈরি তৈরী করুন।

৫।একটি ইফাইনাইট ইটারেটর তৈরী করুন।

 

ইন্টারভিউ প্রশ্নোত্তর

গুরুত্বপূর্ন প্রশ্নসমুহ

    • iter মেথড কি রিটার্ন করে?
    • iteration শেষ হয়ে গেলে next() অবজেক্ট কি রিটার্ন করে?
    • Iterator এর ব্যবহার এবং তাদের গুরুত্ব ব্যাখ্যা কর
    • যেকোনো অবজেক্ট কে ইটারেবল বানানো যাবে কি ?
    • custom ইটারেটর তৈরি করুন যেখানে ইটারে টি ৫ ইনডেক্স থেকে শুরু হবে এবং প্রত্যেক ইটারেশন ২ করে ইনডেক্স সামনের দিকে যাবে।