- উইন্ডোজে পাইথন সঠিকভাবে কনফিগার করলে পাথ, অ্যালিয়াস এবং ভার্সন সংক্রান্ত সমস্যা এড়ানো যায়।
- ইন্টারেক্টিভ ইন্টারপ্রেটার এবং .py ফাইলগুলো কোড পরীক্ষা করা ও প্রকৃত প্রোগ্রাম তৈরি করা সহজ করে তোলে।
- পাইথনের সিনট্যাক্স, ডাইনামিক টাইপিং এবং বাধ্যতামূলক ইনডেন্টেশন কোডকে পাঠযোগ্য করে তোলে।
- অন্তর্নির্মিত সাহায্য এবং অনলাইন রিসোর্স আপনাকে স্বাধীনভাবে পাইথন শেখা চালিয়ে যেতে সাহায্য করে।

আপনি যদি উইন্ডোজে পাইথন শিখতে চেষ্টা করেন এবং কোথা থেকে শুরু করবেন তা না জানেন , তবে আপনি একা নন। যেকোনো প্রোগ্রামিং ভাষা শেখার সবচেয়ে জটিল অংশটি সাধারণত কোডটি নিজে নয়, বরং এর ইনস্টলেশন, টুলস এবং প্রাথমিক পরীক্ষাগুলো বুঝে ওঠা। সিস্টেম পাথ, এক্সিকিউশন অ্যালিয়াস এবং পাইথনের বিভিন্ন সংস্করণের কারণে, আপনার প্রথম `print()` লেখার আগেই হতাশ হয়ে পড়াটা খুবই স্বাভাবিক।
এই নিবন্ধটি উইন্ডোজে একদম শুরু থেকে পাইথন শেখার জন্য একটি বিশদ, ব্যবহারিক এবং সূক্ষ্ম নির্দেশিকা প্রদান করে: কীভাবে এটি সঠিকভাবে ইনস্টল করতে হয়, কীভাবে সাধারণ পাথ সমস্যা এড়ানো যায়, ইন্টারপ্রেটার কী, কীভাবে প্রোগ্রাম লিখতে ও চালাতে হয়, কীভাবে আপনার কোডকে মডিউলে সাজাতে হয় এবং সহায়ক রিসোর্সের সাহায্যে কীভাবে শেখা চালিয়ে যেতে হয় । কোনো গুরুত্বপূর্ণ ধারণা বাদ না দিয়ে সবকিছু পরিষ্কার এবং সহজবোধ্য ভাষায় ব্যাখ্যা করা হয়েছে।
পাইথন দিয়ে কাজ শুরু করা এত কঠিন কেন (বিশেষ করে উইন্ডোজে)?
অনেকেই একমত যে পাইথন শেখার প্রথম প্রধান বাধা সিনট্যাক্স বা প্রোগ্রামিং ধারণা নয়, বরং আরও মৌলিক কিছু: কোথায় ক্লিক করতে হবে এবং কী ইনস্টল করতে হবে তা জানা। আপনার মতো ব্যবহারকারীরাও প্রায় একই ধরনের অভিজ্ঞতার কথা বলেন: তাঁরা পাইথনের পুরোনো সংস্করণ ব্যবহার করার জন্য একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি করার চেষ্টা করেন, উইন্ডোজ সেটিংসে হাত দেন, একটি টিউটোরিয়াল দেখে পাইথন আনইনস্টল করেন, এবং হঠাৎ করেই সিস্টেমটি কোনো পাইথন কমান্ড চিনতে পারে না।
সবচেয়ে বিভ্রান্তিকর দিকগুলোর মধ্যে একটি হলো পাথ (path) এবং এনভায়রনমেন্ট ভেরিয়েবল (environment variables) -এর বিষয়টি । কেন আপনাকে "Add Python to PATH" বক্সটি চেক করতে হবে? উইন্ডোজ যে কমান্ডটি খুঁজে পাচ্ছে না, এর মানে কী? "Manage application execution aliases"-এর আসল উদ্দেশ্যটা কী? যিনি কেবল কয়েকটি ডেটা অ্যানালাইসিস স্ক্রিপ্ট চালাতে চান , তার কাছে এটি সম্পূর্ণ অপ্রয়োজনীয় এবং এমনকি অযৌক্তিকও মনে হতে পারে।
তবে, এই প্রাথমিক ছোটখাটো জটিলতাগুলোর একটি ব্যাখ্যা আছে: যেকোনো কমান্ড প্রম্পট থেকে পাইথন ইন্টারপ্রেটারটি চালানোর জন্য উইন্ডোজকে জানতে হয় যে এটি কোথায় ইনস্টল করা আছে। যদি সেই পাথটি PATH এনভায়রনমেন্ট ভেরিয়েবলে না থাকে, তাহলে আপনি "python is not recognized as an internal or external command" এর মতো এরর দেখতে পাবেন। এবং এর সাথে যদি প্রচলিত ইনস্টলেশনের সাথে মাইক্রোসফট স্টোরের অ্যালিয়াসগুলোও যুক্ত থাকে, তাহলে পরিস্থিতি আরও কিছুটা জটিল হয়ে ওঠে।
সুখবরটি হলো, একবার এই প্রাথমিক ইনস্টলেশন এবং কনফিগারেশন পর্বটি পার করতে পারলে, পাইথন খুবই ব্যবহার-বান্ধব এবং নমনীয় । একারণেই অনেক কোম্পানি (গুগল সহ) এটিকে একটি প্রাথমিক প্রোগ্রামিং ভাষা হিসেবে ব্যবহার করে, এবং নতুনদের জন্য নির্দিষ্ট কোর্সও রয়েছে যা আপনাকে 'আমার কোনো ধারণাই নেই' অবস্থা থেকে ধাপে ধাপে কার্যকরী এবং পাঠযোগ্য প্রোগ্রাম লেখা পর্যন্ত নিয়ে যায়।
ঝামেলা ছাড়াই উইন্ডোজে পাইথন ইনস্টল করার উপায়
উইন্ডোজে সঠিকভাবে পাইথন শেখার জন্য, সবচেয়ে ভালো উপায় হলো অফিসিয়াল ওয়েবসাইট বা কোনো নির্ভরযোগ্য উৎস থেকে পাইথন ৩-এর সাম্প্রতিক সংস্করণ ইনস্টল করা এবং আগে থেকে থাকা যেকোনো পুরোনো বা মিশ্র ইনস্টলেশন এড়িয়ে চলা। এতে অনেক সাধারণ দ্বন্দ্ব কমে যায়।
আপনি যখন উইন্ডোজে পাইথন ইনস্টলারটি চালান, তখন একটি গুরুত্বপূর্ণ চেকবক্স দেখতে পাবেন: "Add Python to PATH"। এই বক্সটি চেক করার জন্য বিশেষভাবে সুপারিশ করা হয়, কারণ এটি স্বয়ংক্রিয়ভাবে ইন্টারপ্রেটারটির পাথ আপনার সিস্টেমের এনভায়রনমেন্ট ভেরিয়েবলে যুক্ত করে দেয়। এর মানে হলো, আপনি যখন কোনো কমান্ড প্রম্পট (CMD বা PowerShell) খুলবেন, তখন ইনস্টলেশন ফোল্ডারটি মনে না রেখেই কেবল `python` বা `python3` টাইপ করতে পারবেন।
বিভ্রান্তির আরেকটি কারণ হলো উইন্ডোজের "Manage application execution aliases" অপশনটি । এই ফিচারটি আপনাকে মাইক্রোসফ্ট স্টোর থেকে ইনস্টল করা অ্যাপ্লিকেশনগুলির সাথে নির্দিষ্ট কিছু কমান্ড (যেমন python.exe) যুক্ত করার সুযোগ দেয়। আপনি যখন স্টোর থেকে পাইথন ব্যবহার করেন এবং একই সাথে python.org থেকে অন্য কোনো সংস্করণ ইনস্টল করেন, তখন উইন্ডোজ অপ্রত্যাশিতভাবে দুটির মধ্যে যেকোনো একটি চালু করে দিতে পারে। এই সমস্যা এড়ানোর জন্য, একটিমাত্র ও ভালোভাবে কনফিগার করা মূল পাইথন ৩ ইনস্টলেশন ব্যবহার করা এবং পাথের মধ্যে সংঘাত এড়াতে এই অ্যালিয়াসগুলো পর্যালোচনা করাই শ্রেয়।
কোনো টিউটোরিয়াল অনুসরণ করার সময় যদি আপনি পাইথন আনইনস্টল করেন এবং এরপর সিস্টেমটি কমান্ডটি চিনতে না পারে, তবে ঘাবড়াবেন না: সাধারণত, শুধু পাইথন ৩ পুনরায় ইনস্টল করে আপনার PATH এনভায়রনমেন্ট ভেরিয়েবলের বক্সটিতে আবার টিক চিহ্ন দিলেই সমস্যাটি সমাধান হয়ে যাবে। এরপর থেকে, আপনি স্বাভাবিকভাবে ভার্চুয়াল এনভায়রনমেন্ট তৈরি করতে, লাইব্রেরি ইনস্টল করতে এবং আপনার স্ক্রিপ্ট চালাতে সক্ষম হবেন।
পাইথন ইন্টারপ্রেটার আসলে কী এবং এটি কীভাবে ব্যবহার করতে হয়।
পাইথন কীভাবে কাজ করে তা ভালোভাবে বোঝার অন্যতম সেরা উপায় হলো ইন্টারেক্টিভ ইন্টারপ্রেটার চালু করে সরাসরি এতে কোড লেখা। ইন্টারপ্রেটার হলো এমন একটি প্রোগ্রাম যা আপনার নির্দেশাবলী লাইন বাই লাইন পড়ে, তাৎক্ষণিকভাবে তা কার্যকর করে এবং ফলাফল প্রদর্শন করে। উইন্ডোজে, এটি সাধারণত পাওয়ারশেল বা সিএমডি খুলে টাইপ করে করা হয়:
পাইথন অথবা পাইথন ৩
সবকিছু ঠিকঠাক থাকলে, আপনি পাইথন ভার্সনসহ একটি হেডারের মতো কিছু দেখতে পাবেন, যার পরে >>>- এর মতো একটি আমন্ত্রণ চিহ্ন থাকবে। এটি নির্দেশ করে যে আপনি ইন্টারপ্রেটারের ভিতরে আছেন এবং খুব সাধারণ কিছু কাজ করা শুরু করতে পারেন : যেমন মান নির্ধারণ করা, যোগ করা, স্ট্রিং নিয়ে কাজ করা, ইত্যাদি।
উদাহরণস্বরূপ, আপনি a = 6 এরকম কিছু লিখতে পারেন এবং তারপর, পরের লাইনে, শুধু a . বসাতে পারেন। ইন্টারপ্রেটার সেই ভেরিয়েবলে সংরক্ষিত মানটি প্রিন্ট করবে, এই ক্ষেত্রে 6। আপনি কোনো সমস্যা ছাড়াই সেই ভেরিয়েবলটি পুনরায় সংজ্ঞায়িত করতে পারেন, যেমন a = 'hello' করে, এবং তারপর স্ট্রিংটিতে কতগুলি অক্ষর আছে তা দেখতে len(a)- এর মতো ফাংশন ব্যবহার করতে পারেন।
এই কাজের পদ্ধতিটি পরীক্ষা-নিরীক্ষা করার জন্য এবং "একটি লিস্টে একটি সংখ্যা যোগ করলে কী হবে?" বা "একটি স্ট্রিং-এর সাথে একটি ইন্টিজার যুক্ত করলে কী হবে?"-এর মতো দ্রুত প্রশ্নের উত্তর খোঁজার জন্য উপযুক্ত । আপনি যদি 'hello' + 3-এর মতো অর্থহীন কিছু চেষ্টা করেন, তাহলে ইন্টারপ্রেটার আপনাকে একটি এরর দেখাবে এবং ব্যাখ্যা করবে কী ভুল হয়েছে (উদাহরণস্বরূপ, একটি TypeError যা নির্দেশ করে যে আপনি str-এর সাথে int যুক্ত করতে পারবেন না)। আর যদি আপনি নাম দেওয়ার ক্ষেত্রে ভুল করেন এবং এমন একটি ভ্যারিয়েবল লেখেন যা আপনি কখনও সংজ্ঞায়িত করেননি, তাহলে আপনি একটি NameError পাবেন যা আপনাকে সতর্ক করবে যে আইডেন্টিফায়ারটি সংজ্ঞায়িত নয়।
উইন্ডোজে ইন্টারপ্রেটার থেকে বের হতে চাইলে, আপনি CTRL+Z চেপে Enter চাপতে পারেন , অথবা exit() বা quit() টাইপ করতে পারেন। এটি আপনাকে উইন্ডোজ কমান্ড লাইনে ফিরিয়ে নিয়ে যাবে এবং .py ফাইলে সংরক্ষিত স্ক্রিপ্ট চালানোর মতো অন্যান্য কাজ চালিয়ে যাওয়ার সুযোগ দেবে।
আপনার প্রথম প্রোগ্রাম লেখা: .py ফাইল তৈরি করা এবং উইন্ডোজে তা চালানো।
ইন্টারপ্রেটারে পরীক্ষা-নিরীক্ষা করার পাশাপাশি, শীঘ্রই বা দেরিতে আপনি আপনার পাইথন কোড ফাইলগুলিতে সংরক্ষণ করতে চাইবেন , যাতে সেটিকে পুনরায় ব্যবহার, শেয়ার বা বিভিন্ন আর্গুমেন্ট দিয়ে চালানো যায়। পাইথন প্রোগ্রামগুলি সাধারণত .py এক্সটেনশনযুক্ত ফাইলে সংরক্ষণ করা হয় এবং এগুলি মডিউল নামে পরিচিত। উদাহরণস্বরূপ, আপনি যেকোনো ভালো টেক্সট এডিটর (ভিএস কোড, নোটপ্যাড++, ইত্যাদি) দিয়ে hello.py নামের একটি ফাইল তৈরি করতে পারেন।
ওই ফাইলের মধ্যে আপনি একটি ছোট প্রোগ্রাম লিখতে পারেন, যা কমান্ড লাইন থেকে একটি আর্গুমেন্ট গ্রহণ করে এবং সেটি ব্যবহার করে, উদাহরণস্বরূপ:
আমদানি sys
ডিএফ প্রধান ():
print('হ্যালো,', sys.argv)
যদি __ নাম__ == '__ মেইন__':
প্রধান ()
এই পদ্ধতিতে, sys.argv অ্যাক্সেস করার জন্য আপনাকে sys মডিউলটি ইম্পোর্ট করতে হয় , যা হলো কনসোল থেকে প্রোগ্রামে পাঠানো আর্গুমেন্টগুলোর একটি তালিকা। এর প্রথম উপাদানটি (ইনডেক্স ০) হলো স্ক্রিপ্টের নাম, এবং ইনডেক্স ১ থেকে আপনার নির্দিষ্ট করা মানগুলো প্রদর্শিত হয়। main() ফাংশনটি একটি শুভেচ্ছাবার্তার পর আপনার পাঠানো আর্গুমেন্টটি প্রিন্ট করে।
উইন্ডোজে এই ফাইলটি রান করার জন্য, একটি টার্মিনাল খুলুন, `cd` কমান্ড ব্যবহার করে hello.py ফাইলটি যে ফোল্ডারে সেভ করেছেন সেখানে যান এবং `python hello.py Ana`-এর মতো কিছু টাইপ করুন । সবকিছু সঠিকভাবে কনফিগার করা থাকলে, আপনি স্ক্রিনে "Hello, Ana" মেসেজটি দেখতে পাবেন। এই সহজ উদাহরণটি আপনাকে ইতিমধ্যেই বুঝতে সাহায্য করবে যে পাইথন কীভাবে একটি .py ফাইলকে শুরু থেকে শেষ পর্যন্ত ব্যাখ্যা করে , কীভাবে মডিউল ইম্পোর্ট করতে হয় এবং বহুল ব্যবহৃত `if __name__ == '__main__'` প্যাটার্ন ব্যবহার করে কীভাবে মূল লজিকটি এক্সিকিউট করতে হয়।
ভাষা হিসেবে পাইথন: ডাইনামিক, ইন্টারপ্রেটেড এবং ফ্লেক্সিবল
পাইথন একটি ডাইনামিক, ইন্টারপ্রেটেড এবং অত্যন্ত নমনীয় ভাষা । এর মানে হলো, জাভা বা সি++ এর মতো এখানে ভেরিয়েবলের টাইপ কঠোরভাবে ঘোষণা করতে হয় না: কোনো ভেরিয়েবল সংজ্ঞায়িত করার সময় সেটি int, string, বা bool হবে কিনা তা নির্দিষ্ট করে বলার প্রয়োজন নেই; আপনি কেবল একটি মান অ্যাসাইন করেন, এবং রানটাইমে ইন্টারপ্রেটারই টাইপটি সামলে নেয়।
এই নমনীয়তার কারণে কোড সংক্ষিপ্ত হয় এবং অনেক ক্ষেত্রে তা পড়া ও লেখা সহজ হয়ে যায় । আপনি একই ভেরিয়েবল ‘a’ ব্যবহার করে প্রথমে একটি সংখ্যা এবং তারপর একটি স্ট্রিং সংরক্ষণ করতে পারেন, এবং যতক্ষণ পর্যন্ত আপনার করা অপারেশনগুলো যৌক্তিক থাকে, পাইথন তাতে কোনো আপত্তি করবে না। তবে, এর ফলে কম্পাইল-টাইম টাইপ চেকিং হয় না, তাই কিছু ত্রুটি কেবল তখনই ধরা পড়ে যখন কোড এক্সিকিউশনের মাধ্যমে সেই নির্দিষ্ট লাইনে পৌঁছায়।
উদাহরণস্বরূপ, যদি আপনার একটি `main()` ফাংশন থাকে যা কোনো কোনো ক্ষেত্রে ভুল বানানে অন্য একটি ফাংশনকে কল করে (যেমন `repeat`-এর পরিবর্তে `repeeeet`), তাহলে পাইথন রানটাইমে সেই লাইনে না পৌঁছানো পর্যন্ত এবং ভুল নামটি কল করার চেষ্টা না করা পর্যন্ত ত্রুটিটি শনাক্ত করে না। কোডের ঐ অংশটি এক্সিকিউট না হওয়া পর্যন্ত প্রোগ্রামটিকে পুরোপুরি ঠিকঠাক কাজ করছে বলে মনে হতে পারে। একই কথা এমন একটি ভেরিয়েবলের ক্ষেত্রেও প্রযোজ্য যা কখনও ইনিশিয়ালাইজ করা হয়নি: শুধুমাত্র যখন এর মান পড়ার চেষ্টা করা হয়, তখনই ইন্টারপ্রেটার একটি `NameError` থ্রো করে।
পাইথন ৩-এ "টাইপ হিন্টস" যোগ করা হয়েছিল , যা আপনাকে ফাংশনের আর্গুমেন্ট এবং রিটার্ন ভ্যালুগুলোকে প্রত্যাশিত টাইপ দিয়ে চিহ্নিত করার সুযোগ দেয়, যেমন, `def is_positive(n: int) -> bool:`। এই অ্যানোটেশনগুলো সম্পূর্ণ ঐচ্ছিক, কিন্তু এগুলো VS Code-এর মতো উন্নত এডিটর বা স্ট্যাটিক অ্যানালাইসিস টুলগুলোকে আপনার কলগুলো পরীক্ষা করতে এবং নির্দেশিত টাইপের সাথে কিছু না মিললে আপনাকে সতর্ক করতে সাহায্য করে।
যদিও এই নিবন্ধে টাইপ সাজেশন নিয়ে গভীরভাবে আলোচনা করা হয়নি, তবুও এটা জেনে রাখা ভালো যে এগুলোর অস্তিত্ব আছে এবং আরও বেশি সংখ্যক আধুনিক পাইথন প্রজেক্ট এগুলো গ্রহণ করছে। আপনি যদি বড় পরিসরে শক্তিশালী কোড তৈরি করতে চান, তবে এগুলো একটি অত্যন্ত দরকারি টুল, বিশেষ করে সেইসব টিমের জন্য যেখানে একাধিক ব্যক্তি একই মডিউলে কাজ করেন।
পাইথনে ফাংশন: ডকস্ট্রিং, অপারেটর এবং সর্বোত্তম অনুশীলন
পাইথনে, `def` কীওয়ার্ড ব্যবহার করে ফাংশন সংজ্ঞায়িত করা হয় । এর পরে ফাংশনের নাম, বন্ধনীতে প্যারামিটারগুলো এবং একটি কোলন (:) দিতে হয়। ফাংশন বডির ভেতরে স্পেস দিয়ে ইন্ডেন্ট করা হয়। একটি সাধারণ উদাহরণ হলো এমন একটি ফাংশন যা একটি স্ট্রিংকে বেশ কয়েকবার পুনরাবৃত্তি করে এবং ঐচ্ছিকভাবে বিস্ময়সূচক চিহ্ন (exclamation marks) যোগ করে।
ধারণাগতভাবে, এই ধরনের কিছু একটা `repeat(text, exclamation)` ফাংশন হতে পারে, যা `text` আর্গুমেন্টটিকে একাধিকবার জুড়ে দিয়ে একটি ফলাফল তৈরি করে। এর ভেতরে, আপনি স্ট্রিং যুক্ত করার জন্য `+` অপারেটর অথবা সেগুলোকে একটি নির্দিষ্ট সংখ্যক বার পুনরাবৃত্তি করার জন্য `*` অপারেটর ব্যবহার করতে পারেন। উদাহরণস্বরূপ, `'hello' * 3` করলে `hellohellohello'` তৈরি হয়, আর `'-' * 10` করলে এক ধরনের হাইফেন তৈরি হয়: `'———-'`।
পারফরম্যান্সের দিক থেকে প্রায়শই বলা হয় যে, স্ট্রিং পুনরাবৃত্তি করার জন্য + অপারেটর ব্যবহার করে একাধিকবার সংযুক্ত করার চেয়ে * অপারেটর ব্যবহার করা বেশি কার্যকর হতে পারে, কারণ এক্ষেত্রে ফলাফলের আকার ক্রমান্বয়ে না বেড়ে কেবল একবারই গণনা করা হয়। ছোট, শেখার প্রোগ্রামগুলোতে আপনি হয়তো এটি তেমন খেয়ালই করবেন না, কিন্তু বিষয়টি জেনে রাখা ভালো, কারণ এটি ল্যাঙ্গুয়েজটির ডিজাইনেরই একটি অংশ।
আরেকটি আকর্ষণীয় বৈশিষ্ট্য হলো ডকস্ট্রিং (docstrings) , যা হলো ডকুমেন্টেশন স্ট্রিং এবং একটি ফাংশন ডেফিনিশনের একেবারে শুরুতে রাখা যায়। একাধিক প্যারাগ্রাফ লেখার সুবিধার জন্য এগুলো সাধারণত ট্রিপল কোট ("" ... "") দিয়ে লেখা হয় এবং এগুলো ব্যাখ্যা করে যে ফাংশনটি কী কাজ করে, কী কী আর্গুমেন্ট গ্রহণ করে এবং কী রিটার্ন করে। পরবর্তীতে যখন আপনি আপনার ফাংশনের ডকুমেন্টেশন দেখতে চাইবেন, তখন `help()` এই বর্ণনাগুলোই প্রদর্শন করবে।
একটি ফাংশনের মধ্যে আপনি যে ভেরিয়েবলগুলো ডিক্লেয়ার করেন, সেগুলো সেই ফাংশনেরই লোকাল হয়; অর্থাৎ, সেগুলো এর বাইরে বা অন্য কোনো ফাংশনে থাকা একই নামের ভেরিয়েবলকে প্রভাবিত করে না। কলারকে আপনি যে ভ্যালুটি রিটার্ন করতে চান, তা `return` স্টেটমেন্টের মাধ্যমে নির্দিষ্ট করা হয়, যার পরে রিটার্ন করার ডেটা দেওয়া যেতে পারে। আপনি যদি `return` ব্যবহার না করেন বা কোনো ভ্যালু ছাড়া ফাংশনটি কল করেন, তাহলে এটি `None` রিটার্ন করে।
একটি খুব প্রচলিত রীতি হলো কয়েকটি সহায়ক ফাংশন সংজ্ঞায়িত করা এবং ফাইলের প্রায় শেষের দিকে একটি main() ফাংশন তৈরি করা , যা অন্য ফাংশনগুলোর ব্যবহার নিয়ন্ত্রণ করে। তারপর, একদম শেষে, আপনি সাধারণ if __name__ == '__main__': main() ব্লকটি রাখেন, যার কাজ হলো শুধুমাত্র ফাইলটি সরাসরি এক্সিকিউট করার সময় ওই main ফাংশনটিকে কল করা, এবং অন্য কোথাও থেকে মডিউল হিসেবে ইম্পোর্ট করা হলে তা না করা।
পাইথনে ইন্ডেন্টেশনের গুরুত্ব (এবং কেন ট্যাব পরিহার করা উচিত)
অন্যান্য ভাষা থেকে আসা শিক্ষার্থীদের জন্য সবচেয়ে আশ্চর্যজনক বৈশিষ্ট্যগুলোর মধ্যে একটি হলো, পাইথনে ইন্ডেন্টেশন আলংকারিক নয়; এটি সিনট্যাক্সেরই একটি অংশ । কোডের ব্লকগুলোকে আলাদা করতে কার্লি ব্রেস {} ব্যবহার করা হয় না; এর পরিবর্তে, ইন্ডেন্টেশন লেভেল ব্যবহৃত হয়: একই ব্লকের (যেমন ফাংশন, if স্টেটমেন্ট, লুপ ইত্যাদি) অন্তর্ভুক্ত সমস্ত লাইনের ইন্ডেন্টেশন হুবহু একই হতে হবে।
যদি কোনো ব্লকের মধ্যে একটি লাইনে ভিন্ন সংখ্যক স্পেস থাকে , তাহলে ইন্টারপ্রেটার এটিকে একটি সিনট্যাক্স ত্রুটি হিসেবে গণ্য করবে। এই কারণেই আপনার এডিটরকে ট্যাবের পরিবর্তে স্পেস ব্যবহার করার জন্য কনফিগার করা অত্যন্ত গুরুত্বপূর্ণ। বিভিন্ন এডিটর বা সিস্টেমে ট্যাব ভিন্ন ভিন্ন প্রস্থে ব্যাখ্যা করা হতে পারে, যার ফলে দৃশ্যগত অসঙ্গতি এবং এমন সব ত্রুটি দেখা দেয় যা খুঁজে বের করা খুব কঠিন হয়ে পড়ে।
অফিসিয়াল পাইথন স্টাইল গাইড (PEP 8) অনুযায়ী, প্রতিটি ইনডেন্টেশন লেভেলে চারটি স্পেস ব্যবহার করা উচিত । গুগলের মতো কিছু সংস্থা তাদের অভ্যন্তরীণ নির্দেশিকায় নির্দিষ্ট ক্ষেত্রে দুটি স্পেস ব্যবহার করে, কিন্তু আপনি যদি সবে শুরু করে থাকেন, তবে আপনার চারটি স্পেস ব্যবহার করাই উচিত, যা সবচেয়ে প্রচলিত মান।
প্রথমদিকে হোয়াইটস্পেসের গুরুত্ব অদ্ভুত মনে হলেও, সময়ের সাথে সাথে আপনি এর গুরুত্ব বুঝতে পারবেন: এটি কোডকে সঠিকভাবে অ্যালাইন করতে বাধ্য করে, পাঠযোগ্যতা বাড়ায় এবং এলোমেলো কার্লি ব্র্যাকেটে ভরা ব্লক তৈরি হওয়া প্রতিরোধ করে। আপনি যদি উইন্ডোজে কোনো ভালো এডিটর (যেমন ভিজ্যুয়াল স্টুডিও কোড) দিয়ে কাজ করেন, তবে এ নিয়ে আর চিন্তা না করার জন্য কেবল 'ট্যাব চাপলে স্পেস যোগ করুন' (insert spaces on Tab) অপশনটি কনফিগার করুন এবং সম্ভব হলে অটোমেটিক ফরম্যাটিং অ্যাডজাস্টমেন্ট চালু করে দিন।
সংক্ষেপে, শুরু থেকেই ইন্ডেন্টেশনের দিকে মনোযোগ দিলে আপনি অনেক ছোটখাটো ভুল এবং দুর্বোধ্য সিনট্যাক্স বার্তা থেকে রক্ষা পাবেন । যদি কখনো IndentationError দেখেন, তাহলে বুঝবেন আপনার লাইনের শুরুতে থাকা স্পেসগুলো পরীক্ষা করার সময় হয়েছে।
ভেরিয়েবলের নাম, নেমস্পেস এবং মডিউল
পাইথনে ভেরিয়েবলের টাইপ ঘোষণা করতে হয় না, তাই আপনি যে নামগুলো বেছে নেন, সেগুলোই আপনার জন্য সেরা ডকুমেন্টেশন । একটি ছোট উদাহরণে সবকিছুর জন্য `a`, `b`, এবং `c` ব্যবহার করা ঠিক আছে, কিন্তু আপনার কোড যত বড় হতে থাকে, `name`, `names`, `list_of_tuples`, `counter` ইত্যাদির মতো নাম ব্যবহার করা অনেক বেশি সহায়ক হয়। এটি আপনাকে মনে রাখতে সাহায্য করে যে প্রতিটি ভেরিয়েবলে আপনি কী ধরনের ডেটা আশা করছেন এবং সাধারণ ভুলের সংখ্যাও কমিয়ে দেয়।
পাইথনে ভেরিয়েবল এবং ফাংশনের জন্য সবচেয়ে প্রচলিত নিয়ম হলো আন্ডারস্কোরসহ ছোট হাতের অক্ষর ব্যবহার করা (যাকে স্নেক কেস বলা হয়)। কিছু প্রোগ্রামিং ভাষা ক্যামেলকেস পছন্দ করে, এবং যদি আপনি এমন কোনো বিদ্যমান কোডের সাথে ইন্টিগ্রেট করেন যা এই স্টাইল ব্যবহার করে, তবে তা অনুকরণ করা যুক্তিযুক্ত হতে পারে। কিন্তু আপনি যদি একদম নতুন করে শুরু করেন, তবে পঠনযোগ্যতা বাড়ানোর জন্য পাইথন কমিউনিটি সাধারণত আন্ডারস্কোর ব্যবহারের পরামর্শ দেয়।
আপনার ভাষার নিজস্ব কীওয়ার্ড (if, while, for, class, ইত্যাদি) ভেরিয়েবল হিসেবে ব্যবহার করা এড়িয়ে চলা উচিত, কারণ ইন্টারপ্রেটার এটিকে সিনট্যাক্স ত্রুটি হিসেবে চিহ্নিত করবে। তবে, print, list, বা str-এর মতো বিল্ট-ইন ফাংশনের নাম পুনরায় ব্যবহার না করার পরামর্শ দেওয়া হয়, কারণ এতে আপনি আপনার স্কোপের মধ্যে সেগুলোকে ওভাররাইট করে ফেলবেন এবং এর ফলে অপ্রত্যাশিত আচরণ হতে পারে। উদাহরণস্বরূপ, যদি আপনি list নামে একটি ভেরিয়েবল সংজ্ঞায়িত করেন, তাহলে প্রথমে আপনার ভেরিয়েবলটি ডিলিট বা রিনেম না করে আপনি বিল্ট-ইন ফাংশন list() ব্যবহার করতে পারবেন না।
কোড বিন্যাসের ক্ষেত্রে, প্রতিটি .py ফাইল তার নিজস্ব নেমস্পেস সহ একটি মডিউল হিসেবে কাজ করে । এর মানে হলো, যদি আপনার utilities.py নামের একটি ফাইলে process() ফাংশন থাকে, তবে এর সম্পূর্ণ নামটি হবে utilities.process। এটি বিভিন্ন মডিউলে সংজ্ঞায়িত অন্যান্য process ফাংশনের সাথে দ্বন্দ্ব এড়িয়ে চলে: প্রতিটি ফাইল তার নিজস্ব আইডেন্টিফায়ারের জগৎ বজায় রাখে।
যখন আপনি `import sys` ব্যবহার করে `sys`-এর মতো একটি স্ট্যান্ডার্ড মডিউল ইম্পোর্ট করেন , তখন এর সমস্ত ফাংশন এবং ভেরিয়েবল সেই প্রিফিক্সের অধীনে উপলব্ধ হয়ে যায়: `sys.argv`, `sys.exit()`, ইত্যাদি। `from sys import argv, exit` এই ফর্মটিও রয়েছে, যা আপনাকে প্রিফিক্স ছাড়াই সরাসরি `argv` এবং `exit()` ব্যবহার করতে দেয়, কিন্তু সম্পূর্ণ নামসহ সংস্করণটিই সাধারণত বেশি সুপারিশ করা হয়, কারণ এটি আপনাকে প্রতিটি সিম্বল কোথা থেকে এসেছে তা বুঝতে সাহায্য করে এবং একই সাথে একাধিক মডিউল ব্যবহার করার সময় বিভ্রান্তি এড়াতে সহায়তা করে।
পাইথনের একটি বেশ বিস্তৃত স্ট্যান্ডার্ড লাইব্রেরি রয়েছে যা ইন্টারপ্রেটারের সাথেই ইনস্টল হয়ে যায়। এর সবচেয়ে বেশি ব্যবহৃত মডিউলগুলোর মধ্যে কয়েকটি হলো sys (সিস্টেম ইউটিলিটি এবং কমান্ড-লাইন আর্গুমেন্ট), re (রেগুলার এক্সপ্রেশন), os (ফাইল সিস্টেম অ্যাক্সেস এবং অপারেটিং সিস্টেম ফাংশন) এবং আরও অনেক কিছু। এই সম্পূর্ণ লাইব্রেরিটি অফিসিয়াল ওয়েবসাইট docs.python.org-এ পুঙ্খানুপুঙ্খভাবে নথিভুক্ত করা আছে।
রানটাইম ত্রুটি এবং তা থেকে শিক্ষা গ্রহণ
পাইথনের ডাইনামিক প্রকৃতির কারণে, প্রতিটি লাইন এক্সিকিউট না হওয়া পর্যন্ত অনেক চেক স্থগিত রাখা হয়। এর মানে হলো, আপনি কিছু এরর শুধুমাত্র রানটাইমেই দেখতে পাবেন : যেমন নামের ভুল বানান, ইনিশিয়ালাইজ না করা ভ্যারিয়েবল, বেমানান টাইপ ইত্যাদি। প্রথমদিকে এটি হতাশাজনক মনে হতে পারে, কিন্তু খুব শীঘ্রই আপনি এরর মেসেজগুলো পড়তে ও বুঝতে অভ্যস্ত হয়ে যাবেন।
এর একটি সাধারণ উদাহরণ হলো এমন একটি ফাংশন, যা একটি if স্টেটমেন্টের নির্দিষ্ট শাখার মধ্যে এমন একটি ফাংশনের নাম কল করে যার কোনো অস্তিত্ব নেই। যতক্ষণ পর্যন্ত সেই শাখাটি এক্সিকিউট না হয়, পাইথন কোনো অভিযোগ করবে না। যেই মুহূর্তে ত্রুটিপূর্ণ লাইনটিতে পৌঁছানো যাবে, এটি একটি NameError থ্রো করবে এবং সতর্ক করবে যে আইডেন্টিফায়ারটি অনির্ধারিত। প্রায় একই রকম কিছু ঘটে যদি আপনি এমন একটি ভেরিয়েবল তুলনা করেন যা কখনও ইনিশিয়ালাইজ করা হয়নি: ল্যাঙ্গুয়েজটি সেই এক্সপ্রেশনটি ইভ্যালুয়েট করার চেষ্টা করার সাথে সাথেই সমস্যাটি শনাক্ত করে ফেলবে।
আপনি যদি আরও কঠোর প্রোগ্রামিং ভাষা থেকে আসেন, তাহলে কম্পাইলারের দেওয়া আগাম সতর্কবার্তাগুলো আপনার চোখে নাও পড়তে পারে। পাইথন একটি ভিন্ন পন্থা অবলম্বন করে: কোড লেখার ক্ষেত্রে অধিক স্বাধীনতা এবং কম্পাইলেশনের ক্ষেত্রে কম কঠোরতা । এর বিনিময়ে, প্রোগ্রামারকে সেই নমনীয়তাকে সমর্থন করার জন্য টেস্ট, ভালো টুলস এবং, যদি চান, ত্রুটি কমাতে টাইপ অ্যানোটেশন ব্যবহার করতে হয়।
এর ইতিবাচক দিকটি হলো, ঠিক এই নমনীয়তার কারণেই, ভুল করতে করতে শেখার জন্য পাইথন খুবই উপযোগী । এর ইন্টারেক্টিভ ইন্টারপ্রেটার, ছোট স্ক্রিপ্ট এবং স্পষ্ট এরর মেসেজ আপনাকে দ্রুত আপনার কোড সংশোধন করতে সাহায্য করে। ধীরে ধীরে, পরবর্তী জটিল অংশে যাওয়ার আগে প্রোগ্রামের প্রতিটি অংশ ঠিকমতো কাজ করছে কিনা তা নিশ্চিত করার জন্য ছোট ছোট অংশ চালিয়ে দেখার অভ্যাস আপনার মধ্যে গড়ে উঠবে।
উইন্ডোজে একটি ভালো কৌশল হলো টার্মিনাল খুলে আপনার স্ক্রিপ্টগুলো চালানো এবং কোনো সমস্যা হলে পাইথন ট্রেসটি মনোযোগ দিয়ে পড়া। বেশিরভাগ ক্ষেত্রে, এই মেসেজটি শুধু ভুলের ধরনই নয়, বরং এটি ঠিক কোন লাইন এবং ফাইলে ঘটেছে তাও নির্দেশ করে, যা দ্রুত সমস্যাটি নির্ণয় ও সমাধান করার জন্য খুবই সহায়ক ।
উইন্ডোজে পাইথন আরও শেখার জন্য অন্তর্নির্মিত সাহায্য এবং রিসোর্স।
আনুষ্ঠানিক ডকুমেন্টেশন এবং কাঠামোগত কোর্স ছাড়াও, পাইথন সরাসরি ইন্টারপ্রেটারের মধ্যেই সাহায্যকারী টুল অন্তর্ভুক্ত করে । নতুনদের জন্য সবচেয়ে মূল্যবান দুটি টুল হলো `help()` এবং `dir()`। এই দুটি টুলই আপনাকে পাইথন পরিবেশ থেকে বের না হয়েই প্রতিটি ফাংশন, মডিউল বা মেথডের কাজ সম্পর্কে জানতে সাহায্য করে।
উদাহরণস্বরূপ, যদি আপনি জানতে চান যে বিল্ট-ইন ফাংশন `len()` কীভাবে কাজ করে, তাহলে আপনি ইন্টারপ্রেটারে `help(len)` টাইপ করতে পারেন । অথবা, যদি আপনি `import sys` দিয়ে `sys` মডিউলটি ইম্পোর্ট করে থাকেন, তাহলে আপনি সেই মডিউলের ডকুমেন্টেশন পড়ার জন্য `help(sys)` কল করতে পারেন, এবং এর সমস্ত উপলব্ধ অ্যাট্রিবিউটের (ভেরিয়েবল, ফাংশন, ইত্যাদি) তালিকা দেখার জন্য `dir(sys)` কল করতে পারেন।
নির্দিষ্ট অবজেক্টের মেথড সম্পর্কেও সাহায্য পাওয়া সম্ভব। উদাহরণস্বরূপ, 'text'.split আপনাকে একটি স্ট্রিং-এর split মেথড অ্যাক্সেস করতে দেয়, এবং আপনি যদি `help('text'.split)` করেন , তাহলে একটি সেপারেটরের উপর ভিত্তি করে কীভাবে স্ট্রিংগুলোকে লিস্টে ভাগ করতে হয় তার একটি বিবরণ দেখতে পাবেন। একইভাবে, `help(str.split)` আপনাকে একই তথ্য দেখাবে, কারণ এটি `str` ক্লাসে সংজ্ঞায়িত একই মেথড।
একইভাবে, পাইথনে লিস্ট কীভাবে কাজ করে তা জানতে, এর কী কী মেথড (append, extend, sort, ইত্যাদি) আছে তা দেখতে, এবং তারপর উদাহরণস্বরূপ `help(list.append)` ব্যবহার করে সেগুলোর প্রত্যেকটি সম্পর্কে আরও গভীরভাবে জানতে আপনি `help( list) ` এবং `dir(list)` ব্যবহার করতে পারেন। শুধুমাত্র বাইরের ম্যানুয়ালের উপর নির্ভর না করে, হাতে-কলমে শেখার এটি একটি চমৎকার উপায়।
ইন্টারপ্রেটার ছাড়াও আপনার জন্য অনেক উন্নতমানের রিসোর্স রয়েছে: docs.python.org-এ অফিসিয়াল ডকুমেন্টেশন, Microsoft Learn, Coursera বা Udacity-র মতো প্ল্যাটফর্মের কোর্সসমূহ , এবং ইন্টারেক্টিভ টিউটোরিয়াল যা আপনাকে একটি এমবেডেড ইন্টারপ্রেটারের সাহায্যে আপনার ব্রাউজার থেকেই প্রোগ্রাম করতে দেয়। উদাহরণস্বরূপ, গুগল তাদের নিজস্ব উপকরণের উপর ভিত্তি করে একটি প্রাথমিক কোর্স অফার করে, যা পাইথন ৩-এর মৌলিক বিষয় থেকে শুরু করে আরও উন্নত বিষয় পর্যন্ত আলোচনা করে।
আপনি যদি ভিডিও ছাড়া শিখতে চান এবং নিজের গতিতে শিখতে আগ্রহী হন, তবে এমন অনলাইন টিউটোরিয়াল রয়েছে যেখানে একই পরিবেশে তত্ত্ব এবং ব্যবহারিক অনুশীলন একত্রিত করা হয়েছে । এছাড়াও, উইন্ডোজে কাজ করার সময় কোনো নির্দিষ্ট বিষয়ে আটকে গেলে স্ট্যাক ওভারফ্লো-এর মতো কমিউনিটি, বিশেষায়িত মেইলিং লিস্ট এবং লার্নিং ফোরাম আপনাকে সহায়তা করতে পারে।
এই সম্পূর্ণ ইকোসিস্টেমটির অর্থ হলো, একবার আপনি উইন্ডোজে প্রাথমিক ইনস্টলেশন এবং কনফিগারেশন সম্পন্ন করে ফেললে, একজন পাইথন প্রোগ্রামার বা ডেটা অ্যানালিস্ট হিসেবে আপনার অগ্রগতি সম্পদের অভাবের চেয়ে অধ্যবসায়ের উপরই বেশি নির্ভরশীল। উদাহরণস্বরূপ, যদি আপনার লক্ষ্য ডেটা নিয়ে কাজ করা হয়, তবে আপনি নির্দিষ্ট গাইডের সাহায্যে ডেটাবেস সম্পর্কে আরও গভীরভাবে জানতে পারবেন ।
ইন্টারপ্রেটার, .py স্ক্রিপ্ট, আর্গুমেন্ট হ্যান্ডলিং, ইনডেন্টেশন এবং ফাংশনগুলোর সাথে পরিচিত হয়ে গেলে আপনি দেখবেন যে, উইন্ডোজে পাইথন শেখাটা আর কোনো প্রযুক্তিগত বাধার পথ থাকে না, বরং এটি একটি বেশ মসৃণ প্রক্রিয়ায় পরিণত হয়, যেখানে প্রতিটি ছোট অগ্রগতির সাথে সাথে আপনার আত্মবিশ্বাস বাড়ে এবং আপনি আরও জটিল সমস্যা মোকাবেলা করতে উৎসাহিত হন।