ডেকোরেটর (Decorator) এবং জেনারেটর (Generator) পাইথনের দুটি শক্তিশালী ফিচার, যা কোডকে আরও কার্যকর, মডুলার এবং পুনঃব্যবহারযোগ্য করতে সাহায্য করে।
ডেকোরেটর (Decorator)
ডেকোরেটর হলো পাইথনের ফাংশনের এক ধরণের বিশেষ ফাংশন, যা অন্য একটি ফাংশনের কার্যকারিতা পরিবর্তন বা সম্প্রসারিত করতে ব্যবহৃত হয়। ডেকোরেটর মূলত একটি ফাংশনকে "ডেকোরেট" করে, অর্থাৎ ফাংশনের ভেতরে নতুন ফিচার যোগ করে দেয়, যা আসল ফাংশনের কার্যকারিতাকে পরিবর্তন না করেও এর আউটপুট বা ফলাফল প্রভাবিত করে।
ডেকোরেটরের সাধারণ গঠন:
def decorator_function(original_function):
def wrapper_function():
# কিছু কাজ করতে পারেন
original_function()
# আরও কিছু কাজ করতে পারেন
return wrapper_function
ডেকোরেটর প্রয়োগ: ডেকোরেটর ব্যবহার করতে ফাংশনের উপরে @decorator_name লেখা হয়। এটি প্রায়শই @ চিহ্ন ব্যবহার করে এক লাইনে সংক্ষেপে লেখা হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি ডেকোরেটর তৈরি করতে হবে, যা যেকোনো ফাংশনের আগে এবং পরে একটি মেসেজ প্রিন্ট করবে।
def my_decorator(func):
def wrapper():
print("Function is about to execute.")
func()
print("Function has executed.")
return wrapper
@my_decorator
def say_hello():
print("Hello, World!")
say_hello()
আউটপুট:
Function is about to execute.
Hello, World!
Function has executed.
ব্যাখ্যা:
- এখানে
my_decoratorএকটি ডেকোরেটর, যাsay_helloফাংশনের আগে এবং পরে মেসেজ প্রিন্ট করে। @my_decoratorফাংশনের উপরে লেখা হওয়ায়say_hello()ফাংশনটি কল করলে আগে ও পরে ডেকোরেটরের কাজ সম্পন্ন হয়।
ডেকোরেটরের ব্যবহার:
ডেকোরেটর সাধারণত লগিং, অথেন্টিকেশন, ইনপুট যাচাই, প্রয়োজনীয় কাজের আগে/পরে নির্দিষ্ট কাজ সম্পন্ন করার জন্য ব্যবহৃত হয়।
জেনারেটর (Generator)
জেনারেটর হলো একটি বিশেষ ধরনের ফাংশন, যা বড় ডেটাসেট তৈরি বা পুনরাবৃত্তিমূলক ডেটা উৎপন্ন করতে ব্যবহৃত হয়। এটি yield কীওয়ার্ড ব্যবহার করে এবং প্রতিবার কল করার সময় বর্তমান অবস্থানে থেমে থাকে এবং পুনরায় শুরু করার সময় পরবর্তী মান প্রদান করে। জেনারেটর প্রচুর মেমোরি বাঁচাতে সাহায্য করে কারণ এটি সম্পূর্ণ লিস্ট না বানিয়ে একে একে মান প্রদান করে।
জেনারেটর তৈরির জন্য yield কীওয়ার্ড ব্যবহার:
yield কীওয়ার্ডের মাধ্যমে আমরা ফাংশনটিকে জেনারেটরে রূপান্তর করতে পারি।
উদাহরণ:
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # আউটপুট: 1
print(next(gen)) # আউটপুট: 2
print(next(gen)) # আউটপুট: 3
ব্যাখ্যা:
- এখানে
my_generatorএকটি জেনারেটর ফাংশন, যা প্রতিবারyieldদিয়ে একটি করে মান প্রদান করে। next()ফাংশন ব্যবহার করে প্রতিবার একেকটি মান বের করা হয়।
লুপ দিয়ে জেনারেটর ব্যবহার:
জেনারেটরকে লুপের সাহায্যে সহজেই ইটারেট করা যায়।
def count_down(n):
while n > 0:
yield n
n -= 1
for number in count_down(5):
print(number)
আউটপুট:
5
4
3
2
1
ব্যাখ্যা:
- এখানে
count_downজেনারেটর ফাংশনটি প্রতি ইটারেশনে একটি করে সংখ্যা প্রদান করে যতক্ষণ নাnএর মান শূন্যে পৌঁছায়।
জেনারেটরের সুবিধা:
- মেমোরি ব্যবস্থাপনা: এটি বড় ডেটাসেট নিয়ে কাজ করার সময় মেমোরি সাশ্রয় করে।
- দ্রুত ফলাফল: যেকোনো বড় ডেটাসেটের পরবর্তী আইটেমে দ্রুত অ্যাক্সেস পাওয়া যায়।
- লাজি ইভালুয়েশন: এটি একবারে সম্পূর্ণ লিস্ট না বানিয়ে আইটেমগুলোকে লাজি ইভালুয়েশন (প্রয়োজন অনুসারে) তৈরি করে।
সংক্ষেপে তুলনা:
| ফিচার | ডেকোরেটর | জেনারেটর |
|---|---|---|
| ব্যবহার | ফাংশনের কার্যকারিতা বাড়ানো বা পরিবর্তন করতে | পর্যায়ক্রমে ডেটা প্রদান করতে |
| কীওয়ার্ড | @decorator_name | yield |
| উদাহরণ | লগিং, অথেন্টিকেশন, ইনপুট যাচাই | বড় ডেটাসেট প্রক্রিয়াকরণ, বড় লুপ, স্ট্রিমিং |
| মেমোরি ব্যবস্থাপনা | অধিক ব্যবহার করতে পারে | কম মেমোরি ব্যবহার করে |
সংক্ষেপে:
- ডেকোরেটর ফাংশনের কার্যকারিতা বাড়াতে বা পরিবর্তন করতে ব্যবহৃত হয়।
- জেনারেটর বড় ডেটাসেট বা পুনরাবৃত্তিমূলক কাজ সম্পন্ন করার জন্য কার্যকরী একটি ফাংশন, যা
yieldএর মাধ্যমে একবারে একেকটি মান প্রদান করে।
ডেকোরেটর এবং জেনারেটর পাইথন প্রোগ্রামিংকে আরও সহজ, কার্যকর এবং মডুলার করে তোলে।
Read more