Modules in Python

Modules

এতদিনে আপনি আপনার পাইথন প্রোগ্রামিং শেখার যাত্রায় অনেকটা এগিয়ে গিয়েছেন। বলতে গেলে আপনি পাইথন প্রোগ্রামিং ভাষার মৌলিক সকল বিষয় জেনে গিয়েছেন। তবে একটা শেষ ধাপ বাকি রয়েছে, সেটি হলো মডিউল। মডিউল বোঝার পর আপনি আপনার প্রোগ্রামিং শেখার যাত্রায় পরবর্তী ধাপে ধাপগুলোতে যেতে পারবেন। তাহলে চলুন শুরু করা যাক।

মডিউল কি ?

আমাদের চিরন্তর নিয়মানুসারে এবারো একটি গল্প দিয়ে শুরু করি :

বিকালবেলা মনোরম শুভ্র পরিবেশে নদীর ধরে কচি ঘাসের উপর শুয়ে নিশ্চিন্তে আকাশের সাদা মেঘগুলি ভাসে যেতে দেখছিল আমাদের বাপ্পি দাদু। ঈদের ছুটি প্রায় শেষের দিকে, কলেজ খোলার পর, কি কি করবে ? সেই সমস্ত বিষয়ের একটা খসড়া প্ল্যান করছিল সে। হঠাৎ, তার মনে পড়লো ছুটিতে দেওয়া হোমওয়ার্ক গুলো ছুঁয়েও দেখেনি সে। এখন কি করবে ? এতো কম সময়ে কিভাবে সে এই বিশাল সমস্যার সমাধান করবে ?

বাপ্পি দাদু কিছুক্ষন মনমরা হয়ে বসে থাকলো। পরক্ষণেই তার মুখে হাসি ফুটলো। সে তার ফোন হাতে নিলো এবং ততক্ষনাৎ ফোন করলো তার প্রিয় বান্ধবী মাইশাকে , এবং মাইশার কাছ থেকে তার হোমওয়ার্কের নোট খাতাগুলো চেয়ে নিলো। যাতে সে সেটি কপি করে খুব সহজে ও দ্রুত হোমওয়ার্ক শেষ করতে পারে। একেবারে শুরু থেকে প্রত্যেক সমস্যার সমাধান করার চেয়ে আগে থেকে বানিয়ে রাখা টেমপ্লেট দিয়ে সমাধান করা সহজ না।

মডিউলের কনসেপটিও আপনাকে বাপ্পি দাদুর মতো হতে বলে। Life is all about reusability, see?

এই হোমেওয়ার্কের মতো প্রোগ্রামিংয়েও আপনি যে প্রোগ্রামটি ডেভেলপ করতে চাইছেন, সেটি হয়তো অন্য কেউ ইতিমধ্যে তৈরী করে ফেলেছে। ব্যাস, আপনার কাজ কমে গেল। আপনি চাইলেই অন্য কারো লেখা কোড / প্রোগ্রামগুলো আপনার প্রজেক্টের মধ্যে ব্যবহার করতে পারেন, আগে থেকে তৈরী করে রাখা এই প্রোগ্রাম গুলোকেই বলা হয় মডিউল (Modules) ।

সহজভাবে বললে, মডিউল হলো আগে থেকে তৈরী করে রাখা একটি  ফাইল যার মধ্যে আগেই কিছু কোড লিখা(pre-written code) থাকে। যেটা globally available এবং  আপনি আপনার প্রয়োজন অনুসারে আপনার প্রোগ্রামে ব্যবহার করতে পারেন। মডিউল আপনাকে বড়ো একটি প্রোগ্রামকে ছোট ছোট খন্ডে ভাগ করতে সাহাজ্য
করবে।

যেকোনো পাইথন সোর্স ফাইলের মধ্যে জাস্ট একটি import স্টেটমেন্ট(statement) ব্যবহার করে, অন্য একটি সোর্স ফাইলেকে মডিউল হিসেবে ব্যবহার করা যায়।

import স্টেটমেন্ট শুধু মাত্র ওই মডিউলের সকল functionality কে আমাদের প্রজেক্টে যুক্ত করে এবং আমাদেরকে ওই মডিউলে থাকা যেকোনো ফাংশন, ভ্যারিয়েবল বা ক্লাস গুলোকে ব্যবহার করতে দেয়।

How to use a module?

১. import স্টেটমেন্ট ব্যবহার করে

এই পদ্ধতিতে পুরো মডিউলটিকে আপনার প্রোগ্রামে নিয়ে আসা হয়। মডিউলের ভেতরে থাকা কোনো ফাংশন বা ভ্যারিয়েবল ব্যবহার করতে চাইলে প্রথমে মডিউলের নাম, তারপর একটি ডট (.) এবং সবশেষে ফাংশনের নাম লিখতে হয়।
সিনট্যাক্স:

import module_name

উদাহরণ:

import math

# math মডিউলের sqrt (square root বা বর্গমূল) ফাংশন ব্যবহার
print(math.sqrt(16))  # আউটপুট: 4.0

