পাইথন বেসিক
পাইথন একটি হাই-লেভেল, ইন্টারপ্রেটেড, ইন্টারেকটিভ, ডাইনামিক্যালি টাইপড এবং অব্জেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাংগুয়েজ। ইন্টারপ্রেটেড ল্যাংগুয়েজ মানে পাইথন প্রোগ্রাম রান করার জন্য প্রথমে কম্পাইল করতে হয় না। পাইথন রানটাইমে প্রোগ্রাম প্রোসেস করে। এ কারনে পাইথন অন্যান্য ল্যাংগুয়েজ থেকে কিছুটা ধীরগতির। পাইথনের স্ট্যান্ডার্ড ফর্ম মূলত সি-ল্যাংগুয়েজের উপর ভিত্তি করে লিখা যাকে Cpython বলে। আমরা যখন পাইথনে কোন কোড লিখি ও রান করি ঠিক তখন পাইথন সে কোড কে বাইট কোডে কনভার্ট করে তারপর রান করে। এ জন্যই পাইথনের প্রোগ্রাম রান করতে সময় একটু বেশি লাগে। বর্তমানে Cpython ছাড়াও পাইথনের আরো কিছু ইমপ্লিমেন্টেশন আছে। যেমনঃ PyPy, Jython ইত্যাদি।
শুরুতে পাইথনের কিছু গাইডলাইন,এথিকস বা নীতি দেখে নেই যা “The Zen of Python“ নামে পরিচিত। ইন্টারপ্রেটারে “import this” এই কমান্ড দিলে ২০ লাইনের একটা আউটপুট প্রিন্ট হয়।
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
এখন প্রশ্ন থাকতে পারে যে এখানে তো ১৯ লাইন। আরেক লাইন কোথায়? এটা এখন পর্যন্ত অজানাই রয়ে গেছে, তবে অনেকের মতে অন্য লাইনটি হচ্ছে হোয়াইট স্পেস, যা দিয়ে পাইথনে স্পেসিং এর প্রয়োজনীয়তা বুঝানো হয়েছে।
ভ্যারিয়েবল
ভ্যারিয়েবল হচ্ছে একটা পাত্র যেখানে আমরা কোন ডেটা রাখি। পাইথনে কোন ভ্যারিয়েবল ডিক্লেয়ার করার জন্য ডেটা টাইপ উল্লেখ করতে হয় না। পাইথন নিজেই কোন ডেটা টাইপের ভ্যারিয়েবল সেটা ডিফাইন করে নেয়।
>>> a = 100 #An integer type variable
>>> b = 253.64 #A float type variable
>>> c = "Python" #A string type variable
পাইথনে একসাথে একাধিক ভ্যারিয়েবলও ডিক্লেয়ার করা যায়।
>>> a, b, c = 100, 474.7, "Python"
কন্সট্যান্টস
ভ্যারিয়েবল মান সবসময় পরিবর্তনীয়। কিন্তু আমরা যদি চাই যে কোন আইডে-ন্টিফাইয়ারের মান পরিবর্তন না হোক মানে ধ্রবক থাকুক তাহলে সে আইডেন্টি-ফাইয়ারের নামের প্রতিটি অক্ষর আপার কেজ লেটারে লিখতে হয়। তবে এটি একটি কনভেনশন মানে আপার কেজ লেটারে না লিখলে ও এরর দেখাবে না। পাইথন একে ভ্যারিয়েবল হিসেবেই নিবে। শুধু প্রোগ্রামকে রিডেবল করতে এই নিয়ম মানা জরুরি।
আইডেন্টিফাইয়ারস
পাইথন আইডেন্টিফায়ার হচ্ছে ভ্যারিয়েবল, ক্লাস, ফাংশন ইত্যাদির জন্য ব্যবহৃত নাম। আইডেন্টিফায়ার লিখার ক্ষেত্রে আমরা a/A - z/Z, 1 - 9, এবং আন্ডারস্কোর " _ " ব্যবহার করি। পাইথনে আইডেন্টিফায়ার লিখার ক্ষেত্রে @, $, % ইত্যাদি চিহ্ন ব্যবহার করা যায় না। পাশাপাশি পাইথন একটি কেজ সেন্সিটিভ ল্যাংগুয়েজ। python এবং Python দুটো আলাদা অর্থবহন করে।
নেমিং কনভেনশন
নেমিং কনভেনশন হল, নাম রাখার নিয়ম। কোড কে রিডেবল করার জন্য নেমিং কনভেনশন মানা খুবই প্রয়োজন। পাইথনে ক্লিন কোড লিখার জন্য কিছু ভ্যারিয়েবল, ফাংশন্স ক্লাস ইত্যাদির নামকরণের ক্ষেত্রে কিছু নিয়ম ফলো করে।
- গ্লোবাল অথবা লোকাল যেকোণ ভ্যারিয়েবল সব সময় লোয়ার কেজ লেটারে লিখতে হয়।var = 0
- ফাংশনের নাম লোয়ার কেজ লেটারে এবং শব্দগুলোকে আন্ডারস্কোর দিয়ে আলাদা করে লিখতে হয়।def func_name():pass
- প্যাকেজ ও মডিউলের নাম লোয়ার কেজ লেটারে লিখতে হয়।math, os, sys
- ক্লাসের নাম আপারকেজ লেটার দিয়ে শুরু করতে হয়। এছাড়া বাকি সব আইডেন্টফায়ার লোয়ারকেজ লেটার দিয়ে শুরু করতে হয়।class Car:pass
- কোনো আইডেন্টিফায়ার যদি দুটি আন্ডারস্কোর দিয়ে শুরু ও শেষ হয় তার মানে হচ্ছে আইডেন্টিফায়ার টি একটা ল্যাংগুয়েজ ডিফাইন্ড স্পেশাল নেম।__dict__, __future__, __all__
- নন-পাবলিক মেথডের আগে একটি আন্ডারস্কোর দিতে হবে।def _protected():pass
- প্রাইভেট মেথডের শুরুতে দুটি আন্ডারস্কোর দিতে হয়। যদিও এটি কনভেনশন নয় এটি সিন্ট্যাক্স।def __private():pass
- কোনো ফাংশনের নামের আগে ও পরে দুটিকরে আন্ডারস্কোর থাকলে ফাংশনটি একটি ম্যাজিক মেথড।def __init__():pass
ইন্ডেনটেশন
ইন্ডেন্টেশন হচ্ছে নির্দিষ্ট সংখ্যক স্পেস। সাধারণত এক ট্যাব বা চারটি স্পেস কে স্ট্যান্ডার্ড ধরা হয়। তবে এটি ভ্যারিয়েবল, আমরা চাইলে এর মান পরিবর্তন করে দিতে পারি । পাইথনে স্পেসিং বা ইন্ডেন্টেশন অনেক বেশি গুরুত্বপূর্ণ। কারণ পাইথনে কোড ব্লক বুঝানোর জন্য কোন ব্র্যাকেট ব্যবহার করা হয় না৷ তাই ক্লাস বা ফাংশন লিখার সময় কোড ব্লকের শুরু বা শেষ বুঝাতে ইন্ডেন্টেশনের ব্যবহার করা হয়। ইন্ডেন্টেশনের জন্য ট্যাবের বিপরীতে স্পেস ব্যবহার করাই উচিত।
কমেন্টস
প্রোগ্রামিং এ কমেন্টিং এর অভ্যাস গড়ে তোলা খুবই গুরুত্বপূর্ণ। কোডকে রিডেবল করার জন্য কমেন্টিং করা খুবই জরুরি। তা না হলে দেখা যায় কিছু দিন পর নিজের লিখা কোড নিজেই বুঝতে বেগ পেতে হয়। আর কমেন্ট লিখার সময় ও খেয়াল রাখতে হবে যে কমেন্ট যেন স্পষ্ট হয়। একটা বিখ্যাত উক্তি আছে “Code never lies, comments sometimes do”. পাইথনে কমেন্টিং এর জন্য (#) হ্যাস চিহ্ন ব্যবহার করা হয়।
# This is a comment
ডক স্ট্রিংস
একাধিক লাইন কমেন্ট লিখার ক্ষেত্রে পাইথনে ট্রিপল সিঙ্গেল কোট (''' ''') অথবা ট্রিপল ডাবল কোট (""" """) ব্যবহার করা হয়। এদেরকে ডকস্ট্রিং বলা হয়। কমেন্টস ও ডক স্ট্রিং এর মাঝে অনেক পার্থক্য আছে।
"""
If I really hate pressing `enter` and
typing all those hash marks, I could
just do this instead
"""
কোন ফাংশন,ক্লাস বা প্যাকেজের ডকুমেন্টেশন লিখার জন্য ডকস্ট্রিং ব্যবহার করা হয়। কোন ফাংশন, ক্লাস বা প্যাকেজের ডকুমেন্টেশ্ন দেখার জন্য বিল্ট-ইন help() ও doc ফাংশন ব্যবহার করতে পারি।
>>> def func():
... '''this is the function documentation'''
... pass
>>> print(func.__doc__)
this is the function documentation
>>> help(func)
Help on function func in module __main__:
func()
this is the function documentation
রিজার্ভড কি-ওয়ার্ডস
যে শব্দ গুলো পাইথনে আগে থেকেই কোন না কোন কাজের জন্য ডিফাইন করা আছে সেগুলো হচ্ছে কি-ওয়ার্ড বা রিজার্ভড ওয়ার্ডস। কোন প্রোগাম লিখার সময় খেয়াল রাখতে হবে যাতে কোন আইডেন্টিফায়ারের নাম আর রিজার্ভড ওয়ার্ডসের নাম একই না হয়৷
অপারেটরস
যোগ, বিয়োগ বা অন্য যেকোন অপারেশন চালানোর জন্য কিছু বিশেষ চিহ্ন ব্যবহার করা হয়, এদেরকেই অপারেটর বলা হয়। কোন অপারেশনে জন্য যেসব ভ্যারিয়েবল বা ভ্যালু ব্যবহার করে তাদের অপারেন্ড বলে। a+b একটি অপারেশন যেখানে a এবং b হল দুটি অপারেন্ড। পাইথনে ছয় ধরনের অপারেটর রয়েছে।
এরিথমেটিক অপারেটরস
যোগ বিয়োগ সহ অন্যান্য গাণিতিক অপারেশনের জন্য যেসব অপারেটর ব্যবহার করা হয় তাদের এরিথমেটিক অপারেটর বলে।
ঊদাহরণঃ
>>> a = 4
>>> b = 3
>>> a + b
7
>>> a - b
1
>>> a * b
12
>>> a / b
1.3333333333333333
>>> a // b
1
>>> a % b
1
রিলেশনাল অপারেটরস
দুটো অপারেন্ডেকে পরস্পরের সাথে তুলনা করতে যেসব অপারেটর ব্যবহার করা হয় তাদের রিলেশনাল অপারেটর বলে।
উদাহরণঃ
>>> a = 4
>>> b = 3
>>> a > b
True
>>> b < a
True
>>> a == b
False
>>> a <= b
False
>>> a >= b
True
>>> a != b
True
লজিক্যাল অপারেটরস
দুটো বা তার অধিক কন্ডিশন চেক করার জন্য লজিকাল অপারেটর ব্যবহার করা হয়।
উদারহণঃ
>>> a = 4
>>> b = 3
>>> c = 1
>>> a > b and b > c
True
>>> a > b or c < b
True
>>> not a > b
False
বিট-ওয়াইজ অপারেটরস
বিট-ওয়াইজ অপারেটর প্রথমে অপারেন্ড কে বাইনারি ভ্যালু তে কনভার্ট করে। তাই এদের বাইনারি অপারেটর ও বলে।
উদাহরণঃ
>>>a = 60 # 60 = 0011 1100
>>>b = 13 # 13 = 0000 1101
>>>c = 0
>>>c = a & b # 12 = 0000 1100
12
>>>c = a | b # 61 = 0011 1101
61
>>>c = a ^ b; # 49 = 0011 0001
49
>>>
>>>c = ~a; # -61 = 1100 0011
-61
>>>c = a << 2 # 240 = 1111 0000 every bit is moved two bits left
240
>>>c = a >> 2 # 15 = 0000 1111 every bit is moved two bits right
15
অ্যাসাইনমেন্ট অপারেটরস
কোন ভ্যারিয়েবলে ডেটা রাখতে ইনপ্লেস অপারেটর ব্যবহার করা।
শুধুমাত্র নাম্বার বাদেও অন্যান্য টাইপের ক্ষেত্রেও ইন প্লেইস অপারেটর ব্যবহার করা যায় যেমন, স্ট্রিং এর ক্ষেত্রে,
language = "Python" language += "3" print(language)
আউটপুট:
Python3
আইডেন্টিটি অপারেটরস
is = যদি দুটো অপারেন্ড মেমোরি লোকেশন একই হয় তাহলে True
is not = যদি দুটো অপারেন্ড মেমোরি লোকেশন একই না হয় তাহলে True
>>> a = 4
>>> b = 4
>>> a is b
True
#WHY?
>>> id(a)
1612671840
>>> id(b)
1612671840
>>> a = ['a','b','c']
>>> b = ['a','b','c']
>>> a is b
False
#WHY!!!
>>> id(a)
2260705602248
>>> id(b)
2260705673544
#because list is mutable and they are located in different part of the memory
মেম্বারশিপ অপারেটরস
in = কোন ভ্যালু, ভ্যারিয়েবল যদি অন্য কোন ভ্যারিয়েবল বা অবজেক্টে থাকে তাহলে True
not in = কোন ভ্যালু, ভ্যারিয়েবল যদি অন্য কোন ভ্যারিয়েবল বা অবজেক্টে না থাকে তাহলে True
>>> 'a' in a
True
>>> 'a' not in a
False
ইনপুট-আউটপুট
ইনপুট input()
ইউজার থেকে কোন ডেটা ইনপুট নিতে পাইথনে input() ফাংশন ব্যবহার করা হয়। a = input() b = input("Enter a number: ") উপরের স্টেট্মেন্টের ক্ষেত্রে আমরা যদি নাম্বার ও ইনপুট দেই পাইথন সেটা স্ট্রিং হিসেবেই নিবে।
>>> a = input()
4
>>> a
'4'
>>> type(a)
<class 'str'>
তাই ইনপুট নেয়ার ক্ষেত্রে বলে দিতে হয় আমরা কোন টাইপের ডেটা ইনপুট হিসেবে চাই। প্রকৃত পক্ষে আমরা স্ট্রিং ই ইনপুট নেই এবং তাকে int(),str(),float() ফাংশনের মধ্যে পাঠিয়ে এর টাইপ পরিবর্তন করে নেই।
>>> a = int(input())
6
>>> a
6
>>> type(a)
<class 'int'>
>>> a = float(input())
2
>>> a
2.0
আউটপুট print()
পাইথনে কোন আউটপুট দেখানোর জন্য print() ফাংশন ব্যবহার করা হয়। প্রিন্ট ফাংশনের ফুল সিন্ট্যাক্স হচ্ছেঃ
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
প্যরামিটারসঃ • objects – যে কোন অবজেক্ট (*) এর দেয়ার মানে হচ্ছে একাধিক অবজেক্ট। • sep – একটি আউট পুট অপরটির মাঝখানে কি চিহ্ন দিয়ে আলাদা করা হবে। ডিফল্ট ভ্যালূঃ ' ' (সিঙ্গেল স্পেস) • end - end এর ভেতর আমরা যা পাস করব সেটা একদম সবার শেষে প্রিন্ট হবে। • file – ফাইল অবজেক্ট নেয়। • flush - False/True নোট: sep, end, file এবং flush হল কি-ওয়ার্ড আর্গুমেন্টস। অর্থ্যাৎ, এই আর্গুমেন্টস গুলো ব্যবহার করার সময় এদের নাম বলে দিতে হবে।
print(*objects, sep = 'separator')
এভাবে দিলে ভূল হবেঃ
print(*objects, 'separator')
বিভিন্ন ধরনের আর্গুমেন্টস নিয়ে আমরা এই বইয়ে পরে আলোচনা করব।
উদাহরণঃ
a = 3
print("a =", a, sep=’ *****’, end='\n\n\n')
print("a =", a, sep='---', end='end')
আউটপুটঃ
a = *****3
a =---3end
flush কি-ওয়ার্ড আর্গুমেন্ট কিভাবে কাজ করে তা নিয়ে এখানে আমরা বিশদ আলোচনা করব না। তবে এটির কাজটা একটু দেখা যাক...
txtfile = open("myfile.txt",'w')
for i in range(100):
print("I love Python",sep=' ',end = ' ',file = txtfile, flush = True)
প্রথমে যে ডিরেক্টরি / ফোল্ডারে আছো সেখানে myfile.txt নামে একটি ফাইল তৈরি কর। open() ফাংশনে ফাইলে নাম দিয়েছি এবং বলেছি একে ‘w’ write মুডে ওপেন করতে। এসব আমরা “পাইথন ফাইলস” অধায়ে দেখব। এবার এই একই প্রোগ্রাম একবার flush = False দিয়ে রান কর এবং myfile.txt ফাইল টি ওপেন করে দেখ। এবার flush = True দিয়ে রান কর তারপর ফাইল টি ওপেন কর। কিছু পরিবর্তন আছে? এ পরিবর্তনের পেছনে কি কারণ তা খোঁজার চেষ্টা কর। আমি একটু হিন্টস দিয়ে দেইঃ এর সাথে বাফারের একটা সম্পর্ক আছে।