কম্পিউটার

কিভাবে একটি পাইথন জেনারেটর লিখতে হয়

পাইথনে ইটারেটর একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। তারা আপনাকে এমন একটি বস্তু তৈরি করার অনুমতি দেয় যা পুনরাবৃত্তি করা যেতে পারে। এটি একটি ভাল উপায় ডেটা সঞ্চয় করার যা একটি ফর ইন লুপের মাধ্যমে অ্যাক্সেস করা যেতে পারে।

পুনরাবৃত্তিকারীদের সাথে সমস্যা হল যে এটি তৈরি করতে অনেক কাজ লাগে। তারা দরকারী, কিন্তু আপনি একটি কাজ করতে অনেক কোড লিখতে হবে. জেনারেটর এই সমস্যা সমাধান করতে সাহায্য করে।

এই গাইডে, আমরা পাইথন জেনারেটর কী এবং কেন সেগুলি ব্যবহার করা উচিত সে সম্পর্কে কথা বলতে যাচ্ছি। আমরা পাইথনে একটি জেনারেটরও প্রয়োগ করব যাতে তারা কীভাবে কাজ করে তা বুঝতে আপনাকে সাহায্য করে।

আর কোনো ঝামেলা ছাড়াই, চলুন শুরু করা যাক!

জেনারেটর কি?

একটি জেনারেটর পাইথনে একটি পুনরাবৃত্তি তৈরি করার একটি সহজ উপায়। এটি এমন একটি ফাংশন যা একটি বস্তু ফেরত দেয় যার উপর আপনি পুনরাবৃত্তি করতে পারেন।

জেনারেটর প্রায়ই সিনট্যাকটিক চিনি বলা হয়। এটি কারণ তারা অগত্যা পাইথনে নতুন কার্যকারিতা যোগ করে না। তারা আপনার কোড আরো দক্ষ করতে সাহায্য করে.

পুনরাবৃত্তির মত, আপনি শুধুমাত্র একবার একটি জেনারেটরের উপর পুনরাবৃত্তি করতে পারেন। এর কারণ জেনারেটররা ট্র্যাক রাখে যে তারা কতবার পুনরাবৃত্তি হয়েছে এবং রিসেট করা যাবে না।

আসুন একটি পাইথন পুনরাবৃত্তিকারীর দিকে নজর দেওয়া যাক:

81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷

গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় ব্যয় করেছে।

class Cookies:
	def __init__(self, value):
		self.value = value

	def __iter__(self):
		return self

	def __next__(self):
		return self.value

এই কোডটি কুকিজ নামে একটি পুনরাবৃত্তিকারী তৈরি করে। আপনি যখন এই পুনরাবৃত্তিকারীর মাধ্যমে ডেটা পাস করবেন, তখন এটি একটি পুনরাবৃত্তিযোগ্য বস্তুতে পরিণত হবে। এর মানে হল যে আপনি একটি ফর ইন লুপ ব্যবহার করে ডেটা লুপ করতে পারেন। আপনি যদি এই কোডটি দেখছেন এবং মনে করেন যে এটি সত্যিই দীর্ঘ, এটির কারণ এটি।

জেনারেটর আমাদের এই কোড ছোট করতে সাহায্য করতে পারে। আমাদের উপরের পুনরাবৃত্তির জন্য একটি জেনারেটর লিখুন:

def cookies(value):
	while True:
		yield value

আমাদের কোড আকারে ব্যাপকভাবে হ্রাস করা হয়েছে। আসুন আলোচনা করা যাক কিভাবে এটি কাজ করে।

একটি জেনারেটর হল একটি ফাংশন যাতে একটি রিটার্ন স্টেটমেন্টের পরিবর্তে একটি ফলন কীওয়ার্ড থাকে। ফলন বিবৃতি একটি ফাংশন থেকে একটি মান প্রদান করে।

