পাইথনের মধ্যে ইটারেটর

পাইথনের মধ্যে ইটারেটর

এই প্রবন্ধে পাইথনের ইটারেটর সম্পর্কে ব্যাখ্যা করা হয়েছে।

YouTube Video

পাইথনের মধ্যে ইটারেটর

সংক্ষিপ্ত বিবরণ

পাইথনে, ইটারেটর হল একটি মৌলিক উপায় যেটা দিয়ে তালিকা, ট্যুপল বা ডিকশনারির মত সংগ্রহের উপাদানগুলো একে একে প্রক্রিয়া করা যায়।

ইটারেটর কী?

ইটারেটর হল এমন একটি অবজেক্ট যা উপাদানগুলো একে একে ফেরত দিতে পারে। পাইথনে, কোন অবজেক্টকে ইটারেটর ধরা হয় যদি সেটি নিম্নোক্ত দুটি শর্ত পূরণ করে:।

  • এর __iter__() মেথড আছে, যা সেটিকে নিজেই ফেরত দেয়।
  • এর __next__() মেথড আছে, যেটি পরবর্তী উপাদান ফেরত দেয়। আর কোনো উপাদান না থাকলে এটি StopIteration ত্রুটি তোলে।
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • এই কোডে, iter() ফাংশনটি একটি তালিকাকে ইটারেটরে রূপান্তর করতে ব্যবহৃত হয়, এবং next() ফাংশনটি একে একে প্রতিটি উপাদান বের করে দেখাতে ব্যবহৃত হয়।

ইটারেবল থেকে পার্থক্য

ইটারেবল হল এমন একটি অবজেক্ট যার __iter__() মেথড আছে এবং যাকে for লুপে ব্যবহার করা যায়। তালিকা (list) ও ট্যুপল (tuple) ইটারেবলের উদাহরণ।

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • এই কোডটি একটি তালিকার মতো ইটারেবেল থেকে ইটারেটর নেওয়া এবং next() ব্যবহার করে উপাদানগুলো ক্রমানুযায়ী বের করার একটি উদাহরণ।

কিভাবে পরীক্ষা করবেন:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • nums ইটারেবল হলেও ইটারেটর নয় এবং iter(nums) দ্বারা পাওয়া it একটি ইটারেটর—এই কোডে সেটিই নিশ্চিত করা হয়েছে।

ফর লুপ ও ইটারেটরের সম্পর্ক

পাইথনের for লুপ অভ্যন্তরীণভাবে নিচের মত কাজ করে:।

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • যেমনটি দেখা যায়, for লুপ ইটারেটর ব্যবহার করেই পুনরাবৃত্তি সম্পন্ন করে।

কাস্টম ইটারেটর তৈরি করা

আপনি ক্লাস ব্যবহার করে কাস্টম ইটারেটর তৈরি করতে পারেন।

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • এই কোডে Countdown ক্লাস দিয়ে একটি নিজস্ব ইটারেটর সংজ্ঞায়িত করা হয়েছে, যা কাউন্টডাউন করে এবং for লুপ ব্যবহার করে ৩ থেকে ১ পর্যন্ত সংখ্যাগুলি প্রিন্ট করে।

ইটারেটর ও জেনারেটরের পার্থক্য এবং কখন কোনটা ব্যবহার করবেন

জেনারেটর ইটারেটরের অনুরূপ কাজ করে। এগুলো আপনাকে আরও সহজভাবে ইটারেটর সংজ্ঞায়িত করতে দেয়।

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • এই কোডে yield ব্যবহার করে কাউন্টডাউন করা একটি জেনারেটর ফাংশন সংজ্ঞায়িত করা হয়েছে, এবং for লুপের মাধ্যমে ৩ থেকে ১ পর্যন্ত সংখ্যা প্রিন্ট করা হয়েছে।

ইটারেটর (ক্লাস) ও জেনারেটর (ফাংশন) এর মধ্যে পার্থক্য

ইটারেটর (ক্লাস) ও জেনারেটর (ফাংশন) এর মধ্যে নীচের পার্থক্যগুলি রয়েছে:।