# math মডিউলের pi এর মান প্রিন্ট করা
print(math.pi)        # আউটপুট: 3.141592653589793

২. as ব্যবহার করে বা অ্যালিয়াসিং

যদি মডিউলের নাম অনেক বড় হয় বা কোড লেখার সুবিধার্থে আপনি মডিউলটির একটি ছোট নাম দিতে চান, তবে as কিওয়ার্ড ব্যবহার করা হয়। একে উপনাম বা অ্যালিয়াস (Alias) বলা হয়। এর ফলে মডিউলের আসল নামের পরিবর্তে আপনার দেওয়া ছোট নামটি দিয়ে কাজ করা যায়।
সিনট্যাক্স:

import module_name as short_name

উদাহরণ:

import math as m

# এখন 'math' এর বদলে শুধু 'm' ব্যবহার করলেই হবে
print(m.sqrt(25))  # আউটপুট: 5.0
print(m.pi)        # আউটপুট: 3.141592653589793

৩. from... import ব্যবহার করে

যদি আপনার পুরো মডিউলটির প্রয়োজন না থাকে, বরং মডিউল থেকে নির্দিষ্ট কোনো ফাংশন বা ভ্যারিয়েবল ব্যবহার করতে চান, তবে এই পদ্ধতিটি সবচেয়ে কার্যকর। এই পদ্ধতির বড় সুবিধা হলো, কোড লেখার সময় বারবার মডিউলের নাম বা ডট (.) দিতে হয় না, সরাসরি ফাংশনের নাম লিখলেই কাজ করে।
সিনট্যাক্স:

from module_name import function_name

উদাহরণ:

# math মডিউল থেকে শুধুমাত্র sqrt এবং pi-কে ইমপোর্ট করা হলো
from math import sqrt, pi

# এখন সরাসরি 'math.' ছাড়াই এগুলো ব্যবহার করা যাবে
print(sqrt(9))  # আউটপুট: 3.0
print(pi)       # আউটপুট: 3.141592653589793

এক নজরে তিনটি পদ্ধতি:

পদ্ধতিসিনট্যাক্স (Syntax)ব্যবহারের নিয়ম (Usage)
১. importimport mathmath.sqrt(16)
২. as (Alias)import math as mm.sqrt(16)
৩. from... importfrom math import sqrtsqrt(16)
  • মডিউলের প্রকারভেদ: পাইথনে মূলত তিন ধরনের মডিউল থাকে:
    • Built-in modules: পাইথনের সাথে আগে থেকেই বিল্ট-ইন বা অন্তর্ভুক্ত থাকে।
    • Third-party modules: এগুলো বাইরের বা অন্যান্য ডেভেলপারদের তৈরি করা মডিউল।
    • Custom modules: ব্যবহারকারী নিজে নিজের প্রয়োজন অনুযায়ী এই মডিউলগুলো তৈরি করেন।

Built-in Modules

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

একইভাবে, বিল্ট ইন মডিউল হলো পাইথনের মধ্যে আগে থেকেই থাকা কিছু মডিউল। যেগুলো কে আলাদা করে ইন্সটল করতে হয় না। বিল্ট ইন মডিউল গুলো তাই সরাসরি import করে ব্যবহার করা যায়।

বিল্ট-ইন (Built-in) মডিউলগুলো C প্রোগ্রামিং ভাষায় লেখা এবং Python Interpreter (Shell)-এর সঙ্গে একীভূত (integrated) থাকে। প্রতিটি বিল্ট-ইন মডিউলে নির্দিষ্ট কিছু সিস্টেম-নির্ভর (system-specific) কাজের জন্য প্রয়োজনীয় ফাংশন ও রিসোর্স থাকে।
Python-এ উপলব্ধ সব বিল্ট-ইন মডিউলের তালিকা দেখতে Python Console-এ নিচের কমান্ডটি ব্যবহার করতে পারেন:

help('modules')

Working with Built in Modules

Math

গণিত এবং বিভিন্ন গণনা করা প্রোগ্রামিং এবং আমাদের দৈনন্দিন জীবনের একটি অবিচ্ছেদ্য অংশ। আমরা যেমন জানি, বিভিন্ন গণনা করার জন্য আমরা পাইথন (Python) দ্বারা দেওয়া বিভিন্ন অপারেটর ব্যবহার করতে পারি। কিন্তু, এমন পরিস্থিতিও আসে যখন এটিই যথেষ্ট নয়!নীচের উদাহরণটি বিবেচনা করুন,ধরে নিন আপনার একটি নির্দিষ্ট সংখ্যার ফ্যাক্টোরিয়াল (Factorial) গণনা করা প্রয়োজন (ফ্যাক্টোরিয়াল হলো একটি নির্দিষ্ট ধনাত্মক পূর্ণসংখ্যার সমান বা তার চেয়ে ছোট সমস্ত ধনাত্মক পূর্ণসংখ্যার গুণফল)। উদাহরণস্বরূপ, ৫ (5) এর ফ্যাক্টোরিয়াল হবে 5*4*3*2*1 যার ফলাফল হবে 120।

