ফাংশন

আমরা আগেই জেনেছি যে, ফাংশন হল মেশিনের মত, যেমন - ধান ভাঙার মেশিন। ধান ভাঙার মেশিনে আমরা যদি ধান দিই তাহলে তা চাল হয়ে বেরিয়ে আসে। এখানে বিবেচনা করার মত কয়েকটা জিনিস আছে। এই যে 'ধান ভাঙার মেশিন' এটা কিন্তু ফাংশনের নাম। আমরা যে ধান দিতেছি মেশিনে এটা হল প্যারামিটার (Parameter) আর মেশিন আমাদের যে চাল দিচ্ছে সেটা হল ফাংশনের রিটার্ন (return) করা জিনিস।

এবার একটা রুটি বানানোর মেশিনের কথা ধরা যাক। আমরা এই মেশিনে পানি, আটা দিলে মেশিনটা আমাদের রুটি বানিয়ে দেয়। এই মেশিনে প্যারামিটার কিন্তু দুইটা - পানি আর আটা। কিন্তু রিটার্ন করতেছে কেবল রুটি। আসলে ফাংশন একটার বেশি রিটার্ন করতে পারে না।

পাইথনে ফাংশন হল অর্গানাইজড (organized) ও রিইউজ্যাবল (reusable) কোডের একটা ব্লক যা নির্দিষ্ট কোন কাজ সম্পাদন করে। ফাংশনের ভিতর আমরা হয়ত অনেক কাজই করব কিন্তু একটার বেশি ডাটা রিটার্ন করতে পারব না বলে ফাংশনটি একটিমাত্র কাজ সম্পাদন করছে বলে ধরব আমরা। যাহোক, ফাংশনকে আমরা দুইভাবে ভাগ করতে পারি: বিল্ট-ইন (built-in) ফাংশন আর ইউজার-ডিফাইন্ড (user-defined) ফাংশন। এতক্ষণ আমরা যেসব ফাংশন ব্যবহার করেছি যেমন: print(), input(), pop() এগুলো সবই হল বিল্ট-ইন ফাংশন। পাইথনের সাথে রেডিমেড পাওয়া যায় বলে আমরা এগুলোকে বিল্ট-ইন ফাংশন বলি।

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

ফাংশন তৈরি ও কল করা

পাইথনে ফাংশন তৈরির বা লেখার নির্দিষ্ট নিয়ম কানুন আছে।

  • ফাংশন ব্লক def কী-ওয়ার্ড দিয়ে শুরু হবে। def এর পর একটা স্পেস দিয়ে ফাংশনের নাম থাকবে। ফাংশনের নাম ভ্যারিয়েবলের নামের মতই হতে পারে। তবে ফাংশনের নাম আন্ডারস্কোর _ দিয়ে শুরু করা যায়।

  • ফাংশনের নামের পর ১ম ব্রাকেট () থাকবে। ব্রাকেটের ভিতর এক বা একাধিক প্যারামিটার (parameter) বা আর্গুমেন্ট (argument) কমা দিয়ে সেপারেট করা থাকবে। ব্রাকেটের পর কোলন : চিহ্ন থাকবে।

  • ফাংশনের সব স্টেটমেন্ট ইনডেন্টেড থাকবে। প্রথম স্টেটমেন্টে স্রেফ একটা কমেন্ট থাকলে ভাল হয়। এই কমেন্টে ফাংশনের একটা সংক্ষিপ্ত পরিচয় থাকবে। তবে এটা বাধ্যতামূলক নয়।

  • ফাংশন শেষ হবে return কী-ওয়ার্ড দিয়ে। কোন ডাটা রিটার্ন করার ক্ষেত্রে তার কী-ওয়ার্ডের পর একটা স্পেস দিয়ে থাকবে।

def dhan_katar_machine(dhan):
    # Eta ekta dhan katar machine
    .............................
    .............................
    return chal