বৈশিষ্ট্য ইটারেটর (ক্লাস) জেনারেটর (ফাংশন)
সংজ্ঞা __iter__() + __next__() yield সহ ফাংশন
অবস্থা ব্যবস্থাপনা নিজে হাতে অ্যাট্রিবিউট সামলাতে হয় স্বয়ংক্রিয়ভাবে অবস্থা রক্ষা করে
পাঠযোগ্যতা জটিল হতে পারে সহজ ও পরিষ্কার
  • তারা কিভাবে সংজ্ঞায়িত হয় সে বিষয়ে পার্থক্য একটি ইটারেটর সংজ্ঞায়িত করতে দুটি মেথড নিজে হাতে লিখতে হয়: __iter__() এবং __next__()। এর বিপরীতে, জেনারেটর শুধুমাত্র এক ধরনের ফাংশন যেখানে yield কীওয়ার্ড ব্যবহৃত হয়, ফলে কোড আরও সহজ হয়।

  • অবস্থা ব্যবস্থাপনায় পার্থক্য ইটারেটরের ক্ষেত্রে, বর্তমান অবস্থা ও অগ্রগতি নিজ হাতে ভ্যারিয়েবল ব্যবহার করে সামলাতে হয়। কিন্তু জেনারেটরগুলো তাদের অবস্থা পাইথনের অভ্যন্তরে স্বয়ংক্রিয়ভাবে ধরে রাখে, ফলে নিজ হাতে কষ্ট কম হয়।

  • কোডের পাঠযোগ্যতা ইটারেটর সাধারণত জটিল হয় কারণ এতে একাধিক মেথড ও নিজ হাতে অবস্থা সামলাতে হয়। পরিপ্রেক্ষিতে, জেনারেটরকে আরও সহজ সিনট্যাক্সে লেখা যায়, ফলে নতুনদের জন্যও বোধগম্য হয়।

ইটারেটর ব্যবহারের স্ট্যান্ডার্ড লাইব্রেরি: itertools

itertools পাইথনের একটি স্ট্যান্ডার্ড লাইব্রেরি, যা ইটারেটর নিয়ে কাজ করার জন্য শক্তিশালী টুল সরবরাহ করে।

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • এছাড়াও এতে রয়েছে cycle, repeat, chain, islice, এবং tee-এর মতো অন্যান্য অনেক ফাংশন।

ইটারেটরের ব্যবহারের ক্ষেত্র

ইটারেটরের ব্যবহার ক্ষেত্রের মধ্যে নীচের বিষয়গুলো অন্তর্ভুক্ত:।

  • ফাইলের লাইন প্রক্রিয়াকরণ: একটি ফাইল থেকে লাইনগুলো একে একে ইটারেটরের মাধ্যমে পড়া।
  • মেমোরি-সাশ্রয়ী প্রক্রিয়াকরণ: অনেক ডাটা ক্রমানুসারে প্রক্রিয়া করা।
  • অসীম সিকোয়েন্স উপস্থাপন: itertools.count()-এর মতো ফাংশন ব্যবহার করা।

সারসংক্ষেপ

  • ইটারেটর হল এমন একটি অবজেক্ট যা পরবর্তী মান ক্রমানুসারে ফেরত দিতে পারে।
  • আপনি __iter__()__next__() সংজ্ঞায়িত করে কাস্টম ইটারেটর তৈরি করতে পারেন।
  • এগুলো স্বয়ংক্রিয়ভাবে for লুপ কিংবা next() ফাংশনের মাধ্যমে পরিচালনা করা যায়।
  • জেনারেটর বা itertools ব্যবহার করলে আরও দক্ষ প্রক্রিয়াকরণ সম্ভব।

ইটারেটর ব্যবহার করলে আপনি বড় ডাটা ক্রমানুসারে মেমোরি-সাশ্রয়ীভাবে প্রক্রিয়া করতে পারবেন, ফলে অবস্থা নিয়ন্ত্রণ ও প্রোগ্রামের কার্যকারিতা উন্নত হবে।

আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।

YouTube Video