Python for AI/Functions, Modules ও Packages/Lesson 18
Scope
কোন variable কোথা থেকে দেখা যায় — local, global, LEGB নিয়ম, global keyword কেন এড়িয়ে চলবে, আর closure দিয়ে মনে রাখা function।
- সময়
- 20 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
Scope মানে একটা variable কোথা থেকে "দেখা যায়"।
একটা বাড়ি কল্পনা করো। প্রতিটা ঘরের (function) ভেতরের জিনিস শুধু সেই ঘরেই ব্যবহার হয়। কিন্তু উঠানের (global) জিনিস সব ঘর থেকে দেখা যায়।
greet() function city দেখতে পায় (উঠানের জিনিস), কিন্তু বাইরে থেকে name দেখা যায় না:
কেন দরকার?
- বড় project-এ হাজার হাজার variable থাকে। Scope না থাকলে এক function-এর
iআরেক function-এরi-কে নষ্ট করে দিত। - ML code-এ সবচেয়ে কঠিন bug-গুলোর একটা: Jupyter notebook-এ global variable এদিক-ওদিক বদলে যাওয়া, আর বুঝতে না পারা কোন মান কোথা থেকে এল।
- Scope বুঝলে বোঝা যায় কেন ভালো function input নেয় আর output return করে — বাইরের জিনিস চুপচাপ বদলায় না।
Local আর Global
ভেতরে total = 10 লিখলে বাইরেরটা বদলায় না — নতুন একটা local total তৈরি হয়।
এখন সমস্যাটা দেখো:
UnboundLocalError! Python function-টা পড়েই দেখে ভেতরে count = ... আছে, তাই পুরো function-এ count হলো local। কিন্তু ডান পাশে count + 1 পড়ার সময় local count এখনো তৈরিই হয়নি।
global keyword — এবং কেন এড়িয়ে চলবে
কাজ করে, কিন্তু এটা খারাপ অভ্যাস। কেন? Function-টা এখন বাইরের জিনিস চুপচাপ বদলায় — function-এর নাম আর argument দেখে বোঝার উপায় নেই। Test করা কঠিন, bug খোঁজা কঠিন।
ভালো উপায় — মান পাঠাও, ফলাফল return করো:
এখন function-টা একটা pure function — একই input দিলে সবসময় একই output, বাইরের কিছু বদলায় না।
LEGB নিয়ম
একটা নাম দেখলে Python এই ক্রমে খোঁজে:
L Local -> এই function-এর ভেতরে
E Enclosing -> বাইরের function-এর ভেতরে (function-এর ভেতরে function হলে)
G Global -> এই file/module-এর একদম বাইরে
B Built-in -> Python-এর নিজের নাম: print, len, sum, list ...
প্রথম যেখানে পায়, সেটাই নেয়। এজন্যই built-in নামে variable বানালে সমস্যা:
তুমি Global-এ list বানিয়েছো, তাই Python আর Built-in list() পর্যন্ত পৌঁছায় না।
Closure: মনে রাখা function
Function-এর ভেতরে function বানালে, ভেতরের function বাইরের function-এর variable মনে রাখে — এমনকি বাইরের function শেষ হয়ে যাওয়ার পরেও:
double মনে রেখেছে n = 2, triple মনে রেখেছে n = 3। একে বলে closure।
ভেতর থেকে বাইরের function-এর variable বদলাতে চাইলে nonlocal লাগে — challenge-এ এটা কাজে লাগবে।
Exercise
Exercise
Bug ঠিক করো
নিচের code-এ UnboundLocalError আসছে। global keyword ব্যবহার না করে ঠিক করো: add_visit function-কে বর্তমান count নিতে আর নতুন count return করতে দাও, এবং বাইরে ফলাফলটা আবার visits-এ রাখো।
শেষে visits-এর মান হবে 3।
Quiz
Challenge
Challenge
Closure দিয়ে counter
make_counter(start=0) function লেখো যেটা একটা নতুন function return করে। Return করা function-টা প্রতিবার ডাকলে count ১ বাড়ায় এবং নতুন মান return করে।
প্রতিটা counter-এর নিজের আলাদা count থাকবে। Global variable ব্যবহার করা যাবে না।
বাস্তবে কোথায় ব্যবহার হয়?
Learning rate scheduler — training-এ learning rate ধীরে ধীরে কমানো হয়। Closure দিয়ে একটা scheduler বানানো যায় যেটা নিজের setting মনে রাখে:
PyTorch-এর torch.optim.lr_scheduler.LambdaLR ঠিক এরকম একটা function নেয়। আর পরে decorator শিখবে — সেগুলোও closure দিয়েই তৈরি।
Interview প্রশ্ন
- Beginner: Local আর global variable-এর পার্থক্য কী?
- Intermediate:
UnboundLocalErrorকেন হয়? উদাহরণ দিয়ে ব্যাখ্যা করো। - Advanced: Closure কী?
nonlocalআরglobal-এর পার্থক্য কী?
এরপর কী?
এতক্ষণ সব code এক জায়গায় লিখেছি। কিন্তু Python-এর আসল শক্তি হলো অন্যের লেখা code ব্যবহার করা — math, random, statistics... পরের lesson: Modules ও import।