এখানে আমরা আমাদের ধান কাটার মেশিনটাকে ফাংশন হিসাবে লিখলাম। এটা একটা রূপক উদাহরণ ছিল। আমরা একটা বাস্তবধর্মী উদাহরণ দেখি। এমন একটা ফাংশন লিখব যেটা কোন নামকে (myname) প্যারামিটার হিসাবে নেবে আর সেটাকে 'The given name is myname' এভাবে প্রিন্ট করবে।

def print_my_name(myname):
    # This will print the given name
    print('The given name is', myname)
    return

উপরের প্রোগ্রামটাকে রান করালে কিন্তু কোন আউটপুটই আমরা পাব না। এর কারণ হল আমরা ফাংশনটাকে ডিফাইন করেছি ঠিকই কিন্তু একে ডাকতে বা কল করতে ভুলে গেছি। কোন ফাংশনকে কল না করলে তার ভিতরের কোড এক্সিকিউট হয় না। এই ফাংশনটাকে কল করার জন্য ফাংশনটার নাম লিখে ব্রাকেটের ভিতর প্যারামিটারের জায়গায় ভ্যালু দিতে হবে। প্যারামিটারের জায়গায় যে ভ্যালু আমরা দেব তাই ঐ প্যারামিটারের ভ্যালু হিসাবে গণ্য হবে।

def print_my_name(myname):
    # This will print the given name
    print('The given name is', myname)
    return
print_my_name('Maateen')

আউটপুট

The given name is Maateen

প্যারামিটারের জায়গায় ভ্যালু না দিয়ে আমরা চাইলে কোন ভ্যারিয়েবলও (রেফারেন্স) দিতে পারি। সেক্ষেত্রে ঐ ভ্যারিয়েবলটা আগেই ডিক্লেয়ার করে নিতে হবে।

def print_my_name(myname):
    # This will print the given name
    print('The given name is', myname)
    return

name = 'Maateen'

print_my_name(name)

আউটপুট

The given name is Maateen

একটা জিনিস খেয়াল করেছি আমরা? return কী-ওয়ার্ডের পরে আমরা কিন্তু কোন ভ্যারিয়েবল বা ভ্যালু দিই নাই। এক্ষেত্রে ফাংশন None রিটার্ন করবে। আসলে শুধু return আর return None একই কথা।

এবার আমরা একটা ক্যালকুলেটর তৈরির কথা চিন্তা করি। আমাদের এই ক্যালকুলেটর দিয়ে তিনটা সংখ্যা যোগ করা যাবে। তো সেজন্য আমরা একটা ফাংশন লিখব। এই ফাংশন তিনটা সংখ্যা নেবে প্যারামিটার হিসাবে। আর তাদের যোগফল রিটার্ন করবে।

def add(a, b, c):
    return a+b+c
temp = add(1, 2, 3)
print(temp)

আউটপুট

6

এই উদাহরণে আমাদের বোঝার মত অনেক কিছু আছে। তিন নাম্বার লাইনটা খেয়াল করি সবাই। add() ফাংশনটাকে কল করেছি আমরা। ফাংশনের ভিতর প্যারামিটারের ভ্যালু হিসাবে 1, 2, 3 দিয়েছি। যেহেতু প্যারামিটার পজিশনাল, তাই আমাদেরকে প্যারামিটারের ভ্যালুগুলো পজিশনাললি দিতে হবে। মানে প্যারামিটার যেটার পর যেটা আছে, ভ্যালুও সেটার পর সেটা দিতে হবে। আমাদের প্যরাামিটার ছিল a, b, c এইভাবে। তাই আমরা 1, 2, 3 এভাবে ভ্যালু পাস করায় a এর মান 1, b এর মান 2 আর c এর মান হবে 3। তারপর add() ফাংশনটা যা রিটার্ন করবে তা temp ভ্যারিয়েবলে স্টোর হবে।

ফাংশন প্যারামিটার বা আর্গুমেন্ট