একটি ফলন বিবৃতি এবং একটি রিটার্ন স্টেটমেন্টের মধ্যে পার্থক্য হল যে একটি রিটার্ন স্টেটমেন্ট একটি ফাংশনকে চলতে বাধা দেয়, যেখানে একটি ফলন বিবৃতি ফাংশনটিকে বিরতি দেয় এবং পুনরাবৃত্তি চালিয়ে যায়।

আসুন আমাদের সাধারণ জেনারেটর ফাংশনটি পুনরাবৃত্তি করার চেষ্টা করি:

for cookie in cookies("Raspberry"):
	print(cookie)

আমাদের কোড ফিরে আসে:

রাস্পবেরি

রাস্পবেরি


আমরা আমাদের প্রোগ্রাম বন্ধ না করা পর্যন্ত এই কোডটি পুনরাবৃত্তি করতে থাকে। কারণ আমরা একটি while ব্যবহার করেছি লুপ যা চিরতরে কার্যকর করে। এটি বেশিরভাগ ক্ষেত্রে খুব দরকারী নয়। চলুন একটি জেনারেটর লিখি যা একটি ক্রিয়া সম্পাদন করা হলে থেমে যায়।

কিভাবে একটি পাইথন জেনারেটর লিখতে হয়

আমাদের কাছে কুকিজের একটি তালিকা আছে যা আমরা কনসোলে প্রিন্ট করতে চাই। এই তালিকা এই মত দেখায়:

[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]

কনসোলে এইগুলি প্রিন্ট করার জন্য, আমরা একটি সাধারণ জেনারেটর তৈরি করতে পারি। একটি নতুন পাইথন ফাইল খুলুন এবং নিম্নলিখিত কোডে পেস্ট করুন:

def print_cookies(cookies):
	length = len(cookies)
	for cookie in range(0, length):
yield cookies[cookie]

আমাদের জেনারেটর আমাদের নির্দিষ্ট করা তালিকার প্রতিটি কুকির মধ্য দিয়ে যায় এবং প্রতিটি কুকি পৃথকভাবে ফেরত দেয়। এই জেনারেটরটি এখনও কাজ করে না। এটির উপর পুনরাবৃত্তি করার জন্য আমাদের একটি লুপ ব্যবহার করতে হবে:

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

for c in print_cookies(cookie_list):
	print(c)

আমরা cookie_list নামে একটি অ্যারে সংজ্ঞায়িত করেছি যা চারটি কুকির তালিকা সংরক্ষণ করে। তারপরে আমরা একটি লুপ সেট আপ করেছি যা আমাদের জেনারেটর ব্যবহার করে cookie_list-এর মানগুলির মাধ্যমে পুনরাবৃত্তি করতে ব্যবহার করে। .

আমাদের জন্য লুপে প্রতিটি পুনরাবৃত্তির জন্য, উৎপন্ন বস্তুটি কনসোলে মুদ্রিত হয়:

রাস্পবেরি

চক-চিপ

দারুচিনি

ওট

আমরা এটা করেছি! এই জেনারেটর ভ্যারিয়েবল cookie_list এর প্রতিটি মান না হওয়া পর্যন্ত মান ফেরত দেয় উপর পুনরাবৃত্তি করা হয়েছে.

জেনারেটর ব্যবহার ক্ষেত্রে একটি পরিসীমা আছে. ধরা যাক যে আমাদের কাছে অর্ডার মূল্যের একটি তালিকা রয়েছে যা আমরা মোট করতে চাই। আমরা নিম্নলিখিত কোড ব্যবহার করে এটি করতে পারি:

def total_orders(orders):
	length = len(orders)
	total = 0
	for o in range(0, length):
		total += orders[o]
		yield total

এই জেনারেটরটি একটি তালিকায় সমস্ত অর্ডারের মূল্যের একটি চলমান মোট রাখবে। প্রতিটি আইটেম পুনরাবৃত্তি করার পরে, জেনারেটর অর্ডারের বর্তমান মোট মূল্য প্রদান করবে। আসুন একটি লুপ লিখি যা আমাদের জেনারেটর ব্যবহার করে:

