পাইথন yield কিওয়ার্ড কীভাবে ব্যবহার করবেন
জেনারেটররা পাইথনে সবচেয়ে ইন্টুইটিভ কনসেপ্ট নয়। বিষয়টি আরও জটিল করতে, সেগুলো একটি স্পেশাল কিওয়ার্ড "yield" ব্যবহার করে, যদিও জেনারেটররা নিজেদের ফাংশন। yield কিওয়ার্ড কী? এটি একটি return স্টেটমেন্টের সাথে কীভাবে তুলনা করে?
এগুলো ভালো প্রশ্ন। এই গাইডে, আমরা yield স্টেটমেন্ট কী এবং আপনি আপনার কোডে এটি কীভাবে ব্যবহার করতে পারেন সেটি আলোচনা করব। আমরা yield কিওয়ার্ড একশনে একটি উদাহরণের মাধ্যমে যাব। চলুন শুরু করি!
আমরা পাইথন ইটারেটর এবং জেনারেটর নিয়ে আমাদের আর্টিকেলগুলো পড়ার সুপারিশ করি এগিয়ে যাওয়ার আগে। এটি আপনাকে কিছু উপযোগী কন্টেক্সট দেবে যা আপনি yield কিওয়ার্ডের বোঝাপড়া আরও বাড়াতে ব্যবহার করতে পারেন।
বেসিক্সে ফেরত: ইটারেটর এবং জেনারেটর
লিস্টগুলো ইটারেবল অবজেক্ট হিসেবে বর্ণনা করা হয়। এর কারণ হল আপনি একটি "for" লুপ ব্যবহার করে তাদের কন্টেন্ট দেখতে পারেন। লুপ প্রতিবার এক্সিকিউট হলে, পাইথন লিস্টের একটি আইটেম অ্যাক্সেস করে। ডিকশনারি, টাপল, এবং স্ট্রিংও ইটারেবল অবজেক্ট।
একটি ফাংশন যা একটি ইটারেবল অবজেক্ট থেকে একটি আইটেম অ্যাক্সেস করে তাকে ইটারেটর বলা হয়। চলুন একটি লিস্ট তৈরি করি এবং একটি for লুপ ব্যবহার করে এর ওপর ইটারেট করি:
peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"]
for p in peppers:
print(p)
for p in peppers:
print(p)
এই কোডটি "peppers" লিস্টের সব পেপার কনসোলে প্রিন্ট করে:
Scotch Bonnet Piri Piri Cayenne Scotch Bonnet Piri Piri Cayenne
আমরা আমাদের ইটারেটর যতবার চাই ততবার ব্যবহার করতে পারি। লাস্ট উদাহরণে, আমরা "peppers" অবজেক্টের ওপর দুবার ইটারেট করেছি।
পাইথন জেনারেটর একটি ইটারেটরের মতো যা একটি অবজেক্ট রিপিট করতে ব্যবহার হয়। একটা বড় পার্থক্য আছে: আপনি একটি জেনারেটরের ওপর শুধু একবার ইটারেট করতে পারেন। যেহেতু আমরা "peppers" এর ওপর যতবার চাই ততবার ইটারেট করতে পারি, একটি জেনারেটর শুধু একবার অ্যাক্সেস করা যায়।
চলুন আমাদের পেপার লিস্টের জন্য একটি জেনারেটর ডিফাইন করি:
def print_peppers(peppers):
for p in peppers:
yield p
peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"]
pepper_generator = print_peppers(peppers)
for p in pepper_generator:
print(p)
আমরা print_peppers() নামে একটি ফাংশন ডিফাইন করি। এটি আমাদের জেনারেটর ফাংশন। এটি একটি আর্গুমেন্ট এক্সেপ্ট করে: পেপারের একটি লিস্ট যা আমরা কনসোলে প্রিন্ট করতে চাই।
আমাদের মেইন প্রোগ্রামে, আমরা print_peppers() ফাংশন কল করি এবং এটিকে pepper_generator ভেরিয়েবলে অ্যাসাইন করি। পরবর্তীতে, আমরা একটি "for" লুপ ব্যবহার করে জেনারেটরের ওপর ইটারেট করি। আমাদের for লুপ জেনারেটর অবজেক্টকে কল করে এবং এর ওপর ইটারেট করে।
চলুন আমাদের কোড রান করি:
Scotch Bonnet Piri Piri Cayenne
আউটপুট আমাদের প্রথম উদাহরণের মতোই। পার্থক্য হল আমরা আমাদের লিস্টের ওপর শুধু একবার ইটারেট করতে পারি। চলুন আবার আমাদের জেনারেটরের ওপর ইটারেট করার চেষ্টা করি:
...
for p in pepper_generator:
print(p)
for p in pepper_generator:
print(p)
আমাদের কোড রিটার্ন করে:
Scotch Bonnet Piri Piri Cayenne
আমরা একবার আমাদের জেনারেটরের ওপর ইটারেট করেছি। আমরা আবার এটি করতে পারি না। সেটিই আমাদের দ্বিতীয় for লurop কোনো ভ্যালু রিটার্ন করে না।
পাইথন yield কিওয়ার্ড
লাস্ট উদাহরণে "yield" শব্দটি লক্ষ্য করুন। এখানে একটি রিমাইন্ডার:
def print_peppers(peppers):
for p in peppers:
yield p
"yield" কিওয়ার্ড আমাদের ফাংশনের ভিতরে থাকে। এটি একটি জেনারেটর ফাংশনে একটি ভ্যালু রিটার্ন করে। এটি "return" কিওয়ার্ডের সাথে সিমিলার।
yield ব্যবহার করুন যখন আপনি একটি জেনারেটর তৈরি করতে চান যার ওপর আপনি ইটারেট করতে পারেন। লাস্ট উদাহরণে, আমরা আমাদের পেপার লিস্টের জন্য একটি জেনারেটর তৈরি করতে yield ব্যবহার করেছি।
যেকোনো ফাংশন যেটিতে yield থাকে সেটি একটি জেনারেটর রিটার্ন করে। আমরা এটি pepper_generator ভেরিয়েবলের টাইপ type() মেথড ব্যবহার করে চেক করে দেখতে পাই:
এটি আমাদের বলে দেয় যে pepper_generator, যেটি print_peppers ফাংশন অ্যাসাইন করা আছে, একটি জেনারেটর।
উপসংহার
yield কিওয়ার্ড একটি জেনারেটরের ভিতরে একটি ভ্যালু রিটার্ন করে। একটি জেনারেটর একটি স্পেশাল টাইপের ইটারেটর যেসব ভ্যালু শুধু একবার ইটারেট করা যায়। yield কিওয়ার্ড একটি return স্টেটমেন্টের সাথে সিমিলার বসতে রিটার্ন স্টেটমেন্ট জেনারেটরে ব্যবহার করা যায় না।
এখন আপনি yield কিওয়ার্ড পাইথনিস্টার মতো ব্যবহার করার জন্য রেডি!