ফাংশনে এই যে প্যারামিটার বা আর্গুমেন্ট আমরা ব্যবহার করতেছি এদেরকে মোটামুটি চারভাগে ভাগ করতে পারি।

  • রিকয়ার্ড আর্গুমেন্ট (Required argument)

  • কী-ওয়ার্ড আর্গুমেন্ট (Keyword argument)

  • ডিফল্ট আর্গুমেন্ট (Default argument)

  • ভ্যারিয়েবল লেংথ আর্গুমেন্ট (Variable-length argument)

চলুন এদের সম্পর্কে আরেকটু বিস্তারিত জানা যাক।

রিকয়ার্ড আর্গুমেন্ট (Required argument)

একটা উদাহরণ দেখা যাক আগে।

def add(a, b, c):
    return a+b+c
temp = add(1, 2)
print(temp)

আউটপুট

Traceback (most recent call last):
  File "/home/ugcoder/Desktop/test.py", line 3, in <module>
    temp = add(1, 2)
TypeError: add() missing 1 required positional argument: 'c'

আউটপুটটা খেয়াল করি সবাই। পাইথন TypeError থ্রো করেছে - একটা রিকয়ার্ড পজিশনাল আর্গুমেন্ট মিসিং। আমাদের ফাংশনটার আসলে তিনটা প্যারামিটার নিয়ে কাজ করার কথা। কিন্তু আমরা দিয়েছি দুইটা, তাই তৃতীয়টা ছাড়া ফাংশনটা কাজ করছে না। এক্ষেত্রে তৃতীয়টা হল ফাংশনটার রিকয়ার্ড আর্গুমেন্ট।

কী-ওয়ার্ড আর্গুমেন্ট (Keyword argument)

একটা উদাহরণ দেখা যাক।

def add(a, b, c):
    return a+b+c
temp = add(b=2, c=3, a=1)
print(temp)

আউটপুট

6

এবার আমরা ফাংশনে ভ্যালু পাস করেছি এভাবে: b=2, c=3, a=1। পজিশনাললি নয়, বরং কোনটার মান কত হবে তা সরাসরি বলে দিয়েছি। এভাবে কী-ওয়ার্ড আর্গুমেন্ট ব্যবহার করার একটা সুবিধা রয়েছে, বিশেষ করে অনেকগুলো আর্গুমেন্ট ব্যবহার করার সময়, আর্গুমেন্টের ধারাবাহিকতা রক্ষা করার দরকার পড়ে না।

ডিফল্ট আর্গুমেন্ট (Default argument)

একটা উদাহরণ দেখা যাক।

def add(a, b, c=3):
    return a+b+c
temp = add(1, 2)
print(temp)

আউটপুট

6

তিন নাম্বার লাইনটা বিবেচনা করা যাক। আমরা কিন্তু প্যারামিটার হিসাবে এবার দুইটা ভ্যালু পাস করেছি। অথচ ফাংশনটা তিনটা প্যারামিটার নেয়। তারপরও কোন এরর থ্রো করে নাই। কারণ হল, আমরা c এর ভ্যালু ডিফল্টভাবে 3 দিয়ে দিয়েছি। এতে যদি c এর জন্য কোন ভ্যালু পাস করা না হয় তবে ডিফল্ট ভ্যালু 3 নিয়েই ফাংশন কাজ করবে। আর যদি কোন ভ্যালু পাস করা হয় তবে ঐ ভ্যালুটা নিয়ে ফাংশন কাজ করবে। আরেকটা উদাহরণ দিলেই ব্যাপারটা পরিষ্কার হয়ে যাবে।

def add(a, b, c=3):
    return a+b+c
temp = add(1, 2, 22)
print(temp)

আউটপুট

25

c এর মান 22 দেয়াতে নতুন একটা আউটপুট পাওয়া গেল।

ভ্যারিয়েবল লেংথ আর্গুমেন্ট (Variable-length argument)