এই সমস্যা সমাধানের জন্য নিজে থেকে কোড লেখা খুব একটা কঠিন নয়, কিন্তু এটা অবশ্যই সময় সাপেক্ষ বিষয়। এখানেই আপনার কাজে লাগবে Math Module.

Math মডিউল হলো পাইথনের একটি বিল্ট-ইন মডিউল যেটি দ্বারা mathematical functions গুলোর অ্যাক্সেস নেওয়া যায়। যেহেতু এটি একটি বিল্ট-ইন মডিউল তাই এটি সরাসরি import করা যায়, এই স্টেটমেন্টটি ব্যবহার করে:

import math

নিচে ম্যাথ (math) মডিউলের কিছু সাধারণ এবং সাধারণত ব্যবহৃত ফাংশন দেওয়া হলো,

  • floor(value) - এটি প্রদত্ত মানের চেয়ে ছোট অথবা সমান সবচেয়ে বড় পূর্ণসংখ্যাটি রিটার্ন করে।
  • ceil(value) - এটি প্রদত্ত মানের চেয়ে বড় অথবা সমান সবচেয়ে ছোট পূর্ণসংখ্যাটি রিটার্ন করে।
  • factorial(value) - এটি প্রদত্ত মানের ফ্যাক্টোরিয়াল রিটার্ন করে।
  • fabs(value) - এটি প্রদত্ত মানের পরম মান (absolute value) রিটার্ন করে।
  • sqrt(value) - এটি প্রদত্ত মানের বর্গমূল (square root) রিটার্ন করে।

চলুন এবার সামনে এগিয়ে যাই এবং এই ফাংশনগুলো প্রয়োগ করার চেষ্টা করি।

import math 

number1 = 4
number2 = 2.5
print(math.sqrt(number1))
print(math.floor(number2))
print(math.ceil(number2))
print(math.factorial(number1))
print(math.fabs(number2))

চলুন math মডিউল দ্বারা প্রদান করা আরও কিছু ফাংশন দেখে নেওয়া যাক, যার মধ্যে কিছু ত্রিকোণমিতি এবং লগারিদম সম্পর্কিত ফাংশনও রয়েছে:

  • log2(value) - এটি প্রদত্ত ভ্যালুর বেস ২ (base 2) এর লগ রিটার্ন করে।
  • log10(value) - এটি প্রদত্ত ভ্যালুর বেস ১০ (base 10) এর লগ রিটার্ন করে।
  • pow(num1, num2) - এটি num1 এর পাওয়ার num2 রিটার্ন করে।
  • sin(value) - এটি রেডিয়ানে (radians) প্রদত্ত ভ্যালুর সাইন (sine) রিটার্ন করে।
  • cos(value) - এটি রেডিয়ানে প্রদত্ত ভ্যালুর কোসাইন (cosine) রিটার্ন করে।
  • tan(value) - এটি রেডিয়ানে প্রদত্ত ভ্যালুর ট্যানজেন্ট (tangent) রিটার্ন করে।

এখন চলুন সামনে এগিয়ে যাওয়া যাক এবং এর মধ্যে কয়েকটি ফাংশন ইমপ্লিমেন্ট করার চেষ্টা করি।

import math 

number1 = 4
number2 = 2
print(math.log10(number1))
print(math.sin(number1))
print(math.pow(number1, number2))

Random

পাইথনে আমরা এ পর্যন্ত দেখেছি যে সাধারণ অপারেটর এবং math মডিউল ব্যবহার করে সংখ্যার ওপর বিভিন্ন ধরনের গাণিতিক কাজ বা অপারেশন করা যায়। তা সত্ত্বেও, এমন কিছু পরিস্থিতি তৈরি হয় যখন আমাদের অ্যাপ্লিকেশনে কোনো নির্দিষ্ট নিয়ম ছাড়া হঠাৎ করে বা এলোমেলো কিছু সংখ্যা তৈরি করার প্রয়োজন পড়ে— যেমন ওটিপি (OTP) বা ট্রানজেকশন আইডি (Transaction ID) এবং আরও অনেক কিছু।
তাই যেকোনো অ্যাপ্লিকেশনের জন্যই সংখ্যা একটি অবিচ্ছেদ্য অংশ, এবং পাইথনে এই কাজগুলো করার জন্য বিভিন্ন মডিউল দেওয়া আছে। তেমনই একটি মডিউল হলো পাইথনের random মডিউল.

র‍্যান্ডম মডিউল (Random Module)

