Python Statements
Python yield and raise Statements
Python yield and raise Statements দুটি খুবই গুরুত্বপূর্ণ দুটি Statements, এই দুটির মধ্যে yield Statement টিসাধারণত প্রয়য়োজনীও জেনারেটর ফাংশন তৈরি করা হয় , এবং raise statement কোনো exceptions বা errors গুলোকে উত্থাপন করতে ব্যবহৃত হয় । আজকের পর্বে আমরা এই Python yield and raise Statements নিয়ে বিস্তারিত আলোচনা করব :
1. Python yield Statement
yield কীওয়ার্ড ব্যবহার করে সাধারণত প্রয়োজনীয় জেনারেটর ফাংশন তৈরি করা হয়। এটি সাধারণত একটি নিয়মিত পাইথন ফাংশনকে জেনারেটরে রূপান্তর করতে ব্যবহৃত হয়। একটি জেনারেটর হল পাইথনের একটি বিশেষ ফাংশন যা কলকারীকে একটি generator object রিটার্ন করে। যেহেতু এটি local variable states সংরক্ষণ করে, তাই এটি ধারা মেমরি বরাদ্দের ওভারহেড নিয়ন্ত্রণ করা হয়।
পাইথনে return এবং yield এই দুটির মধ্যে পার্থক্য কি?
S.NO. | YIELD | RETURN |
---|---|---|
1 | Yield সাধারণত একটি নিয়মিত Python ফাংশনকে generator এ রূপান্তর করতে ব্যবহৃত হয়। | return সাধারণত program execution কে শেষ করার জন্য ব্যবহৃত হয় এবং caller statement এ result “return” করে। |
2 | এটি local variable গুলোকে destroy না করেই একটি ফাংশনের কার্য সম্পাদন স্থগিত করার জন্য return এর পরিবর্তে বসে । | এটি একটি ফাংশন exit করে তার কলারকে একটি মান ফিরিয়ে দেয়। |
3 | এটি ব্যবহার করা হয় যখন generator caller কে একটি intermediate result রিটার্ন করার প্রয়োজন হয়। | এটি ব্যবহার করা হয় যখন একটি ফাংশন একটি মান পাঠাতে তৈরি হয়। |
4 | ফাংশন কলে yield statement execute করার পরে কোড লেখা যায়। | return statement এর পরে লেখা কোড execute হয় না। |
5 | এটি একাধিকবার run হতে পারে | এটি একবার run হতে পারে |
6 | Yield স্টেটমেন্ট ফাংশন শেষ স্টেট থেকে এক্সিকিউট করা হয় যেখান থেকে ফাংশনটি পজ করা হয়। | প্রতিটি ফাংশন কল শুরু থেকে ফাংশন চালায়। |
yield ব্যবহারের সুবিধা:
- yield কীওয়ার্ড ব্যবহার করা অত্যন্ত memory efficient, যেহেতু execution শুধুমাত্র তখনই ঘটে যখন কলকারী object এর উপর iterates করে।
- যেহেতু variable states গুলি সংরক্ষণ করা হয়, আমরা একই বিন্দু থেকে বিরতি এবং পুনরায় শুরু করতে পারি, এইভাবে আমাদের সময় সাশ্রয় হয়।
yield ব্যবহারের অসুবিধা :
- কখনও কখনও ফাংশন জেনারেটর থেকে একাধিক বার মান রিটার্নের কারণে কোডের প্রবাহ বোঝা কঠিন হয়ে পড়ে।
- জেনারেটর ফাংশন কলিং সঠিকভাবে পরিচালনা করা আবশ্যক, অন্যথায় প্রোগ্রামে ত্রুটি হতে পারে।
Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django
উদাহরণ ১.১. পাইথনে Generator function এবং yield Keyword
Generator ফাংশনগুলি স্বাভাবিক ফাংশনগুলির মতো আচরণ করে এবং দেখায়, তবে একটি নির্দিষ্ট বৈশিষ্ট্য সহ। Generator ফাংশনগুলি ডেটা return করার পরিবর্তে, function এ yield keyword ব্যবহার করে। জেনারেটরদের প্রধান সুবিধা হল তারা স্বয়ংক্রিয়ভাবে ফাংশন তৈরি করে __iter__() এবং next ()। জেনারেটরগুলি বিশাল বা সীমাহীন ডেটা তৈরি করার জন্য একটি খুব পরিপাটি কৌশল অফার করে।
def fun_generator():
yield "Hello world!!"
yield "W3programmers"
obj = fun_generator()
print(type(obj))
print(next(obj))
print(next(obj))
উদাহরণ ১.২. একটি নির্দিষ্ট সংখ্যক বা অসীম Sequence তৈরি করা
এখানে, আমরা yield সহ সংখ্যার একটি নির্দিষ্ট বা অসীম ক্রম তৈরি করছি, ফলন সংখ্যাটি প্রদান করে এবং সংখ্যাটিকে + 1 দ্বারা বৃদ্ধি করে।
দ্রষ্টব্য: এখানে আমরা লক্ষ্য করতে পারি যে num+=1 ফলনের পরে কার্যকর করা হয় কিন্তু রিটার্নের ক্ষেত্রে, রিটার্ন কীওয়ার্ডের পরে কোনো এক্সিকিউশন হয় না।
def inf_sequence(): num = 0 while True: yield num num += 1 for i in inf_sequence(): print(i, end=" ")
Output
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96.......
১.৩. একটি list এর সাথে yield কিভাবে কাজ করে তার উদাহরণঃ
এখানে, আমরা list থেকে even number বের করছি।
# generator to print even numbers
def print_even(test_list):
for i in test_list:
if i % 2 == 0:
yield i
# initializing list
test_list = [1, 4, 5, 6, 7]
# printing initial list
print("The original list is : " + str(test_list))
# printing even numbers
print("The even numbers in list are : ", end=" ")
for j in print_even(test_list):
print(j, end=" ")
Output:
The original list is : [1, 4, 5, 6, 7] The even numbers in list are : 4 6
সম্ভাব্য practical application টি হল একটা ডেটাবেজ থেকে যে শেষ ডেটা পাওয়া পর্যন্ত এটি থেকে বিশদ সার্চ করার সময়, yield ব্যবহার করা যেতে পারে কারণ আমাদের শুরু থেকে আর অনুসন্ধান করার দরকার নেই এবং তাই সময় বাঁচবে। ব্যবহারের ক্ষেত্রে নির্ভর করে yield এর অনেক প্রয়োগ হতে পারে।
# func to count number of given word
def print_even(test_string):
for i in test_string:
if i == "programmers":
yield i
# initializing string
test_string = " The are many web programmers around you, \
web programmers are known for teaching other web programmers"
# count numbers of programmers used in string
count = 0
print("The number of programmers in string is : ", end="")
test_string = test_string.split()
for j in print_even(test_string):
count = count + 1
print(count)
Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django
২. Python raise Statement
Python raise কীওয়ার্ড exceptions বা errors গুলোকে উত্থাপন করতে ব্যবহৃত হয়। raise কীওয়ার্ড একটি error উত্থাপন করে এবং প্রোগ্রামের নিয়ন্ত্রণ প্রবাহ বন্ধ করে। এটি একটি exceptions handler যা current exception উত্থাপন করতে ব্যবহৃত হয় যাতে এটি কল স্ট্যাকের আরও উপরে পরিচালনা করা যায়।
উদাহরণ: ২.১:
নীচের কোডে, আমরা একটি পূর্ণসংখ্যা জোড় বা বিজোড় কিনা তা পরীক্ষা করি। পূর্ণসংখ্যা বিজোড় হলে একটি exception উত্থাপিত (raise) হবে। a একটি variable যার জন্য আমরা একটি সংখ্যা 5 নির্ধারণ করেছি, একটি বিজোড় হিসাবে, তারপর যদি লুপ চেক করে যে এটি একটি বিজোড় পূর্ণসংখ্যা কিনা, যদি এটি একটি বিজোড় পূর্ণসংখ্যা হয় তবে একটি error উত্থাপিত হবে ।
a = 5
if a % 2 != 0:
raise Exception("The number shouldn't be an odd integer")
একটি error raise করার সময় আমরা কী ধরণের error raise হবে তাও ঠিক করে দিতে পারি এবং প্রয়োজনে একটি text প্রিন্ট আউট করতে পারি।
উদাহরণ ২.২:
নিচের কোডে, আমরা s-এ এসাইন কৃত String ‘apple’ value কে পরিবর্তন করার চেষ্টা করেছি এবং ValueError raise করতে একটি try-except clause লিখেছি। raise কীওয়ার্ড tring can’t be changed into an integer” Message সাথে একটি মান error raise করে।
s = 'apple'
try:
num = int(s)
except ValueError:
raise ValueError("String can't be changed into integer")
কোনো exception ক্লাস নির্দিষ্ট না করেই একটি Exception Raise করা
আমরা যখন raise কীওয়ার্ড ব্যবহার করি, তখন এর সাথে একটি exception ক্লাস দিতে আমরা বাধ্য না। যখন আমরা raise কীওয়ার্ড দিয়ে কোনো exception ক্লাসের নাম না দেই , তখন এটি সর্বশেষ ঘটে যাওয়া exception টিকে পুনরায় raise করে।
উদাহরণ ২.৩:
উপরের উদাহরণে, আমরা ‘apple’ string কে integer এ পরিবর্তন করার চেষ্টা করেছি এবং ValueError raise করতে একটি try-except clause লিখেছি। কোডটি আগের মতোই, তবে যদি আমরা কোনো exception class প্রদান না করি, এটি সর্বশেষ ঘটে যাওয়া exception টিকে পুনরায় raise করে।
s = 'apple'
try:
num = int(s)
except:
raise
raise কীওয়ার্ডের সুবিধা:
- এটি আমাদের exceptions গুলি raise করতে সাহায্য করে যখন আমরা এমন পরিস্থিতিতে পড়তে পারি যেখানে আমরা execution করতে পারি না।
- এটি আমাদের ধরা একটি exception পুনরায় raise করতে সাহায্য করে।
- Raise আমাদের যে কোনো সময় একটি exception throw করতে দেয়।
- আমরা যখন input validations নিয়ে কাজ করতে চাই তখন এটি বেশ উপকারী।