আমরা যে add() ফাংশনটা লিখলাম সেটাতে কিন্তু একটা ভয়ানক দোষ আছে। আমরা তিনটা মাত্র প্যারামিটার দিয়েছি। ফলে মাত্র তিনটা সংখ্যা যোগ করতে পারব। কিন্তু আমাদের ইউজার ঠিক কয়টা সংখ্যা দেবে তা কি আমরা জানি? জানিনা। তাই আমাদের উচিত এমন একটা ফাংশন লেখা যেটা যেকোন সংখ্যক আর্গুমেন্ট নিয়ে সবগুলোর যোগফল রিটার্ন করবে।

def add(*args):
    print(type(args))
    tmp = 0
    for number in args:
        tmp = tmp + number
    return tmp
temp = add(1, 2, 22, 12, 17, 21, 98)
print(temp)

আউটপুট

<class 'tuple'>
173

ফাংশনের যেকোন প্যারামিটারের আগে একটা অ্যাসটেরিস্ক * চিহ্ন দিলে সেটা আনলিমিটেড ভ্যালু হোল্ড করতে পারে। জেনে রাখা ভাল, এই প্যারামিটারটা একটা টাপল তৈরি করে সবগুলো ভ্যালু হোল্ড করে। পরে একটা for লুপ চালিয়ে আমরা সবগুলো ভ্যালু অ্যাক্সেস করতে পারি। এটাকে নন-কীওয়ার্ডেড (non-keyworded) ভ্যারিয়েবল লেংথ আর্গুমেন্ট বলা হয়।

যদি আমরা কী-ওয়ার্ড আর্গুমেন্ট পাস করতে চাইতাম? তখন প্যারামিটারের আগে দুইটা অ্যাসটেরিস্ক * চিহ্ন দিতে হত। এটাকে কীওয়ার্ডেড (keyworded) ভ্যারিয়েবল লেংথ আর্গুমেন্ট বলা হয়। এই প্যারামিটারটা একটা ডিকশনারি তৈরি করে সবগুলো ভ্যালু হোল্ড করে। যেমন:

def add(**kwargs):
    print(type(kwargs))
    tmp = 0
    for key in kwargs:
        tmp = tmp + kwargs[key]
    return tmp
temp = add(a=1, b=2, c=3, d=4)
print(temp)

আউটপুট

<class 'dict'>
10

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

রিকার্সন (Recursion)

রিকার্সন একটা মজার জিনিস। যখন কোন ফাংশন নিজেই নিজেকে ডাকে তখন আমরা তাকে রিকার্সন বলি। আর ঐ ফাংশনটাকে বলি রিকার্সিভ (Recursive) ফাংশন। নিজেকে নিজে ডাকে মানে হল নিজের ভিতরেই আবার নিজেকে কল করবে। একটা সিম্পল উদাহরণ দেখা যাক।

def counter(num):
    print(num)
    num += 1
    counter(num)

counter(1)

এখানে counter() ফাংশন প্যারামিটার হিসাবে 1 নিয়েছে। তারপর 1 কে প্রিন্ট করে এর মান 1 বাড়িয়ে দেয়। তারপর নিজেই নিজেকে কল করে আর এইবার প্যরাামিটার হিসাবে বাড়ানো সংখ্যাটা মানে 2 পাস করা হয়। ফলাফল কি হবে? ফাংশনটা আবার এক্সিকিউট হওয়া শুরু করবে। আর এবার সে 2 প্রিন্ট করবে। তারপর 2 এর মান 1 বাড়িয়ে 3 করবে। শেষমেষ আবার নিজেকে কল করবে ওর 3 পাস করবে প্যারামিটার হিসাবে। এভাবে কিন্তু চলতেই থাকবে। আমরা এই জিনিসটাকেই বলছি রিকার্সন।