random মডিউল হলো পাইথনের একটি বিল্ট-ইন (আগে থেকেই তৈরি করে রাখা) মডিউল, যা pseudo-random (ছদ্ম-এলোমেলো বা আপাত-অনির্ধারিত) ভেরিয়েবল তৈরি করতে ব্যবহার করা হয়। এলোমেলোভাবে বা হঠাৎ কোনো কাজ করার জন্য এটি ব্যবহার করা যেতে পারে; যেমন— কোনো র‍্যান্ডম বা এলোমেলো সংখ্যা নেওয়া, একটি লিস্ট (list) থেকে যেকোনো উপাদান বেছে নেওয়া, লিস্টের উপাদানগুলোকে ওলটপালট (shuffle) করা ইত্যাদি।
তাই সহজ কথায় বলতে গেলে, র‍্যান্ডম মডিউল হলো এমন কিছু ফাংশনের সমষ্টি, যা এলোমেলো সংখ্যা তৈরি করতে বা সেগুলোকে আমাদের প্রয়োজনমতো নিয়ন্ত্রণ করতে ব্যবহার করা হয়। যেহেতু এটি একটি বিল্ট-ইন মডিউল, তাই আমরা নিচের স্টেটমেন্টটি ব্যবহার করে সরাসরি এটিকে ইম্পোর্ট (import) করে কাজ শুরু করতে পারি:

import random

চলো random মডিউলের সাধারণত ব্যবহৃত কয়েকটি মেথড বা ফাংশন দেখে নেওয়া যাক:

১) random()

এটি 0.0 থেকে 1.0-এর মধ্যে যেকোনো একটি এলোমেলো বা র‍্যান্ডম দশমিক সংখ্যা (float number) আউটপুট হিসেবে দেয়।

মনে রেখো: যতবারই তুমি এই কোডটি রান (execute) করবে, প্রতিবারই একটি ভিন্ন ভিন্ন র‍্যান্ডম সংখ্যা পাওয়ার সম্ভাবনা থাকে।

২) randint(x, y)

এটি তোমার বলে দেওয়া নির্দিষ্ট সীমার (x এবং y) মধ্যে থেকে যেকোনো একটি র‍্যান্ডম পূর্ণসংখ্যা (integer) আউটপুট দেয়। এখানে x এবং y দুটো সংখ্যাই অন্তর্ভুক্ত থাকে।

৩) randrange(start, stop, step)

এটি start, stop, এবং step আর্গুমেন্টগুলোর মাধ্যমে তৈরি করা একটি নির্দিষ্ট রেঞ্জ বা সীমা থেকে এলোমেলোভাবে একটি সংখ্যা বেছে নেয়।

  • এখানে ডিফল্ট বা স্বয়ংক্রিয়ভাবে start-এর মান থাকে 0।
  • একইভাবে, ডিফল্টভাবে step-এর মান থাকে 1।
# উদাহরণ ১ (Example 1)
import random
print(random.random())
# এটি ০.০ থেকে ১.০ এর মধ্যে একটি দশমিক সংখ্যা প্রিন্ট করবে।

# উদাহরণ ২ (Example 2)
import random
print(random.randint(1, 6))
# এটি ১ থেকে ৬ এর মধ্যে যেকোনো একটি পূর্ণসংখ্যা (যেমন: লুডুর ছক্কার মতো ১, ২, ৩, ৪, ৫ বা ৬) প্রিন্ট করবে।

# উদাহরণ ৩ (Example 3)
import random
print(random.randrange(1, 6, 2))
# এটি ১ থেকে শুরু করে ৬ এর আগ পর্যন্ত ২ ঘর পর পর লাফিয়ে (যেমন: ১, ৩, ৫) যেকোনো একটি বিজোড় সংখ্যা প্রিন্ট করবে।

র‍্যান্ডম উপাদান বা এলিমেন্ট (Random Elements)

এবার চলো এমন কিছু মেথড বা ফাংশন দেখে নেওয়া যাক, যা কোনো একটি কালেকশন বা ডাটার গ্রুপ (যেমন: একটি লিস্ট) থেকে এলোমেলোভাবে ডাটা তৈরি করতে বা বেছে নিতে সাহায্য করে:

১) choice(sequence)

এটি কোনো একটি খালি নয় এমন সিকোয়েন্স বা লিস্ট থেকে এলোমেলোভাবে যেকোনো একটি উপাদান (element) বেছে নিয়ে তা আউটপুট হিসেবে দেখায়।

২) shuffle(sequence)

এটি কোনো একটি সিকোয়েন্স বা লিস্টের ভেতরে থাকা উপাদানগুলোর ক্রম বা সিরিয়ালকে সম্পূর্ণ এলোমেলোভাবে ওলটপালট (reorder) করে দেয়।

নিচে এর একটি উদাহরণ দেওয়া হলো:

import random

# এখানে ১ থেকে ৬ পর্যন্ত সংখ্যার একটি লিস্ট তৈরি করা হয়েছে
numbers = [1, 2, 3, 4, 5, 6]

# ১) choice ব্যবহার: এটি এই লিস্ট থেকে যেকোনো একটি সংখ্যা (যেমন: ৪) বেছে নিয়ে প্রিন্ট করবে
print(random.choice(numbers))

# ২) shuffle ব্যবহার: এটি মূল লিস্টের ভেতরের সংখ্যাগুলোকে ওলটপালট করে দেবে
random.shuffle(numbers)

# ওলটপালট করার পর পুরো লিস্টটি কেমন দেখাবে তা প্রিন্ট করা হচ্ছে
print(numbers) 
# আউটপুটটি হতে পারে এমন: [৩, ১, ৫, ২, ৬, ৪] (প্রতিবার রান করলে এটি আলাদা হতে পারে)

