Yield কি সেটা বোঝার জন্য Generator বোঝা লাগবে । আবার Generator কি সেটা বোঝার জন্য Iterables বুঝতে হবে । কি প্রথমেই মাথা ঘুরে গেল ? আচ্ছা মাথা ঘুরলে ঘুরতে দেন :D আমরা শুরু করে দেই ।
Iterables কি ?
আমরা যখন কোন লিস্ট ক্রিয়েট করি । আমরা লিস্টের আইটেম গুলি একটা একটা করে রিড করতে পারি । এটাকেই বলা হচ্ছে iteration
code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
my_list = [ 2, 3, 5] | |
for i in my_list: | |
print (i) | |
Output: | |
2 | |
3 | |
5 |
এখানে my_list হল iterable . যখন আমরা list comprehension ব্যবহার করে কোন লিস্ট ক্রিয়েট করি সেটাও একটা iterable ।
code :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
my_list = [ x + x for x in range(3) ] | |
for item in my_list: | |
print (item) | |
Output: | |
0 | |
2 | |
4 |
Python এ যেসব জিনিস iterable যেমন: টাপল, লিস্ট, ফাইল, স্ট্রিং, .... ইত্যাদি কে আমরা for .... in ...: দিয়ে রিড করতে পারবো । ডাটা খুব সহজেই রিড করার জন্য এইটা খুব কাজে দেয় । কিন্তু এর একটা সমস্যা আছে । সেটা হল । এইটা সব সময় লিস্টের আইটেম গুলিকে মেমরি তে ষ্টোর করে রাখে । এখন আমাদের সবসময় মেমরি তে লিস্ট আইটেম গুলি সেভ করে নাও রাখা লাগতে পারে । তো এইটা আমরা কি ভাবে সমাধান করবো ?
Generators কি ?
Generators গুলো হল একধরনের iterators । কিন্তু আমরা কেবল একবারই generator এ iterate করতে পারি । এর কারণ হল generator সব ভেলু কে মেমরি তে ষ্টোর করে রাখে না ।
code :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
my_generator = ( x + x for x in range(3) ) | |
for item in my_generator: | |
print (item) | |
Output: | |
0 | |
2 | |
4 |
এটা ঠিক আগের মতই । এখানে শুধু [ ] এর পরিবর্তে ( ) ব্যবহার করা হয়েছে । কিন্তু এখানে কেবল একবারই আমরা for item in my_generator : ব্যবহার করতে পারবো । কারণ এইটা একটা generator এবং এইটা শুধু একবারই ব্যবহার করা যায় । এইটা কাজ করে এইভাবে প্রথমে শূন্য ( ০ ) ইনডেক্স এ যেটা আছে সেটা প্রসেস করে এবং সেটার ( ০ ) কথা ভুলে যায় । তারপর ১ এ যেটা আছে সেটা প্রসেস করে এবং সেটা ভুলে যায় । তারপর ২ এ যেটা আছে সটা প্রসেস করে এবং ২ এর কথা ভুলে যায় । এই ভাবে একটার পর একটা চলতে থাকে যতক্ষণ না সবগুলি রিড করা হয়ে যায় ।
Yield কি ?
Yield হল একটা keyword যেটা কিছুটা return এর মতো কাজ করে । কিন্তু return ও yield এর মধ্যে পার্থক্য হল কোন ফাংশন থেকে yield যেটা return করবে সেটা অবশ্যই একটা generator হবে । অর্থাৎ yield একটা generator রিটার্ন করে ।
code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def create_generator(): | |
my_list = range(3): | |
for item in my_list: | |
yield item + item # retun value | |
my_generator = create_generator() # call function | |
for item in my_generator: # iterate over my_generator | |
print (item) | |
Output: | |
0 | |
2 | |
4 |
উপরে যে উদাহরণ দেয়া হল সেটা খুব সাধারণ একটা উদাহরণ । এটা খুব কাজে দেয় যখন আমরা জানি যে আমরা যে ফাংশন ক্রিয়েট করেছি সেটা অনেক গুলো ভেলু রিটার্ন করে । এবং সেই ভালু গুলি আমাদের কেবল একবারই রিড করার প্রয়োজন হবে । এই ধরনের situation এটা ব্যবহার করে আমরা আমাদের মেমরি খরচ অনেক কমাতে পারি । কারণ ফাংশনের রিটার্ন করা এই বিশাল পরিমাণ ডাটা আমাদের কে মেমরি তে সেভ করে রাখতে হচ্ছে না :)
ধন্যবাদ :)
Comments
Post a Comment