একটু আগে রিকার্সনের একটা বাকওয়াশ উদাহরণ দেখেছি আমরা। এবার আমরা একটা কাজের উদাহরণ দেখব। তবে তার আগে জানব ফ্যাক্টোরিয়াল (Factorial) সম্পর্কে।

ফ্যাক্টোরিয়াল একটা গাণিতিক টার্ম বা ফাংশন। সহজ ভাষায়, ফ্যাক্টোরিয়াল হল এমন একটি ফাংশন যা একটি সংখ্যাকে এর নিচের সবগুলো সংখ্যা (১ পর্যন্ত) দিয়ে গুণ করে। আর কোন সংখ্যার ফ্যাক্টোরিয়াল বোঝানোর জন্য ! চিহ্ন ব্যবহার করা হয়। যেমন: 5! মানে হল 5 এর ফ্যাক্টোরিয়াল বা 5_4_3_2_1=120। তবে 0! এর মান সবসময় 1 হবে, মুখস্থবিদ্যা। মোটামুটি বোঝা গেছে নাকি! তাহলে এবার আমরা ফ্যাক্টোরিয়াল বের করার জন্য একটা প্রোগ্রাম লিখব।

print('Please input your number:')
number = int(input())
temp = number

while number > 1:
    number -= 1
    temp = temp*number

if temp == 0:
    print(1)
else:
    print(temp)

আউটপুট

0
1
5
120

একটা লুপ ব্যবহার করে আমরা রিকার্সন বের করার প্রোগ্রাম লিখলাম। সিম্পল লজিক ব্যবহার করেছি। লুপ ঘুরিয়ে ঘুরিয়ে আর মান কমিয়ে কমিয়ে গুণ করেছি। একেবারে বিশুদ্ধ বাংলা গুণ। আর এই একই কাজ এবার করব রিকার্সিভ ফাংশন ব্যবহার করে।

def factorial(number):
    if number == 0:
        return 1
    else:
        return number * factorial(number - 1)

print('Please input your number:')
number = int(input())
print(factorial(number))

আউটপুট

0
1
5
120

কাজ কিন্তু একই হল। এখানে factorial() হল রিকার্সিভ ফাংশন। কারণ এর রিটার্ন অংশে গিয়ে আমরা আবার একেই কল করেছি। তবে আগের চেয়ে কাজটা কিন্তু সহজ আর সুন্দর হয়েছে অনেক।

এক লাইনের ফাংশন - ল্যাম্বডা (lambda)

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

sum = lambda a, b : a + b
print(sum(10, 20))
print((lambda a, b : a + b)(10, 20))

আউটপুট

30
30

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

def my_function(func, arg1, arg2):
    return func(arg1, arg2)

print(my_function(lambda a, b : a + b, 10, 20))

আউটপুট

30

এখানে my_function() আর্গুমেন্ট হিসাবে একটা ফাংশন আর দুইটা ভ্যালু নিয়েছে। ফাংশন হিসাবে আমরা একটা ল্যাম্বডা ফাংশন এবং ভ্যালু হিসাবে 10, 20 কে পাস করেছি। আর তারপর my_function() ল্যাম্বডা ফাংশনকেই রিটার্ন করেছে। ভ্যালু দুইটাকে ল্যাম্বডা ফাংশনের আর্গুমেন্ট হিসাবে কাজে লাগানো হয়েছে।

map()

map() একটা বিল্ট-ইন ফাংশন। কিন্তু ফাংশন (বিল্ট-ইন বা ইউজার ডিফাইন্ড) অ্যাপ্লাই করার ক্ষেত্রে এর ব্যবহার ব্যাপক। ম্যাপ কাজ করার জন্য দুইটা আর্গুমেন্ট নেয় - প্রথমটা হল ফাংশন আর দ্বিতীয়টা হল ইটারেটর অবজেক্ট। এর কাজ হল ইটারেটর অবজেক্টের প্রতিটা আইটেমের উপর আর্গুমেন্ট হিসাবে নেয়া ফাংশনটাকে অ্যাপ্লাই করবে। কি বুঝতে পারলাম না? একটা উদাহরণ দেখা যাক।

