# ফাংশন

### প্রোগ্রামিং ফাংশন কি ?

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

আচ্ছা, ফাংশন কি তা আগে জানি। ফাংশন হচ্ছে পুনরায় ব্যবহার যোগ্য কোড ব্লক। যা একটি নির্দিষ্ট কাজ করতে পারে। ফাংশন ভালো ভাবে জানলেই প্রোগ্রামিং এর একটা বিশাল অংশ শেখা শেষ হয়ে যায়। তা জানলেই নিজের ইচ্ছে মত কোড লেখা যায়।&#x20;

{% hint style="success" %} <mark style="color:blue;">ফাংশন ডিফাইন করার জন্য def কীওয়ার্ড ব্যবহার করা হয়।</mark>
{% endhint %}

## **পাইথনে বিভিন্ন প্রকারের ফাংশন রয়েছে:**

### **সাধারণ ফাংশন (**&#x55;ser-defined Functio&#x6E;**)**:

**(User-defined Function)**: এই ফাংশনগুলি একটি কাজ করে এবং তার ফলাফল রিটার্ন করে। এই ধরনের ফাংশনে প্যারামিটার পাস করা হয় এবং ফাংশন ব্যবহার করে অপর অংশে ব্যবহার করা হয়।

```python
def add(a, b):
    return a + b

result = add(5, 3)
print("যোগফল:", result)
```

### **ল্যাম্বডা ফাংশন (Lambda Function)**:

ল্যামডা ফাংশনকে এক কথায় বেনামী বা অজ্ঞাত ফাংশন বলা হয়। পূর্বের ফাংশন পর্বে আমরা দেখেছি যে ফাংশন ডিফাইন করার জন্য def কিওয়ার্ড ব্যবহার করতে হয়। কিন্তু ল্যামডা ফাংশনের জন্য এগুলোর প্রয়োজন নেই।

ল্যাম্বডার ব্যবহার খুব ফলপ্রসূ হয় যখন খুব সিম্পল যেমন এক লাইনের একটি ফাংশনকে আরেকটি ফাংশনের আর্গুমেন্ট হিসেবে পাঠানোর দরকার পরে। অর্থাৎ যখন সেই এক লাইনের কাজ করা ফাংশনকে আলাদা ভাবে `def` দিয়ে ডিফাইন/তৈরি করা অনর্থক মনে হয়।

***সিনটেক্সট***

প্রথমে lambda কিওয়ার্ড লিখে এর আর্গুমেন্ট গুলোকে লেখা হয় এবং একটি কোলন দেয়ার পর এই ল্যাম্বডা তথা ফাংশনের কর্মকাণ্ড লেখা হয়।&#x20;

```python
#এখানে lambda ফাংশন একটি আর্গুমেন্ট x নেয় এবং তার বর্গ রিটার্ন করে।
square = lambda x: x ** 2
num = 4
squared_num = square(num)
print("বর্গ:", squared_num)
```

**প্রতিটি লাইনের ব্যাখ্যা**

1. `square = lambda x: x ** 2`: এই লাইনে একটি ল্যাম্বডা ফাংশন ডিফাইন করা হয়, যার নাম `square`। এই ফাংশনে একটি আর্গুমেন্ট `x` নেয় এবং তার বর্গ ক্যালকুলেট করে `x ** 2` ফর্মুলার মাধ্যমে। ফাংশনটি ক্যালকুলেশন সম্পন্ন করে এবং সংজ্ঞায়িত নাম `square` দিয়ে রাখা হয়।
2. `num = 4`: এই লাইনে একটি ভেরিয়েবল `num` তৈরি করা হয় এবং এটির মান ৪ দিয়ে সেট করা হয়। এটি বর্গ ক্যালকুলেশনে ব্যবহার হবে।
3. `squared_num = square(num)`: এই লাইনে, `square()` ল্যাম্বডা ফাংশনটি কল করা হয়, যেখানে আর্গুমেন্ট হিসেবে `num` এর মান ৪ পাস করা হয়। ফাংশনটি ৪ এর বর্গ ক্যালকুলেট করে এবং সেটি রিটার্ন করে। এই রিটার্ন মানটি `squared_num` ভেরিয়েবলে সংরক্ষিত হয়।
4. `print("বর্গ:", squared_num)`: এই লাইনে `print()` ফাংশন ব্যবহার হয়, যেটি "বর্গ:" টেক্সট প্রিন্ট করে এবং `squared_num` ভেরিয়েবলে সংরক্ষিত বর্গ মান প্রিন্ট করে।

**এখানে উল্লেখ্য –**

* ল্যামডা ফাংশন শুধুমাত্র একটা স্টেটমেন্টের হবে।
* ল্যামডা ফাংশন যেকোন সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারে।

### **বিল্ট-ইন ফাংশন (Built-in Functions)**:

পাইথনে অনেকগুলি বিল্ট-ইন ফাংশন রয়েছে যা পাইথন ভাষার নিজস্ব অংশ। এগুলি ব্যবহার করে সাধারণ কাজ সহজে সম্পাদন করা যায়।

#### **প্রিন্ট ফাংশন (Built-in Function)**:

এটি সাধারণভাবে একটি ম্যাসেজ প্রিন্ট করতে ব্যবহৃত হয়।

```python
def greet(name):
    print("Hello,", name)

greet("Alice")
greet("Bob")
```

আরও অনেকটি  **Built-in Function** ফাংশন রয়েছে যেমন

* `len()`: একটি সিকোয়েন্সের দৈর্ঘ্য (উপাদানের সংখ্যা) নির্ণয় করে।
* `max()` এবং `min()`: একটি সিকোয়েন্সের সর্বোচ্চ এবং সর্বনিম্ন মান রিটার্ন করে।
* `sum()`: একটি সিকোয়েন্সের সব উপাদানগুলির যোগফল রিটার্ন করে।

### **রিকার্সিভ ফাংশন (Recursive Function)**:

এটি নিজেই নিজেকে আবার কল করতে থাকে। এটি ছোট কাজগুলি পরিস্থিতির অনুযায়ী বাড়ানোর জন্য ব্যবহৃত হয়।

<pre class="language-python"><code class="lang-python">def factorial(n):
#যদি n এর মান ০ হয় তাহলে ফ্যাক্টোরিয়াল গণনা হয়ে গেছে এবং ১ রিটার্ন করা হবে
    if n == 0:
        return 1
#যদি n এর মান ০ না হয়, তাহলে        
<strong>    else:
</strong>        return n * factorial(n - 1)

num = 5
fact = factorial(num)
print("Factorial of", num, "is", fact)
</code></pre>