OS

একটি অপারেটিং সিস্টেম হচ্ছে কম্পিউটার ইউজার এবং কম্পিউটার হার্ডওয়ার এর মধ্যে থাকা একটি ইন্টারফেস। অপারেটিং সিস্টেম হচ্ছে এমন একটি সফটওয়্যার যেটি সকল ধরনের বেসিক টাস্ক গুলো সম্পাদন করে, যেমন: ফাইল ম্যানেজমেন্ট, মেমোরি ম্যানেজমেন্ট, প্রসেস ম্যানেজমেন্ট, ইনপুট ও আউটপুট হ্যান্ডেলিং, peripheral device (যেমন প্রিন্টার, ডিস্ক ড্রাইভ) কন্ট্রোল ইত্যাদি।

প্রোগ্রামিং ভাষার অন্যতম একটি প্রধান কাজ হলো কম্পিউটারের সাথে OS Level এ যোগাযোগ করা। এটা আরো বেশি কন্ট্রোল, অ্যাক্সেস এবং ফাংশনালিটিকে উন্মুক্ত করে দেয়।

OS Module

পাইথনের যদিও সরাসরি অপারেটিং সিস্টেম লেভেলের ফাংশনালিটির উপর অ্যাক্সেস নেই, তবে বিকল্প হিসেবে রয়েছে OS module.

এই OS মডিউল দ্বারা আমরা ইউজার এবং অপারেটিং সিস্টেমের মধ্যে যোগাযোগ সাধন করতে পারি। যেহেতু এটি একটি বিল্ট-ইন মডিউল, তাই নিচের স্টেটমেন্টের মাধ্যমে আমরা এটি কে সরাসরি import করতে পারি :

import os

ওএস মডিউলের কাজ

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

১) os.name -

এটি পাইথন যে অপারেটিং সিস্টেম মডিউলটি ইম্পোর্ট করেছে, তার নাম রিটার্ন বা আউটপুট করে।

মনে রেখো: এটি কিন্তু কোনো ফাংশন নয় (তাই এর শেষে ব্র্যাকেট () থাকে না), এটি হলো os মডিউলের ভেতরে থাকা একটি ভেরিয়েবল বা অ্যাট্রিবিউট। যেমন: উইন্ডোজ কম্পিউটারে এটি সাধারণত 'nt' আউটপুট দেয়।

২) os.getcwd() -

এটি তোমার বর্তমানে চলমান ফাইলটি কম্পিউটারের কোন ডিরেক্টরি বা ফোল্ডারে আছে (Current Working Directory - CWD), সেই পুরো লোকেশন বা পাথ (path)টি আউটপুট হিসেবে দেখায়।

মনে রেখো: কম্পিউটার এবং ফোল্ডারের নামভেদে এই আউটপুটটি একেক সিস্টেমে একেক রকম হতে পারে।
# উদাহরণ ১ (Example 1)
import os
print(os.name)
# এটি তোমার অপারেটিং সিস্টেমের সংক্ষিপ্ত নাম (যেমন: 'nt' বা 'posix') প্রিন্ট করবে।

# উদাহরণ ২ (Example 2)
import os
print(os.getcwd())
# এটি বর্তমানে তুমি যে ফোল্ডারে কাজ করছ, তার সম্পূর্ণ ঠিকানা (যেমন: C:\Users\Name\Documents) প্রিন্ট করবে।

৩) os.mkdir() -

এই ফাংশনটি কম্পিউটারে একটি নতুন ডিরেক্টরি বা ফোল্ডার তৈরি করতে ব্যবহার করা হয়। ফাংশনটির ভেতরে স্ট্রিং (string) হিসেবে তুমি যে ঠিকানা বা পাথ (path) লিখে দেবে, ঠিক সেই জায়গায় এটি নতুন ফোল্ডারটি তৈরি করবে।

import os

os.mkdir("D:\\programming")
# এই কোডটি তোমার কম্পিউটারের D ড্রাইভের ভেতরে 'programming' নামে একটি নতুন ফোল্ডার তৈরি করবে।

৪) os.error() -

এটি অপারেটিং সিস্টেম লেভেলের ভুল বা এররগুলোকে (errors) নির্দেশ করে। যদি কোনো ফাইলের নাম বা ফোল্ডারের ঠিকানা ভুল হয়, কিংবা সেটি খুঁজে পাওয়া না যায়, অথবা এমন কোনো তথ্য দেওয়া হয় যা ডাটা টাইপ হিসেবে ঠিক কিন্তু অপারেটিং সিস্টেম তা গ্রহণ করতে পারছে না— তখন এই মডিউলের সব ফাংশন একটি OSError দেখায় (raise করে)।

৫) os.rename() -

