পাইথনে ইটারেটর (Iterator) এবং ইটারেবল (Iterable) কি? এদের মধ্যে পার্থক্য কি? বিস্তারিত উদাহারণ সহকারে জানতে চাই।

asked 25 Jan, 05:15

_Shaon_'s gravatar image

_Shaon_
756216

edited 04 Feb, 07:39

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
23618

@menon ভাই, ওটা আমি প্রশ্ন করার আগেই দেখছি। সেখানে আসলে ঐ ইরর থ্রো করার ব্যাপারটায় ফোকাস করা হয়েছে। কিন্তু আমি ইটারেটর, ইটারেবল সম্বন্ধে পরিষ্কার ধারণা চাচ্ছিলাম।

(25 Jan, 10:10) _Shaon_

যেসব অবজেক্টগুলোকে ইটারেট করা যায় মানে যেসব অবজেক্ট থেকে একটা একটা করে ভ্যালু ফেচ করা যায় তাদের ইটারেবল বলে। অন্যভাবে বলা যায় যেসব অবজেক্টের উপর আমরা ফর লুপ চালাতে পারি সেগুলো ইটারেবল, যেহেতু ফর লুপ চালিয়ে আমরা একটা একটা করে ভ্যালু পাই। মূলত সব সিকোয়েন্স অবজেক্টগুলো যেমন স্ট্রিং, লিস্ট, টাপল এগুলো ইটারেবল।

>>> string = "iterable"
>>> for char in string:
...     print(char)
... 
i
t
e
r
a
b
l
e

পাইথনীয় ভাষায় বলতে গেলে যেসব অবজেক্টকে বিল্টইন iter() মেথড দিয়ে কল করা যায় তাদের ইটারেবল বলে। ইটারেটরকে iter() মেথড দিয়ে কল করলে আমরা একটা ইটারেটর পাব। ইটারেটর হচ্ছে সেই অবজেক্ট যাকে বিল্টইন next() মেথড দিয়ে কল করে আমরা ইটারেটবল থেকে একটা একটা করে ভ্যালু পেতে পারি। ইটারবলগুলোকে ইটারেট [ইটারেটর এর মাধ্যমে next() দিয়ে অথবা for দিয়ে] করতে থাকলে একটা একটা করে ভ্যালু দিবে এবং সব ভ্যালু ফেচ করা হয়ে গেলে StopIteration এই এক্সেপশন থ্রো করবে।

>>> string = "iterable"
>>> it = iter(string)
>>> next(it)
'i'
>>> next(it)
't'
>>> next(it)
'e'
>>> next(it)
'r'
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'l'
>>> next(it)
'e'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

ইটারেবল অবজেক্টগুলোতে মূলত __iter__() এবং __next__() [পাইথন টু তে next()] এই দুটি মেথড ইমপ্লিমেন্ট করা থাকে। এই দুটি মেথড ব্যবহার করে আমরা খুব সহজেই নিজেদের ইটারেবল অবজেক্ট তৈরি করে ফেলতে পারি:

class Odds:
    def __init__(self, maximum = 1):
        self.maximum = maximum

    def __iter__(self):
        self.n = 1
        return self

    def __next__(self):
        if self.n <= self.maximum:
            result = self.n
            self.n += 2
            return result
        else:
            raise StopIteration

এটি বিজোড় সংখ্যাগুলোর একটা ইটারেবল অবজেক্ট।

>>> oddNumbers = Odds(10)
>>> for number in oddNumbers:
...     print(number)
... 
1
3
5
7
9
>>> it = iter(oddNumber)
>>> it = iter(oddNumbers)
>>> next(it)
1
>>> next(it)
3
permanent link

answered 28 Jan, 23:56

Ashfaqur%20Rahman's gravatar image

Ashfaqur Rahman
6749

edited 29 Jan, 06:04

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
23618

আপনি যে ইটারেটর ক্লাস তৈরী করছেন আমি যদি ঐ ক্লাসের একটা অবজেক্ট দিয়ে বিল্টইন ইটার মেথড করি তাহলে দেখা যায় ঐ ক্লাসের ইটার মেথড কল হয়। নেক্সট মেথডের ক্ষেত্রেও একই রকম হয়।

যেহেতু সব ইটারেবলের (ইটারেটর ও ইটারেবল) ইটার বা ইটার এবং নেক্সট আছে তাহলে আলাদা ভাবে আর বিল্টইন মেথডের কি দরকার ছিলো? আর বিল্টইন মেথড কল করলে ক্লাসের মেথডই বা কল হয় কিভাবে?

(29 Jan, 03:52) _Shaon_
1

বিল্টইন iter() এবং next() মেথড অবজেক্টের __iter()__ এবং __next__() মেথডকেই কল করে।

iter(object) কল করা আর object.__iter__() কল করা একই কথা। next(objectIterator) কল করা আর object.__next__() কল করা একই কথা।

তবে এক্ষেত্রে যেমন object.__iter__() অবজেক্টটিকেই ইটারেটর হিসেবে পাস করছে সেটা সবসময় নাও হতে পারে, ইটারেটর সম্পূর্ণ আলাদা একটি অবজেক্ট হতে পারে, তখন object.__iter__() ঐ ইটারেটর অবজেক্টটি রিটার্ন করবে।

(29 Jan, 04:01) Ashfaqur Rahman
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×92
×2
×1

question asked: 25 Jan, 05:15

question was seen: 210 times

last updated: 04 Feb, 07:39