my_list = [2, 3, 4, 5, 6, 7]

def square(x):
    return x * x

new_list = map(square, my_list)
print(new_list)
print(list(new_list))

আউটপুট

<map object at 0x7f37c8e7df28>
[4, 9, 16, 25, 36, 49]

এখানে my_list লিস্টের প্রতিটা আইটেমের উপর square() ফাংশনটা অ্যাপ্লাই করা হয়েছে। new_list লিস্টের ভিতর একটা ম্যাপ অবজেক্ট স্টোর হয়েছে। পরে আমরা এটাকে লিস্ট হিসাবে কাস্ট করে প্রিন্ট করে দেখেছি।

এ তো একটা ইউজার ডিফাইন্ড ফাংশনকে অ্যাপ্লাই করলাম। এবার আমরা একটু বিল্ট-ইন ফাংশন নিয়ে খেলব।

>>> a, b = map(int, input().split())
10 20
>>> type(a)
<class 'int'>
>>> type(b)
<class 'int'>
>>> a + b
30

আগের ব্যাখ্যাটা বুঝে থাকলে এই প্রোগ্রামটা বোঝা উচিত সবার।

filter()

অনেকটা ম্যাপ ফাংশনের মতই। তবে এর কাজ হল ফিল্টারিং করা। সত্য-মিথ্যার উপর ভিত্তি করে ফিল্টারিং করে। ফিল্টার কাজ করার জন্য দুইটা আর্গুমেন্ট নেয় - প্রথমটা হল ফাংশন আর দ্বিতীয়টা হল ইটারেটর অবজেক্ট। এর কাজ হল ইটারেটর অবজেক্টের প্রতিটা আইটেমের উপর আর্গুমেন্ট হিসাবে নেয়া ফাংশনটাকে অ্যাপ্লাই করবে। আর যে আইটেমের কারণে ফাংশন False রিটার্ন করবে সেটাই ইটারেটর অবজেক্ট থেকে বাদ। কি বুঝতে পারলাম না? একটা উদাহরণ দেখা যাক।

my_list = [2, 3, 4, 5, 6, 7]

def is_even(x):
    if (x % 2) == 0:
        return True
    else:
        return False

new_list = filter(is_even, my_list)
print(new_list)
print(list(new_list))

আউটপুট

<filter object at 0x7f5d35eecef0>
[2, 4, 6]

এখানে my_list লিস্টের প্রতিটা আইটেমের উপর is_even() ফাংশনটা অ্যাপ্লাই করা হয়েছে। new_list লিস্টের ভিতর একটা ম্যাপ অবজেক্ট স্টোর হয়েছে। পরে আমরা এটাকে লিস্ট হিসাবে কাস্ট করে প্রিন্ট করে দেখেছি। কি দেখলাম? দেখলাম যেগুলো জোড় সংখ্যা শুধু সেগুলোই আছে এখন লিস্টে। বাকিগুলো ফিল্টার হয়ে বিদায় নিয়েছে।

এই ছিল ফাংশন নিয়ে আমাদের আলোচনা। তবে শুধু আলোচনাতে সীমাবদ্ধ থাকলেই চলবে না। চর্চা করে ফাংশনকে মনের ভিতর গেঁথে নিতে হবে।

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

সহজ ভাষায় পাইথন ৩

বইটি পড়ার সময় প্রতিটি টপিক ধারাবাহিকভাবে বুঝে বুঝে পড়তে হবে এবং হাতে-কলমে অনুশীলন করতে হবে। কোন অংশ বুঝতে সমস্যা হলে ফেসবুক গ্রুপ পাইথন বাংলাদেশে সমস্যাটি পোস্ট করতে পারেন। এখান থেকে অতি দ্রুত সাহায্য-সহযোগীতা পাবেন আপনি।

results matching ""

    No results matching ""