পাইথনে ক্লোজার

ক্লোজার (closure) বলতে বোঝায় একটি ফাংশনকে তার সাথে সংযুক্ত সমস্ত বাহ্যিক ভেরিয়েবল যা এটির জন্য অ্যাক্সেসযোগ্য।

পাইথনে, বেশিরভাগ ক্ষেত্রে, "ফাংশনের ক্লোজার" বলতে সেই ফাংশনটিকেই বোঝায় না, বরং precisely এর বাহ্যিক ভেরিয়েবলগুলিকেই বোঝায়।

ধরুন আমাদের কাছে নিম্নলিখিত outer ফাংশনটি আছে, যেখানে i ভেরিয়েবলটি ডিক্লেয়ার করা হয়েছে এবং একটি অভ্যন্তরীণ ফাংশন inner। এতে i-এ এক যোগ করা হবে। ভেরিয়েবলটি i সঠিকভাবে কাজ করার জন্য, আমরা এতে nonlocal ইনস্ট্রাকশন যোগ করি:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

এখন আসুন বাহ্যিক ফাংশনটি res ভেরিয়েবলে রাখি এবং এটিকে বন্ধনী সহ কল করি:

pythonres = outer()
res() # 1 প্রিন্ট করবে

আসুন কয়েকবার res কল করি। কোড এক্সিকিউট হওয়ার পরে প্রতিবার কাউন্টার i এক করে বাড়বে:

pythonres() # 2 প্রিন্ট করবে
res() # 3 প্রিন্ট করবে
res() # 4 প্রিন্ট করবে

যাইহোক, এখানে একটি গুরুত্বপূর্ণ সূক্ষ্মতা আছে - প্রতিটি outer ফাংশন কল তার নিজস্ব কাউন্টার বাড়াবে। আসুন প্রথম outer কলটি res1 ভেরিয়েবলে রাখি, এবং দ্বিতীয় কলটি - res2 ভেরিয়েবলে। তারপর সিরিয়ালে সেগুলো কনসোলে প্রিন্ট করি:

pythonres1 = outer()
res1() # 1 প্রিন্ট করবে
res1() # 2 প্রিন্ট করবে
res1() # 3 প্রিন্ট করবে

res2 = outer()
res2() # 1 প্রিন্ট করবে
res2() # 2 প্রিন্ট করবে
res2() # 3 প্রিন্ট করবে
Задание 1

নিম্নলিখিত কোডটি দেওয়া হয়েছে:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

বলুন, কনসোলে কী প্রিন্ট হবে।

Задание 2

এমন একটি ফাংশন তৈরি করুন, যার প্রতিটি কল পরবর্তী ফিবোনাচি সংখ্যা দেবে।

Задание 3

এমন একটি ফাংশন তৈরি করুন, যা একটি রেঞ্জের মধ্যে একটি র্যান্ডম পূর্ণসংখ্যা দেবে, কিন্তু যাতে পরপর দুইবার একই সংখ্যা না আসে।