order_list = [2.30, 2.50, 1.95, 6.00, 7.50, 2.15]

for order in total_orders(order_list):
	print(order)

আমাদের কোড ফিরে আসে:

2.3

4.8

6.75

12.75

20.25

22.4

আমাদের জেনারেটর অর্ডার_লিস্ট ভেরিয়েবলে সমস্ত অর্ডারের ক্রমবর্ধমান মান গণনা করেছে। তালিকার প্রতিটি পুনরাবৃত্তি নতুন ক্রমবর্ধমান মান প্রদান করে।

কিভাবে একটি জেনারেটর এক্সপ্রেশন লিখতে হয়

জেনারেটর ইতিমধ্যে একটি পুনরাবৃত্তির চেয়ে লিখতে সহজ। ক্লিনার কোড লেখার জন্য আমাদের অনুসন্ধান থামার দরকার নেই, জেনারেটর এক্সপ্রেশনের জন্য ধন্যবাদ।

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

আসুন আমাদের কুকিজ উদাহরণের জন্য একটি জেনারেটর লিখি:

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

cookie_generator = (cookie for cookie in cookie_list)

আমরা cookie_list ভেরিয়েবলে কুকিজের একটি তালিকা সংজ্ঞায়িত করেছি . তারপরে আমরা একটি জেনারেটর এক্সপ্রেশন তৈরি করি। এই অভিব্যক্তিটি তালিকা বোঝার জন্য সিনট্যাক্স ব্যবহার করে তবে একটি বড় পার্থক্যের সাথে:তালিকা বোঝা বর্গাকার বন্ধনীর মধ্যে সংজ্ঞায়িত করা হয়, যেখানে জেনারেটরগুলি বৃত্তাকার বন্ধনীগুলির মধ্যে সংজ্ঞায়িত করা হয়।

আসুন একটি লুপ তৈরি করি যা এক্সপ্রেশনের উপর পুনরাবৃত্তি করে:

for cookie in cookie_generator:
	print(cookie)

আমাদের কোড ফিরে আসে:

রাস্পবেরি

চক-চিপ

দারুচিনি

ওট

এই জেনারেটরের প্রতিক্রিয়া আমাদের প্রথম উদাহরণের মতই। আমাদের সিনট্যাক্স উল্লেখযোগ্যভাবে পরিষ্কার.

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে আপনি যখন জেনারেটর এক্সপ্রেশন ব্যবহার করে ঘোষিত জেনারেটরের উপর পুনরাবৃত্তি করেন, আপনি এটিকে একটি ফাংশন হিসাবে কল করবেন না। আমাদের cookie_generator জেনারেটর কোনো ইনপুট মান গ্রহণ করে না:এটি ইতিমধ্যেই cookie_list-এ পুনরাবৃত্তি করতে প্রয়োজনীয় কোড ধারণ করে তালিকা

আপনার শুধুমাত্র জেনারেটর এক্সপ্রেশন সিনট্যাক্স ব্যবহার করা উচিত যখন আপনাকে একটি সাধারণ ফাংশন সম্পাদন করে এমন একটি জেনারেটর লিখতে হবে। মানগুলির একটি তালিকা মুদ্রণ একটি ভাল উদাহরণ; একটি নির্দিষ্ট সংখ্যা দ্বারা একটি তালিকায় মান গুণ করা আরেকটি ভাল উদাহরণ।

কারণ জেনারেটর এক্সপ্রেশন সিনট্যাক্স পরিষ্কার হলেও এটি মূলত এক-লাইন এক্সপ্রেশনের জন্য ডিজাইন করা হয়েছে। যদি আপনার জেনারেটর কোডের একাধিক লাইন ব্যবহার করে, তাহলে আমরা এই নিবন্ধে আগে আলোচনা করা সিনট্যাক্স ব্যবহার করে এটিকে জেনারেটর ফাংশন হিসাবে লিখুন৷

