Skip to main content

পাইথনে Yield কিভাবে কাজ করে ?


Yield কি সেটা বোঝার জন্য Generator বোঝা লাগবে । আবার Generator কি সেটা বোঝার জন্য Iterables বুঝতে হবে । কি প্রথমেই মাথা ঘুরে গেল ? আচ্ছা মাথা ঘুরলে ঘুরতে দেন :D  আমরা শুরু করে দেই  ।

Iterables কি ?

আমরা যখন কোন লিস্ট ক্রিয়েট করি । আমরা লিস্টের আইটেম গুলি একটা একটা করে রিড করতে পারি । এটাকেই বলা হচ্ছে iteration

code:

এখানে my_list হল iterable . যখন আমরা list comprehension ব্যবহার করে কোন লিস্ট ক্রিয়েট করি সেটাও একটা iterable ।

code :

Python এ যেসব জিনিস iterable যেমন: টাপল, লিস্ট, ফাইল, স্ট্রিং, .... ইত্যাদি কে আমরা for .... in ...: দিয়ে রিড করতে পারবো । ডাটা খুব সহজেই রিড করার জন্য এইটা খুব কাজে দেয় । কিন্তু এর একটা সমস্যা আছে । সেটা হল । এইটা সব সময় লিস্টের আইটেম গুলিকে মেমরি তে ষ্টোর করে রাখে । এখন আমাদের সবসময় মেমরি তে লিস্ট আইটেম গুলি সেভ করে নাও রাখা লাগতে পারে । তো এইটা আমরা কি ভাবে সমাধান করবো ?

Generators কি ?

Generators গুলো হল  একধরনের iterators । কিন্তু আমরা কেবল একবারই generator এ iterate করতে পারি । এর কারণ হল generator সব ভেলু কে মেমরি তে ষ্টোর করে রাখে না ।

code :

এটা ঠিক আগের মতই । এখানে শুধু [ ] এর পরিবর্তে ( ) ব্যবহার করা হয়েছে ।  কিন্তু এখানে কেবল একবারই আমরা for item in my_generator : ব্যবহার করতে পারবো । কারণ এইটা একটা generator এবং এইটা শুধু একবারই ব্যবহার করা যায় । এইটা কাজ করে এইভাবে প্রথমে শূন্য ( ০ )  ইনডেক্স এ  যেটা আছে সেটা প্রসেস  করে এবং সেটার ( ০ )  কথা ভুলে যায় । তারপর ১ এ যেটা আছে সেটা প্রসেস করে এবং সেটা ভুলে যায় । তারপর ২ এ যেটা আছে সটা প্রসেস করে এবং ২ এর কথা ভুলে যায় । এই ভাবে একটার পর একটা চলতে থাকে যতক্ষণ না সবগুলি রিড করা হয়ে যায় ।

Yield কি ?

Yield হল একটা keyword যেটা কিছুটা return এর মতো কাজ করে । কিন্তু return ও yield এর মধ্যে পার্থক্য হল কোন ফাংশন থেকে yield যেটা return করবে সেটা অবশ্যই একটা generator হবে । অর্থাৎ yield একটা generator রিটার্ন করে ।

code:

উপরে যে উদাহরণ দেয়া হল সেটা  খুব সাধারণ একটা উদাহরণ । এটা খুব কাজে দেয় যখন আমরা জানি যে আমরা যে ফাংশন ক্রিয়েট করেছি সেটা অনেক গুলো ভেলু রিটার্ন করে । এবং সেই ভালু গুলি আমাদের কেবল একবারই রিড করার প্রয়োজন হবে । এই ধরনের situation এটা ব্যবহার করে আমরা আমাদের মেমরি খরচ অনেক কমাতে পারি ।  কারণ ফাংশনের রিটার্ন করা এই বিশাল পরিমাণ ডাটা আমাদের কে মেমরি তে সেভ করে রাখতে হচ্ছে না :) 

ধন্যবাদ :) 

Comments

Popular posts from this blog

উবুন্টুতে রুট পাসওয়ার্ড ভুলে তা রিকভার করার উপায় ।

যদি কেউ রুট পাসওয়ার্ড ভুলে যান তাহলে নিচের কাজ গুলো করে নতুন পাসওয়ার্ড সেট করতে পারবেন: প্রথমে পিসি রিস্টার্ট দিন । দিয়ে UP/DOWN করে kernel version সিলেক্ট করে e চাপুন । ব্ল্যাক Screen আসবে এবার একটা Space দিয়ে লিখুন “Single” [ Enter ] এরপর b চাপুন ফলাফল : লিনাক্সের Single user Mood এ চলে আসছেন । এখন লিখুন passwd root [ Enter ] এখন নতুন পাসওয়ার্ড খানা টাইপ করেন [ এন্টার ] আবার টাইপ করেন [ এন্টার ] কাজ শেষ , এবার reboot টাইপ করেন । এখন নতুন পাসওয়ার্ড দিয়ে লগইন করেন। পুনশ্চ : যদি আপনার উইন্ডোজ এর সাথে ডুয়েল বুট করা থাকে তবে এই প্রক্রিয়া কাজ করবে না ।

পাইথনে জেনারেটর ও তার খুঁটিনাটি বিষয়

এখানে আমরা দেখব যে পাইথনে জেনারেটর বিষয়টা কি । আমরা কিভাবে জেনারেটর বানাতে পারি । জেনারেটর এক্সপ্রেশন কি ? আমাদের কেন ও কি অবস্থায় জেনারেটর ব্যবহার করা দরকার । তো শুরু করা যাক । জেনারেটর কি ? পাইথনে iterator তৈরি করার সবচেয়ে সহজ উপয় হল জেনারেটর । সাধারণ ভাবে বলতে গেলে জেনারেটর একটা ফাংশন যেটা একটা iterator অবজেক্ট রিটার্ন করে । যেটাকে পরে আমরা iterate করতে পারি । এবং যেটা কেবল মাত্র একবারই iterate করা যাবে । এখন প্রশ্ন হল এই জেনারেটর কিভাবে বানানো যায় ? জেনারেটর বানানো খুব সহজ । আমরা সাধারণ ফাংশন যেভাবে লিখি ঠিক সেভাবেই আমরা জেনারেটর বানাতে পারি । কিন্তু এখানে return স্টেটমেন্টের পরিবর্তে yield স্টেটমেন্ট থাকবে । যদি কোন একটা ফাংশনে অন্তত একটা yield স্টেটমেন্ট থাকে তবে সেটা কে আমরা জেনারেটর বলতে পারি । তবে একটা জেনারেটরে একাধিক yield স্টেটমেন্ট থাকতে পারে । yield এবং return দুইটাই ফাংশন থেকে কোন ভেলু রিটার্ন করে কিন্তু দুইটার মধ্যে পার্থক্য হল return স্টেটমেন্ট একটা ফাংশন কে পুরাপুরি terminate করে ফেলে । কিন্তু yield ফাংশন কে terminate না করে ফাংশনকে pauses করে রাখ...