এই ফাংশনটি কোনো ফাইল বা ডিরেক্টরির (ফোল্ডার) নাম পরিবর্তন (rename) করতে ব্যবহার করা হয়। তবে ফাইলের নাম তখনই পরিবর্তন হবে, যদি ফাইলটি বাস্তবে কম্পিউটারে থাকে (exists) এবং ব্যবহারকারীর কাছে সেই ফাইলটি পরিবর্তন করার মতো প্রয়োজনীয় পারমিশন বা অধিকার (privilege permission) থাকে।

এটি দুটি আর্গুমেন্ট গ্রহণ করে:

  1. ফাইলের বর্তমান নাম (current name)
  1. ফাইলটির নতুন যে নাম তুমি দিতে চাও (new name)
import os

os.rename('data.txt', 'python.txt')
# এই কোডটি তোমার কম্পিউটারে থাকা 'data.txt' ফাইলটির নাম পরিবর্তন করে 'python.txt' করে দেবে।

Third-party Modules

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

কিন্তু এমন কিছু পরিস্থিতি আসে, যখন অতিরিক্ত কিছু সুবিধা বা ফিচারের জন্য তোমাকে বাইরে থেকে কিছু থার্ড-পার্টি (third party) মোবাইল অ্যাপ ইনস্টল করতে হয়। এই অ্যাপগুলো বিভিন্ন স্বাধীন ডেভেলপার বা প্রোগ্রামাররা তৈরি করেন এবং এগুলো প্লে-স্টোর (Play Store) কিংবা অ্যাপ স্টোর (App Store)-এর মতো জায়গায় আপলোড বা হোস্ট করা থাকে (যেমন: ফেসবুক, হোয়াটসঅ্যাপ বা বিভিন্ন গেম)।

একইভাবে, পাইথনেও এমন কিছু মডিউল রয়েছে যা পৃথিবীর বিভিন্ন প্রান্তের স্বাধীন ডেভেলপাররা বা প্রোগ্রামাররা তৈরি করেছেন। তুমি তোমার প্রয়োজন অনুযায়ী এই মডিউলগুলো তোমার প্রজেক্টে ব্যবহার করতে পারো। এই ধরনের মডিউলগুলোকে থার্ড-পার্টি মডিউল (third-party modules) বলা হয়।

তাই, বিল্ট-ইন (পাইথনের সাথে আগে থেকে থাকা) মডিউল এবং থার্ড-পার্টি মডিউলের মধ্যে একমাত্র বড় পার্থক্য হলো— আমাদের মোবাইলে কোনো থার্ড-পার্টি অ্যাপ ব্যবহার করার আগে যেমন তা ডাউনলোড বা ইনস্টল করতে হয়, ঠিক তেমনি এই মডিউলগুলোও বাস্তবে ব্যবহার করার আগে আমাদের কম্পিউটারে প্রথমে ইনস্টল করে নিতে হবে।

সহজ কথায় বলতে গেলে, থার্ড-পার্টি মডিউল হলো এমন যেকোনো কোড যা কোনো তৃতীয় পক্ষ বা অন্য কেউ লিখেছেন (অর্থাৎ এটি তুমিও লেখোনি, আবার পাইথন যারা তৈরি করেছে সেই PSF বা Python Software Foundation-ও লেখেনি)। পাইথনের নিজস্ব একটি বিশাল স্ট্যান্ডার্ড লাইব্রেরি (Standard Library) রয়েছে, যা শুরু থেকেই অনেক দরকারি মডিউল আমাদের দিয়ে থাকে। কিন্তু তোমার যা যা প্রয়োজন, তার সবকিছুই যে সেখানে থাকবে এমনটা নয়। আর ঠিক এই জায়গাতেই প্রয়োজন হয় থার্ড-পার্টি মডিউলের।

PyPI

ঠিক যেরকম আমরা একটি থার্ড পার্টি অ্যাপ্লিকেশন অ্যাপ স্টোর বা গুগল প্লে স্টোর থেকে ইন্সটল করতে পারি, সেরকম ভাবে পাইথনের থার্ডপার্টি মডিউল গুলো PyPI(Python Package Index) এ আপলোড করা থাকে। PyPI হলো পাইথনের অফিসিয়াল থার্ড পার্টি সফটওয়্যার Repository.

পিআইপি (PIP)

তাই, আমরা আমাদের প্রয়োজনীয় মডিউলগুলো PyPI (Python Package Index) থেকে ইনস্টল করতে পারি। আর এই কাজটি করার জন্য আমরা PIP নামের একটি টুলের সাহায্য নিই। পাইথনের সাথে আগে থেকেই একটি প্যাকেজ ম্যানেজার (package manager) দেওয়া থাকে, যার নাম হলো pip

এই নামটি মূলত একটি রিকার্সিভ অ্যাক্রোনিম (recursive acronym), যার পূর্ণ রূপ হলো Pip Installs Packages। PyPI থেকে কীভাবে স্বয়ংক্রিয়ভাবে মডিউল ইনস্টল করতে হয় তা Pip নিজেই জানে, তবে তোমার প্রয়োজন হলে তুমি নিজেও ম্যানুয়ালি PyPI-তে গিয়ে সার্চ করতে পারো বা ঘুরে দেখতে পারো।

