কম্পিউটার টিউটোরিয়াল

পাইথনে 'yield' কিওয়ার্ড কী করে?


yield কিওয়ার্ড জেনারেটরে ব্যবহার হয়। এর বিহেভিয়র বুঝতে হলে প্রথমে দেখতে হবে ইটেরেবল কী। পাইথন অবজেক্ট লিস্ট, ফাইল, স্ট্রিং ইত্যাদি ইটেরেবল। যেকোনো অবজেক্ট যা for .. in সিনট্যাক্স ব্যবহার করে ট্রাভার্স করা যায় সেটি ইটেরেবল। ইটেরেটর অবজেক্টও একটি ইটেরেবল, কিন্তু এটিকে শুধু একবার ইটারেট করা যায়। ইটেরেটর অবজেক্ট যেকোনো ইটেরেবল থেকে iter() ফাংশন ব্যবহার করে পাওয়া যায় এবং এর next() মেথড থাকে যার মাধ্যমে ইটেরেশন করা হয়।

>>> L1 = [1,2,3,4]
>>> I1 = iter(L1)
>>> while True:
    try:
        print (next(I1))
    except StopIteration:
        sys.exit()

জেনারেটর একটি ফাংশনের মতো দেখાય, কিন্তু এটি yield কিওয়ার্ড ব্যবহার করে ইটেরেটরের সাকসেসিভ আইটেমগুলো ইয়েল্ড করে।

যখন একটি জেনারেটর ফাংশন কল করা হয়, এটি একটি ইটেরেটর অবজেক্ট রিটার্ন করে ফাংশন এক্সিকিউশন শুরু না করেই। যখন প্রথমবার next() মেথড কল করা হয়, ফাংশন এক্সিকিউশন শুরু হয় যতক্ষণ না yield স্টেটমেন্ট পায়, যা ইয়েল্ডেড ভ্যালু রিটার্ন করে। yield ট্র্যাক রাখে অর্থাৎ লাস্ট এক্সিকিউশন মনে রাখে এবং দ্বিতীয় next() কল প্রিভিয়াস ভ্যালু থেকে কন্টিনিউ করে।

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

import sys
def fibo(n):
    a,b=0,1
    while True:
        if a>n : return
        yield a
        a, b = b, a+b
f = fibo(20)
while True:
    try:
        print (next(f))
    except StopIteration:
        sys.exit()

  1. পাইথনে input() ফাংশন কী কাজ করে?

  2. পাইথনে raw_input() ফাংশন কী কাজ করে?

  3. পাইথনে <code>if __name__ == "__main__":</code> কী করে?

  4. পাইথনে <code>reload()</code> ফাংশন কী করে?