জেনারেটর কেন ব্যবহার করা হয়?

জেনারেটর ব্যবহার করার প্রাথমিক কারণ হল যে তারা পুনরাবৃত্তিকারীর চেয়ে আরও সংক্ষিপ্ত।

জেনারেটর একটি ফাংশনের মতো এবং কাজ করার জন্য কোনো __init__, __iter__, বা __next__ স্টেটমেন্টের প্রয়োজন নেই। এটি একটি পুনরাবৃত্তিকারীর থেকে ভিন্ন যার জন্য এই তিনটি বিবৃতি প্রয়োজন। এই আচরণের মানে হল যে আপনি একটি জেনারেটরকে কোডের উল্লেখযোগ্যভাবে কম লাইনে প্রয়োগ করতে পারেন যদি আপনি একটি পুনরাবৃত্তি লিখতে পারেন।

আরও কী, জেনারেটর মেমরি ব্যবহারে দক্ষ। জেনারেটর একটি সময়ে শুধুমাত্র একটি আইটেম উত্পাদন. ফলাফল ফেরত দেওয়ার আগে তারা মেমরিতে একটি সম্পূর্ণ ক্রম তৈরি করে না। এটি জেনারেটরগুলিকে খুব ব্যবহারিক করে তোলে যদি আপনাকে ডেটার একটি বড় তালিকার উপর পুনরাবৃত্তি করতে হয়।

এটি যেভাবে কাজ করে তা হল পুনরাবৃত্তিকারীরা একটি অলস মূল্যায়ন পদ্ধতি ব্যবহার করে। তারা শুধুমাত্র একটি পুনরাবৃত্তিযোগ্য বস্তুর পরবর্তী উপাদান তৈরি করে যখন সেই আইটেমটি অনুরোধ করা হয়।

উপসংহার (এবং চ্যালেঞ্জ)

জেনারেটর আপনাকে আরও একটি পাইথনিক ইটারেটর তৈরি করতে দেয়।

জেনারেটর __init__, __iter__, বা __next__ স্টেটমেন্ট না লিখেই ইটারেটর প্রোটোকল ব্যবহার করে বস্তু লেখা সহজ করে তোলে। জেনারেটর ফাংশন হিসাবে সংজ্ঞায়িত করা হয়. তারা একটি জেনারেটর বন্ধ করতে ফলন বিবৃতি ব্যবহার করে এবং তার নিয়মিত ক্রিয়াকলাপে ফিরে আসার আগে মূল প্রোগ্রামে একটি মান পাস করে।

আপনি যদি একটি চ্যালেঞ্জ খুঁজছেন, এখানে কয়েকটি ধারণা রয়েছে:

  • একটি জেনারেটর লিখুন যা একটি স্ট্রিংকে বিপরীত করে।
  • একটি জেনারেটর লিখুন যা কেবলমাত্র মানগুলির তালিকা থেকে একটি নির্দিষ্ট শব্দ ধারণ করে এমন মান প্রদান করে৷
  • একটি জেনারেটর লিখুন যা একটি তালিকার প্রতিটি সংখ্যাকে দুই দ্বারা গুণ করে।

আরও পড়ার জন্য, পাইথন ইটারেটরগুলি কীভাবে লিখবেন এবং ব্যবহার করবেন সে সম্পর্কে আমাদের টিউটোরিয়াল দেখুন। এখন আপনি একজন বিশেষজ্ঞের মতো পাইথনে জেনারেটরের সাথে কাজ শুরু করতে প্রস্তুত!


  1. পাইথন - কিভাবে একটি CSV ফাইলে পান্ডাস ডেটাফ্রেম লিখতে হয়

  2. পাইথনে প্যাটার্ন কিভাবে প্রিন্ট করবেন?

  3. পাইথন প্রোগ্রাম কিভাবে চালাবেন?

  4. ফ্যাক্টরিয়াল খুঁজে বারবার পাইথন ফাংশন কিভাবে লিখতে হয়?