টার্মিনালে (terminal) নিচের কমান্ডটি রান করে আমরা PIP-এর সাহায্যে যেকোনো প্রয়োজনীয় মডিউল ইনস্টল করতে পারি:

pip install module_name

একবার মডিউলটি ইনস্টল হয়ে গেলে, বিল্ট-ইন মডিউলগুলোর মতোই আমরা সহজভাবে import স্টেটমেন্ট ব্যবহার করে সেটিকে আমাদের কোডে নিয়ে আসতে (import করতে) এবং ব্যবহার করতে পারি।

Custom Modules

আব্দুল্লাহ তার মোবাইলে এমন একটি অ্যাপ্লিকেশন চেয়েছিল যা তাকে তার হোয়াটসঅ্যাপ (WhatsApp) থেকে অন্য মানুষের স্ট্যাটাস বা স্টোরিগুলো ডাউনলোড করতে সাহায্য করবে। কিন্তু দুঃখের বিষয় হলো, তখন তার মোবাইলে এমন কোনো বিল্ট-ইন অ্যাপ ছিল না, আবার প্লে-স্টোর (PlayStore) বা অ্যাপ স্টোরেও (App Store) এই ধরনের কোনো অ্যাপ পাওয়া যাচ্ছিল না।
কিন্তু আব্দুল্লাহ মোটেই হাল ছেড়ে দেয়নি! সে তার নিজের প্রয়োজন অনুযায়ী নিজেই একটি নতুন মোবাইল অ্যাপ তৈরি করে ফেলল, যা সে যেকোনো সময় ব্যবহার করতে পারে। ঠিক তার নিজের তৈরি একটি কাস্টম অ্যাপের মতো!

একইভাবে, পাইথনে আমরা আমাদের প্রয়োজন অনুযায়ী নিজস্ব মডিউল তৈরি করতে পারি। এই ধরনের মডিউলগুলোকে কাস্টম মডিউল বলা হয়। অতএব, কাস্টম মডিউল আর কিছুই নয়— এটি হলো ডেভেলপার বা প্রোগ্রামার নিজে যে মডিউলটি তৈরি করেছেন সেটি।

পাইথনের কাস্টম মডিউলগুলো অন্য যেকোনো মডিউলের মতোই কাজ করে এবং এগুলো মূলত সাধারণ কিছু পাইথন ফাইল (যেমন: .py ফাইল), যা অন্য যেকোনো পাইথন ফাইলে ইম্পোর্ট (import) করা যায়। সহজ কথায়, এটি হলো এমন একটি ফাইল যার মধ্যে বেশ কিছু ফাংশনের সমষ্টি থাকে, যা তুমি তোমার মূল প্রোগ্রামে যুক্ত করতে চাও।

চলো এবার কাস্টম মডিউল তৈরি করার চমৎকার সুবিধাগুলো নিয়ে আলোচনা করা যাক:

১) যদি একটি প্রোগ্রামে প্রচুর পরিমাণে ফাংশন এবং ক্লাস (classes) থাকে, তবে সেগুলোকে আলাদা আলাদা মডিউলে যৌক্তিকভাবে গুছিয়ে (organize) রাখা যায়। একটি নির্দিষ্ট মডিউলে সমজাতীয় বা একই উদ্দেশ্যে তৈরি করা ক্লাস, ফাংশন এবং অন্যান্য রিসোর্সগুলো জমা রাখা হয়।

কোডের এই ধরনের গোছানো রূপকে মডুলার ডিজাইন (modular design) বলা হয়, যা বোঝা, ব্যবহার করা এবং পরবর্তীতে রক্ষণাবেক্ষণ (maintain) করা অনেক সহজ।

২) এই ধরনের মডিউল নিয়ে কাজ করলে কোডকে পুনর্ব্যবহারযোগ্য (reusable) করা যায়। ধরা যাক, তোমার প্রজেক্টের বেশ কয়েকটি আলাদা ফাইলে একই ফিচার বা লজিক ব্যবহার করতে হবে; এমন পরিস্থিতিতে বারবার একই কোড না লিখে, তুমি খুব সহজেই সেই লজিক দিয়ে একটি মডিউল তৈরি করে নিতে পারো এবং প্রয়োজনমতো সব ফাইলে তা ইম্পোর্ট (import) করে ব্যবহার করতে পারো।

How it works

আমরা এখন জানি কাস্টম মডিউল কী, কিন্তু এটি কীভাবে কাজ করে? এটি ব্যবহার করা খুবই সহজ, নিচে এর ধাপগুলো দেওয়া হলো:

  • ধাপ ১ (Step 1) - প্রথমে একটি ফাইল তৈরি করো, ধরা যাক ফাইলটির নাম logic.py। এই ফাইলের ভেতরেই মডিউলের মূল লজিক বা ফাংশনগুলো থাকবে, যা তুমি অন্য কোনো ফাইলে ব্যবহার করতে চাও।
  • ধাপ ২ (Step 2) - এবার আরেকটি নতুন ফাইল তৈরি করো, ধরা যাক সেটির নাম test.py। এরপর import স্টেটমেন্ট ব্যবহার করে নিচে দেখানো উপায়ে সেই logic.py ফাইলটিকে (যা এখন একটি মডিউল) এই নতুন ফাইলে ইম্পোর্ট করো:
