আমাদের অনেক সময়ই একই কাজ একাধিকবার করতে হয়। যত বেশি বার করতে হয়, আমাদের তত বেশি পরিশ্রম হয়, তত বেশি সময় লাগে। তাই আমরা একই কাজ বারবার করতে পছন্দ করি না। এখন আমরা যদি কম্পিউটারে প্রোগ্রাম লিখে কম্পিউটার দিয়ে কোনো কাজ করাতে চাই, তাহলে তো আমাদের বিভিন্ন স্টেটমেন্ট বা কমান্ড দেওয়া দরকার হয়, তাই না? যেমন কোনো কিছু স্ক্রিনে দেখাতে চাইলে print() ফাংশন লিখতে হয়। এখন আমরা যদি দশবার কোনো জিনিস স্ক্রিনে দেখাতে চাই, তাহলে আমাকে কী দশবার print() ফাংশন দিতে হবে? আপাতত আমাদের উত্তর হচ্ছে হ্যাঁ। এখন, যদি একশ কিংবা এক হাজার বার সেই কাজ করতে চাই, তখন?
প্রোগ্রামিংয়ে একটি জিনিস আছে যার নাম লুপ (loop)। এই লুপের সাহায্যে আমরা একই কাজ বারবার করতে পারি। যেমন আমি যদি দশবার স্ক্রিনে দেখাতে চাই যে I want to be a great programmer, তখন আমরা এভাবে প্রোগ্রাম লিখবো :
for i in range(10):
print("I want to be a great programmer.")
এখানে আমি range() এর ভেতরে যত সংখ্যা লিখবো, for এর ভেতরের কাজটি ততবার হবে। ওপরের প্রোগ্রামটি রান করলেই সেটি বুঝতে পারা যাবে। এখন কেউ যদি বলে, I love Bangladesh কথাটি 100 বার প্রিন্ট করতে হবে, তাহলে কীভাবে প্রোগ্রাম লিখতে হবে সেটি নিশ্চয়ই বলে দিতে হবে না?
আমি যখন এভাবে for এর ভেতরে i in range(n) লিখবো, তখন for-এর ভেতরের যেই ব্লক, সেখানে যেসব কাজ করতে বলা হবে, কম্পিউটার সেটি n সংখ্যকবার করবে। এখানে i ভ্যারিয়েবলটি ব্যবহার করার কারণ হচ্ছে i-এর মান 0 থেকে শুরু করে এক এক করে বাড়বে এবং সর্বোচ্চ মান হবে n-1। একটি প্রোগ্রাম লিখে সেটি যাচাই করে নিই :
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
এখন আমরা আগের অধ্যায়ে করা বর্গক্ষেত্র আঁকার প্রোগ্রামে ফেরত যাই। যদিও সেই প্রোগ্রামটি অসম্পূর্ণ ছিল, সেটি ঠিকভাবে করতে পারলে প্রোগ্রামটি হবে এমন :
import turtle
turtle.shape("turtle")
turtle.speed(1)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.exitonclick()
এখন আমরা প্রোগ্রামের কোড একটু মনোযোগ দিয়ে দেখলে বুঝতে পারবো যে, এখানে নিচের দুইটি কাজ চারবার করা হচ্ছে :
turtle.forward(100)
turtle.left(90)
তাহলে আমরা যদি এমনভাবে টার্টলকে নির্দেশ দিই যে, নিচের কাজগুলো চারবার করবে :
- 100 ঘর সামনে যাও।
- 90 ডিগ্রী বামে ঘুর।তাহলেও কিন্তু বর্গক্ষেত্র তৈরি হয়ে যাওয়ার কথা। আমরা সেটি প্রোগ্রাম লিখে দেখি।
import turtle
turtle.shape("turtle")
turtle.speed(1)
for i in range(4):
turtle.forward(100)
turtle.left(90)
turtle.exitonclick()
ওপরের প্রোগ্রামটি চালালে আমরা একটি বর্গক্ষেত্র দেখতে পাবো। এখন কোন কাজগুলো লুপের ভেতরে করতে হবে, সেটি পাইথন বুঝবে কীভাবে? লুপের ভেতরের সব কাজ লুপ যেখানে শুরু হয়েছে, তার এক ট্যাব পরে দিতে হবে। if ব্লকের ভেতরে আমরা যেরকম করেছিলাম আর কী। এই বিষয়টি বুঝতে সমস্যা হলে পরিচিত কারো কাছ থেকে বুঝে নেওয়াই ভালো। তারপরও বইয়ের পরিশিষ্ট অংশে ইনডেনটেশন অধ্যায়ে বিষয়টি আমি আরেকটু বোঝানোর চেষ্টা করেছি।
এখন আমরা একটি ছোট্ট প্রোগ্রাম লিখবো, যার কাজ হবে, পঞ্চাশটি 1 যোগ করা। যোগফল কত হবে? আমরা চট্ করে বলে দিতে পারি যে, পঞ্চাশটি 1-এর যোগফল হবে 50। এখন প্রোগ্রাম লিখে সেটি করবো। আমাদের কিন্তু পঞ্চাশবার যোগ করার স্টেটমেন্ট লিখতে হবে না, কারণ ইতিমধ্যে আমরা লুপ শিখে ফেলেছি। যোগফল রাখার জন্য আমি result নামে একটি ভ্যারিয়েবল ব্যবহার করবো আর লুপের জন্য i। আমরা চাইলে ভ্যারিয়েবলের অন্য নামও দিতে পারি।
>>> result = 0
>>> for i in range(50):
... result = result + 1
...
>>> print(result)
50
>>>
result = result + 1 দেখে একটু অদ্ভুত লাগতে পারে। আসলে এখানে প্রথমে ডানপক্ষের বা = চিহ্নের ডান দিকের কাজ আগে হবে, মানে result ভেরিয়েবলের সঙ্গে 1 যোগ হবে, তারপরে সেই মানটি আবার result ভেরিয়েবলেই রাখা হবে। এখন সবার কাছে একটি প্রশ্ন। প্রথমে result = 0 কেন লেখা হলো? উত্তর চিন্তা করে খুঁজে বের করতে হবে। না পারলে পরিচিতজনের সাহায্য নিতে হবে।
এবারে আরেকটু কঠিন একটি সমস্যার সমাধান করার চেষ্টা করবো। সেটি হচ্ছে 1 + 2 + 3 + … + 48 + 49 + 50-এর যোগফল বের করা। অর্থাৎ 1 থেকে 50 পর্যন্ত প্রতিটি পূর্ণসংখ্যা যোগ করে যোগফল দেখাতে হবে। আগের প্রোগ্রামটির সঙ্গে মিল হচ্ছে যে, এখানেও 50 বার যোগ করতে হবে, তবে পার্থক্য হচ্ছে আগেরবার যেমন প্রতিবার 1 যোগ করেছিলাম, এবারে প্রথমে 1, তারপর 2, তারপর 3 এভাবে 50 পর্যন্ত সংখ্যাগুলো যোগ করতে হবে। এজন্য আমরা result = result + 1 না লিখে লিখবো result = result + num। আর এই num-এর মান প্রথমে হবে 1 তারপরে 2, এভাবে প্রতিবার 1 বাড়বে। প্রোগ্রামটি লিখে ফেলি :
>>> result = 0
>>> num = 1
>>> for i in range(50):
... result = result + num
... num = num + 1
...
>>> print(result)
1275
আমরা যদি আরো খানিকটা চিন্তাভাবনা করি, তাহলে কিন্তু নিচের কোড লিখেই একই কাজ করে ফেলতে পারবো :
>>> result = 0
>>> for num in range(51):
... result = result + num
...
>>> print(result)
1275
যেহেতু আমরা range(51) লিখেছি, তাই num-এর মান 0 থেকে শুরু হবে এবং 50-এ গিয়ে শেষ হবে। এখন একটি জিনিস জেনে রাখা ভালো যে, result = result + num-কে result += num ও লিখা যায়। তেমনি num = num + 1-কে লিখা যায় num += 1।
আমরা দেখলাম যে i in range(n) লিখলে i-এর মান 0 থেকে শুরু হয়। আমরা চাইলে সেটি অন্য কোনো সংখ্যা থেকেও শুরু করতে পারি, এজন্য আমাকে লিখতে হবে এরকম : range(start, n)। তাহলে i-এর মান start থেকে শুরু হয়ে 1 করে বাড়বে এবং n-1-এ গিয়ে শেষ হবে। আমরা যদি একটু চিন্তা করি, আগের প্রোগ্রামে প্রথমবার result = result + num স্টেটমেন্টে আসলে যা হয়েছিল, তা হচ্ছে : result = 0 + 0 (কারণ result-এর মান 0, num-এর মানও 0)। এই কাজটি আমাদের না করলেও চলে। আমরা এখন ওপরে নতুন যা কিছু শিখলাম, তাতে প্রোগ্রামটি নিচের মতো করে লিখতে পারি :
>>> result = 0
>>> for num in range(1, 51):
... result += num
...
>>> print(result)
1275
আমরা যদি চাই যে, for লুপের ভেতর কোনো কিছু 1 করে না বেড়ে 5 করে বাড়বে, সেই ব্যবস্থাও আছে। নিচের উদাহরণটি দেখলেই বুঝতে পারবো :
>>> for i in range(1, 20, 5):
... print(i)
...
1
6
11
16
>>>
একটি কথা আমি আবারো মনে করিয়ে দিতে চাই যে, এই বইটি পড়ে প্রোগ্রামিং শিখতে চাইলে প্রতিটি উদাহরণ পড়ার সময় নিজে নিজে করে দেখতে হবে। এবং অনুশীলনীগুলোও সব করতে হবে (কোনো সমস্যায় পড়লে বন্ধুর সাহায্য নিতে হবে কিংবা http://programabad.com ওয়েবসাইটে প্রশ্ন করতে হবে)।
এখন আমরা আরেকটি উদাহরণ দেখবো। 1 থেকে 100 পর্যন্ত যেসকল সংখ্যা 5 দ্বারা নিঃশেষে বিভাজ্য (অর্থাৎ 5 দিয়ে ভাগ করলে ভাগশেষ 0 হয়), সেই সংখ্যাগুলো প্রিন্ট করতে হবে এবং তাদের যোগফলও বের করতে হবে।
result = 0
for num in range(100):
if num % 5 == 0:
print(num)
result += num
print("Sum is:", result)
প্রোগ্রামটি আমরা একটি ফাইলে সেভ করে রান করতে পারি (আবার পাইথন ইন্টারপ্রেটারেও রান করতে পারি)। result–এর মান প্রিন্ট হবে 950। কিন্তু সঠিক উত্তর হচ্ছে 1050। এর কারণ কী? আমরা যে range(100) লিখেছি, তাতে তো num-এর মান লুপের ভেতরে 0 থেকে 99 পর্যন্ত হবে। তাহলে আমাদেরকে লিখতে হবে range(101)।
প্রোগ্রামটি আমরা আরো সহজে করতে পারতাম এভাবে :
result = 0
for num in range(5, 101, 5):
print(num)
result += num
print("Sum is:", result)
এখন লুপ ব্যবহার করে আমরা টার্টল দিয়ে একটি ড্যাশ লাইন আঁকবো। এখানে আমরা penup() ও pendown() ফাংশন ব্যবহার করবো। penup() মানে আমি কলম তুলে ফেললাম, এখন টার্টল যা-ই করুক না কেনো, স্ক্রিনে কোনো কিছু আঁকা হবে না। আবার pendown() করলে এর পর থেকে টার্টলের কাজকর্ম স্ক্রিনে দেখাবে। আমরা যেটি করবো, সেটি হচ্ছে 10 পিক্সেল সামনে যাবো, তারপরে penup() করবো, 3 পিক্সেল সামনে যাবো (কিন্তু যেহেতু penup করা হয়েছে, তাই স্ক্রিনে কিছু দেখাবে না), তারপর আবার pendown() করে ফেলবো। এই কাজটা আমাদের একাধিকবার করতে হবে, যত বড় লাইন আঁকতে চাই, তত বেশি বার করতে হবে। নিচের প্রোগ্রামে আমি 20 বার করলাম।
import turtle
turtle.speed(1)
for i in range(20):
turtle.forward(10)
turtle.penup()
turtle.forward(3)
turtle.pendown()
turtle.exitonclick()
আউটপুট হবে নিচের মতো :
লুপের ভেতর লুপ
আমাদের প্রয়োজন হলে আমরা লুপের ভেতরও লুপ চালাতে পারি। একে বলে নেস্টেড লুপ (nested loop)। যেমন, আমরা ইতিমধ্যে দেখেছি যে, কিভাবে for লুপ ব্যবহার করে বর্গক্ষেত্র আঁকতে হয়। এখন আমাদের যদি পাঁচটি বর্গক্ষেত্র আঁকার প্রয়োজন পরে, তাহলে কি আমরা বর্গক্ষেত্র আঁকার কোড পাঁচবার লিখবো? অবশ্যই না। আমরা একটি লুপ ব্যবহার করবো যা পাঁচবার ঘুরবে এবং তার ভেতরে বর্গক্ষেত্র আঁকার কোড লিখবো। নিচের কোড দেখে প্রথমে বোঝার চেষ্টা করতে হবে যে, কোডটির আউটপুট কেমন হবে এবং তারপর প্রোগ্রাম লিখে রান করে আউটপুট মিলিয়ে দেখতে হবে।
import turtle
turtle.shape("turtle")
turtle.speed(1)
for side_length in range(50, 100, 10):
for i in range(4):
turtle.forward(side_length)
turtle.left(90)
turtle.exitonclick()
লিস্টের ওপর লুপ চালানো
আমাদের যদি কোনো লিস্ট থাকে। আমরা সেই লিস্টের ওপর কিন্তু লুপ চালাতে পারি। যেমন :
>>> saarc = ["Bangladesh", "Afghanistan", "Bhutan", "Nepal", "India", "Pakistan", "Sri Lanka"]
>>> for country in saarc:
... print(country, "is a member of SAARC")
...
Bangladesh is a member of SAARC
Afghanistan is a member of SAARC
Bhutan is a member of SAARC
Nepal is a member of SAARC
India is a member of SAARC
Pakistan is a member of SAARC
Sri Lanka is a member of SAARC
>>>
আরেকটি মজার বিষয় হচ্ছে, আমরা range() দিয়েও লিস্ট তৈরি করতে পারি। এজন্য আমাকে list() ফাংশন ব্যবহার করতে হবে। এটিও বিল্ট-ইন ফাংশন, তাই এটি ব্যবহার করার জন্য কোনো মডিউল ইমপোর্ট করতে হবে না। যেমন, আমি যদি চাই, 0 থেকে 10 পর্যন্ত সবগুলো সংখ্যার লিস্ট তৈরি করবো, তাহলে এভাবে করতে পারি :
>>> li = list(range(11))
>>> print(li)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
আবার আমি যদি চাই যে 1 থেকে 20 পর্যন্ত জোড় সংখ্যাগুলোর লিস্ট তৈরি করবো, তাহলে এভাবে করতে পারি :
>>> li = list(range(2, 21, 2))
>>> print(li)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
টিকা: এই বইতে আমি list()-কে ফাংশন বলে পরিচিত করালেও ভবিষ্যতে আমরা বিষয়টি আরো জানবো, যখন অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং শিখবো। এই বইতে আমি সেটি নিয়ে আলোচনা করি নি।
while লুপ
এখন আমরা আরেক ধরনের লুপ দেখবো, যার নাম while লুপ। যারা নতুন নতুন প্রোগ্রামিং শিখে, তাদের মনে প্রায়ই প্রশ্ন জাগে, লুপ তো একভাবে লিখলেই হয়, আমার কি সবরকম পদ্ধতি শেখার দরকার আছে? এক কথায় উত্তর হচ্ছে, অবশ্যই দরকার আছে।
while লুপের ক্ষেত্রে প্রথমে while লিখতে হবে, তারপরে একটি শর্ত লিখতে হবে, যেই শর্ত সত্যি হলে লুপের ভেতরের কাজ একবার হবে, তারপরে আবার সেই শর্ত পরীক্ষা করা হবে। এভাবে যতক্ষণ শর্তটি সত্যি হবে, ততক্ষণ লুপের ভেতরের কাজ চলতে থাকবে এবং প্রতিবার লুপের ভেতরের কাজ চলার পরে সেই শর্তও পরীক্ষা করা হতে থাকবে। আমরা এখন দুইটি উদাহরণ দেখবো, তাহলে while লুপ কিভাবে ব্যবহার করতে হয়, সেটি আমাদের কাছে পরিষ্কার হয়ে যাবে।
>>> i = 0
>>> while i < 5:
... print(i)
... i += 1
...
0
1
2
3
4
>>>
>>> i = 5
>>> while i >= 0:
... i -= 1
... print(i)
...
4
3
2
1
0
-1
>>>
আমরা এখন while লুপ ব্যবহার করে নামতা প্রিন্ট করার একটি প্রোগ্রাম লিখবো।
n = input("Please enter a positive integer: ")
n = int(n)
m = 1
while m <= 10:
print(n, "x", m, "=", n*m)
m += 1
ওপরের প্রোগ্রামটি namta.py নামে সেভ করে রান করে দেখতে হবে। আমরা চাইলে multiplication_table.py নামেও ফাইলটি সেভ করতে পারতাম, কারণ নামতাকে ইংরেজিতে বলে multiplication table।
আমরা ইতিপূর্বে দেখেছি যে, for লুপের ভেতরে for লুপ ব্যবহার করা যায়। তেমনি for লুপের ভেতরে while লুপ, while লুপের ভেতরে for লুপ, while লুপের ভেতরে while লুপ, এরকম ব্যবহার করা যায়। পরবর্তী প্রোগ্রামে আমরা সেটি করবো। সেই সঙ্গে টার্টল দিয়ে লাইনগুলোর রং পরিবর্তন করা যায়, সেটিও দেখানো হবে। প্রোগ্রামটির আউটপুট হবে এমন :
import turtle
turtle.color("black")
turtle.speed(5)
counter = 0
while counter < 36:
for i in range(4):
turtle.forward(100)
turtle.right(90)
turtle.right(10)
counter += 1
turtle.exitonclick()
turtle.color(“black”) লাইনে বিভিন্ন রং (যেমন : blue, green, red, yellow, orange ইত্যাদি) ব্যবহার করে প্রোগ্রামটি বারবার চালিয়ে দেখতে হবে। আমি বই ছাপানোর খরচ কমানোর জন্য black ব্যবহার করেছি। এখন সবার কাছে একটি প্রশ্ন। ওপরের প্রোগ্রামে আমি কেন counter < 36 শর্ত ব্যবহার করেছি?
টার্টল ব্যবহার করে লুপের ভেতরে লুপ ব্যবহার করার আরেকটি উদাহরণ দেখে নিই। আমরা যত বেশি প্রোগ্রামিং করব, প্রোগ্রামিং শেখাটা তত ভালো হবে।
import turtle
height = 5
width = 5
turtle.speed(2)
turtle.penup()
for y in range(height):
for x in range(width):
turtle.dot()
turtle.forward(20)
turtle.backward(20 * width)
turtle.right(90)
turtle.forward(20)
turtle.left(90)
turtle.exitonclick()
এখানে dot() ফাংশন ব্যবহার করে ডট প্রিন্ট করা হচ্ছে। আর শুরুতেই আমরা penup() কল করেছি যেন forward(), backword() এসব ফাংশনের কাজ হওয়ার সময় স্ক্রিনে কোনো কিছু আঁকা না হয়। মানে কলম একটু ওপরে তুলে যদি কাগজের এদিক-সেদিক নেই, তাহলে তো কাগজে কোনো দাগ পড়বে না, তাই নয় কি? প্রোগ্রামটিতে height, width -এর বিভিন্ন মান দিয়ে এবং x, y এর মান লুপের ভেতরে প্রিন্ট করে পরীক্ষা-নিরীক্ষা করা যেতে পারে। আর প্রোগ্রামের আউটপুট হবে এমন :
break এবং continue
লুপের ভেতরে কখনও কখনও আমাদের বিশেষ অবস্থার সৃষ্টি হতে পারে, যেই অবস্থার সৃষ্টি হলে আমরা চাই যে, প্রোগ্রাম লুপ থেকে বের হয়ে যাবে। সেই কাজটি করার জন্য আমরা break ব্যবহার করতে পারি। আবার আমরা যদি চাই যে, কোনো বিশেষ অবস্থায় লুপের ভেতরে পুরো কাজ না হয়ে লুপটি চলতে থাকবে, তখন আমরা continue ব্যবহার করবো। উদাহরণ দেখলেই বিষয়টি পরিষ্কার হবে।
আমরা এখন একটি প্রোগ্রাম লিখবো, যেটি একটি সংখ্যার বর্গ বের করবে। প্রোগ্রামটি প্রতিবার ব্যবহারকারির কাছ থেকে ইনপুট চাইবে আর তার বর্গ প্রিন্ট করবে। তবে ইনপুটের সংখ্যাটি যদি 0 হয়, তখন প্রোগ্রামটি বন্ধ হয়ে যাবে।
while True:
n = input("Please enter a number (0 to exit): ")
n = int(n)
if n == 0:
break
print("Square of", n, "is", n*n)
পরের প্রোগ্রামটি আমরা sqrn.py নামের ফাইলে সেভ করে রান করতে পারি। এই প্রোগ্রামে আমি while লুপের ভেতরে শর্ত ব্যবহার করেছি True, যা সবসময়ই সত্যি। তাহলে লুপটি চলতেই থাকবে, কখনো বন্ধ হবে না। বন্ধ করার বা লুপ থেকে বের হওয়ার উপায় হচ্ছে break। লুপের ভেতরে প্রতিবার আমরা শুরুতে একটি সংখ্যা ইনপুট নিচ্ছি। সেই সংখ্যার মান 0 কি না, সেটি পরীক্ষা করছি। পরীক্ষার ফলাফল সত্য হলে আমরা লুপ থেকে বের হয়ে যাচ্ছি। নইলে লুপের কাজ যথারীতি চলবে, অর্থাৎ print() ফাংশনের কাজ সম্পন্ন হবে, তারপর আবার লুপের ভেতরের প্রথম লাইন থেকে কাজ চলতে থাকবে।
ওপরের প্রোগ্রামটি কিন্তু ধনাত্মক ও ঋণাত্মক – দুই ধরণের সংখ্যার জন্যই কাজ করবে। এখন আমরা যদি চাই যে, কেবল ধনাত্মক সংখ্যার বর্গ দেখাবো, তাহলে প্রোগ্রামটি নিচের মতো করে পরিবর্তন করে নিতে পারি।
while True:
n = input("Please enter a positive number (0 to exit): ")
n = int(n)
if n < 0:
print("We only allow positive number. Please try again.")
continue
if n == 0:
break
print("Square of", n, "is", n*n)
এখানে n < 0 শর্তটি সত্যি হলে আমরা একটি বার্তা প্রিন্ট করে লুপটি আবার চালাবো। এজন্য continue ব্যবহার করা হয়েছে। প্রোগ্রামটি রান করে বিভিন্ন রকম ইনপুট দিলেই বিষয়টি পরিষ্কার হবে। যারা নিজেরা প্রোগ্রাম করে বিষয়টি পরীক্ষা-নিরীক্ষা করবে না, তাদের আসলে প্রোগ্রামিং শেখা হবে না।
এখন আমরা আরেকটি প্রোগ্রাম লিখবো। এটি লেখার উদ্দেশ্য হচ্ছে break ও continue-এর আরো একটি ব্যবহার দেখানো। প্রোগ্রামটির কাজ কী, সেটি কোড দেখে, নিজে প্রোগ্রাম লিখে রান করে ও সেই সঙ্গে চিন্তা করে পুরোপুরি বুঝতে পারা যাবে। কারো কারো কাছে প্রোগ্রামটি একটু জটিল মনে হতে পারে, তবে বইতে এখন পর্যন্ত যা দেখানো হয়েছে, প্রোগ্রামটি বুঝার জন্য সেই জ্ঞানই যথেষ্ট।
terminate_program = False
while not terminate_program:
number1 = input("Please enter a number: ")
number1 = int(number1)
number2 = input("Please enter another number: ")
number2 = int(number2)
while True:
operation = input("Please enter add/sub or quit to exit: ")
if operation == "quit":
terminate_program = True
break
if operation not in ["add", "sub"]:
print("Unknown operation!")
continue
if operation == "add":
print("Result is", number1 + number2)
break
if operation == "sub":
print("Result is", number1 - number2)
break
বিশেষ দ্রষ্টব্যঃ এই অধ্যায়টি পাইথন দিয়ে প্রোগ্রামিং শেখা বইয়ের ষষ্ঠ অধ্যায়। বইট সম্পর্কে আরো জানা যাবে নিচের ছবিতে ক্লিক করে –
Be First to Comment