import logic

এখন, তুমি পাইথনের অন্য যেকোনো সাধারণ মডিউলের মতোই এই logic মডিউলটি ব্যবহার করতে পারবে এবং এর ভেতরে থাকা সব ফিচার বা ফাংশনগুলো অ্যাক্সেস করতে পারবে।

কাস্টম মডিউল তৈরি করা (Creating Custom Module)

কাস্টম মডিউল আর কিছু নয়— এটি হলো ডেভেলপার বা প্রোগ্রামার নিজে যে মডিউলটি তৈরি করেন সেটি। এটি অন্য যেকোনো মডিউলের মতোই এবং এগুলো মূলত সাধারণ কিছু পাইথন ফাইল যা অন্য ফাইলে ইম্পোর্ট (import) করা যায়। তো চলো, এই সেকশনে আমরা আমাদের নিজস্ব একটি কাস্টম মডিউল তৈরি করি।

ধরা যাক, তোমার এমন একটি অ্যাপ্লিকেশন আছে যেখানে একটি সংখ্যা জোড় (even) নাকি বিজোড় (odd)— তা বারবার পরীক্ষা করা প্রয়োজন। এটি শুধু একটি ফাইলে নয়, বরং একটি প্রজেক্টের অনেকগুলো আলাদা ফাইলে পরীক্ষা করতে হতে পারে। এই ধরনের পরিস্থিতিতে, আমরা একটি কাস্টম মডিউল তৈরি করতে পারি যার মধ্যে সংখ্যাটি পরীক্ষা করার দায়িত্ব নেওয়ার জন্য একটি নির্দিষ্ট ফাংশন থাকবে।

তুমি খুব সহজেই সেই ফাইল বা মডিউলটি ইম্পোর্ট করতে পারো এবং প্রয়োজনীয় ফাংশনটিকে কল (call) করতে পারো। তাহলে চলো, সামনে এগিয়ে যাওয়া যাক এবং এই কাজটি প্র্যাক্টিক্যালি করা শুরু করি!

চলো একটি পাইথন ফাইল তৈরি করি এবং সেটির নাম দিই oddeven.py। এই ফাইলের ভেতরে আমাদের দুটি মেথড বা ফাংশন থাকবে: isEven() এবং isOdd()। সংখ্যাটির ওপর ভিত্তি করে এই ফাংশনগুলো True (সত্য) অথবা False (মিথ্যা) রিটার্ন করবে। নিচে আমাদের oddeven.py ফাইলের কোডটি দেওয়া হলো:

# এটি জোড় সংখ্যা পরীক্ষা করার ফাংশন
def isEven(number):
    if number % 2 == 0:     # সংখ্যাটিকে ২ দিয়ে ভাগ করলে যদি ভাগশেষ ০ হয়
        return True         # তাহলে এটি জোড় সংখ্যা (True)
    else:
        return False        # অন্যথায় এটি জোড় সংখ্যা নয় (False)

# এটি বিজোড় সংখ্যা পরীক্ষা করার ফাংশন
def isOdd(number):
    if number % 2 != 0:     # সংখ্যাটিকে ২ দিয়ে ভাগ করলে যদি ভাগশেষ ০ না হয়
        return True         # তাহলে এটি বিজোড় সংখ্যা (True)
    else:
        return False        # অন্যথায় এটি বিজোড় সংখ্যা নয় (False)

এখন, চলো একটি নতুন ফাইল তৈরি করি যার নাম দিই project.py। এই ফাইলটিতে আমাদের সেই ফিচারের প্রয়োজন হবে যা আমরা একটু আগে oddeven.py ফাইলে তৈরি করেছি। তাই আমরা খুব সহজভাবে ফাইলটিকে ইম্পোর্ট করব এবং এর ভেতরের ফাংশনগুলো ব্যবহার করব। চলো কাজটা শুরু করি এবং আমাদের তৈরি করা কাস্টম মডিউলটি ব্যবহার করি:

import oddeven  # আমাদের তৈরি করা কাস্টম মডিউলটি ইম্পোর্ট করা হলো

# ব্যবহারকারীর কাছ থেকে ইনপুট নিয়ে সেটিকে পূর্ণসংখ্যায় (integer) রূপান্তর করা হচ্ছে
number = int(input("Enter a number to test: "))

print(oddeven.isEven(number))  # সংখ্যাটি জোড় কি না পরীক্ষা করে রেজাল্ট প্রিন্ট করবে
print(oddeven.isOdd(number))   # সংখ্যাটি বিজোড় কি না পরীক্ষা করে রেজাল্ট প্রিন্ট করবে

এটি রান করলে নিচের মতো আউটপুট তৈরি হবে:

Enter a number to test: 4

True

False

About the author

MD Zakaria Hossen
Together Toward Eternity

Post a Comment