# ভ্যারিয়েবল

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

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

**অ্যাসাইনমেন্ট**

```
>>> x = 7
>>> print(x)
7
>>> print(x + 3)
10
>>> print(x)
7
```

উপরের উদাহরণে, প্রথমে একটি ভ্যারিয়েবল `x` এর মধ্যে `7` (একটি ইন্টিজার নাম্বার) কে জমা রাখা হয়েছে। এরপরের লাইনে `print()` ফাংশনের আর্গুমেন্ট হিসেবে সেই `x` কেই পাঠানো হয়েছে। আর আমরা আগেই জেনেছি যে, প্রিন্ট ফাংশনের আর্গুমেন্ট হিসেবে কিছু পাঠালে তা প্রিন্ট হয়। তাই, `x` তথা `7` নাম্বারটি স্ক্রিনে প্রিন্ট হয়েছে। একই রকম কাজ করা হয়েছে `print(x + 3)` লাইনে। এখানে মূলত `print(7 + 3)` এই স্টেটমেন্টটি এক্সিকিউট হয়েছে, কারন `x` এর মান তো `7`. আর তার সাথে `3` যোগ হয়ে `10` নাম্বারটিই প্রিন্ট ফাংশনের আর্গুমেন্ট হিসেবে পাঠানো হয়েছে যা স্ক্রিনে প্রিন্ট হয়েছে।

> শেষের প্রিন্ট স্টেটমেন্টও আমরা `x` এর মান তথা `7` কে প্রিন্ট করতে পেরেছি ভ্যারিয়েবলের নাম দিয়েই। তাই বলা যায়, একটি ভ্যারিয়েবল গোটা প্রোগ্রাম জুড়ে এর মান স্টোর করে রাখে।

**রি-অ্যাসাইনমেন্ট**\
এবার আমরা নিচের উদাহরণটি দেখি,

```python
>>> x = 10.5
>>> print(x)
10.5
>>> x = "Hello There"
>>> print(x)
Hello There
```

এখানে প্রথমে `x` এর মান হিসেবে একটি ফ্লট জমা রাখা হয়েছে এবং সাধারণ ভাবেই প্রিন্ট করে তার ভ্যালু পাওয়া গেছে। কিন্তু পরের লাইনে সেই একই `x` এর মধ্যে একটি স্ট্রিং জমা রাখা হয়েছে এবং সেটিকেও পরবর্তী প্রিন্ট ফাংশনের মাধ্যমে অ্যাক্সেস করে স্ক্রিনে প্রিন্ট করা গেছে। একে ভ্যালু রি-অ্যাসাইনমেন্ট বলা হয়। অর্থাৎ, একটি ভ্যারিয়েবলের মধ্যে একাধিক বার নতুন নতুন ভ্যালু জমা রাখা যায় এবং সর্বশেষ স্টোর করা ভ্যালুটিই ওই ভ্যারিয়েবলের মধ্যে জমা থাকে (আগের ভ্যালুটি মুছে যায়)।

> পাইথনে ভ্যারিয়েবলের কোন নির্দিষ্ট ডাটা টাইপ নেই। তাই একই ভ্যারিয়েবলে প্রথমে একটি নাম্বার এবং পরবর্তীতে সেটাতে একটি স্ট্রিং জমা রাখা গেছে।

খেয়াল রাখতে হবে যে, আমরা প্রথমবার যখন কোনো একটা ভ্যারিয়েবলে কোনো ভ্যালু এসাইন করি তখন সেই ভ্যারিয়েবলটা initialize হয়। পরবর্তীতে আমরা ঐ ভ্যারিয়েবলটাতেই আবার বিভিন্ন ভ্যালু রেখে কাজ করতে পারবো। কিন্তু যদি আমরা ভ্যালু এসাইন করে initialize করিনি এই রকম কোনো ভ্যারিয়েবল নিয়ে কাজ করার চেষ্টা করি তাহলে এরর দিবে।

```python
>>> variable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable' is not defined
```

**নামকরণ এর নিয়ম**\
পাইথনে ভ্যারিয়েবল লেখার সময় কিছু নিয়ম মেনে ভ্যারিয়েবল ডিফাইন করা হয়।

* ভ্যারিয়েবলের নাম অবশ্যই এক শব্দের হতে হবে। অর্থাৎ এরকম ভাবে ভ্যারিয়েবল লেখা যাবে নাঃ

  `my variable = 10`
* প্রথম অক্ষর অবশ্যই একটি alphabetic letter(uppercase or lowercase) অথবা underscore ( `_` ) হতে হবে । যেমনঃ `nafis`, `a`, `b`, `_variable` লেখা যাবে ভ্যারিয়েবল হিসেবে কিন্তু `1name`, `@nafis`, `7a`, `%b` এই ভাবে লেখা যাবে না । প্রথম অক্ষর ছাড়া পরে letter, underscore, number ব্যবহার করা যাবে। যেমনঃ `variable1`, `my_variable`, `not_Very_Good_Name10`

  যদিও ভ্যারিয়েবলের শুরুতে underscore ব্যবহার করা যায়, কিন্তু পাইথনের কনভেনশন হচ্ছে ভ্যারিয়েবলের নাম সবসময় lowercase letter দিয়ে শুরু করা।
* পাইথন Case Sensitive অর্থাৎ `a = 4` এবং `A = 4` একই ভ্যারিয়েবল না।
* পাইথনের কিছু reserved কী-ওয়ার্ড আছে, এগুলো ব্যবহার করা যাবে না । যেমনঃ `if`, `else`, `elif`, `for`, `while`, `break`, `continue`, `except`, `as`, `in`, `is`, `True`, `False`, `yield`, `None`, `def`, `del`, `class` ইত্যাদি।

উদাহরণ,

```python
>>> this_is_a_normal_name = 7

>>> 123abc = 7
SyntaxError: invalid syntax

>>> spaces are not allowed
SyntaxError: invalid syntax
```

**রিভিউ**\
আমরা আগের চ্যাপ্টারে ইনপুট, আউটপুট ফাংশন এর ব্যবহার দেখেছি। এই চ্যাপ্টারে দেখলাম ভ্যারিয়েবল। নিচের উদাহরণে আমরা দেখবো কিভাবে সেই ফাংশন ব্যবহার করে এবং একটি ভ্যারিয়েবল ব্যবহার করে ইউজার এর ইনপুট মেমোরিতে জমা রাখা যায় এবং পরবর্তীতে ব্যবহার করা যায়,

```python
>>> user_input = input("Enter your birth year: ")
Enter your birth year: 1987
>>> age = 2016 - int(user_input)
>>> print("You are " + str(age) + " years old!")
You are 29 years old!
```

এখানে ইনপুট ফাংশন, ভ্যারিয়েবল, ব্যাসিক অপারেশন, টাইপ কনভার্সন এবং আউটপুট ফাংশনের ব্যবহার করা হয়েছে। খুব সহজ মনে হচ্ছে, তাই নয় কি?

পাইথন যখনই `input()` ফাংশন এক্সিকিউট করছে তখন সে স্ক্রিনে ম্যাসেজটি প্রিন্ট করে ইউজারের ইনপুটের জন্য অপেক্ষা করছে। ইউজার ইনপুট দিলে তথা এন্টার চাপলে তার দেয়া ইনপুটটি `user_input` ভ্যারিয়েবলে জমা থাকছে। এরপর আমরা `2016` থেকে সেই ভ্যালুকে বিয়োগ করার সময় `int()` ফাংশন ব্যবহার করে `user_input` এর ভ্যালুকে ইন্টিজার নাম্বারে কনভার্ট করে নিয়েছি (কারণ আমরা জানি ইউজার ইনপুট স্ট্রিং হিসেবে জমা থাকে অন্যদিকে একটি নাম্বার থেকে একটি স্ট্রিং এর বিয়োগ সম্ভব না)। বিয়োগের ফল `age` ভ্যারিয়েবলে জমা রাখছি। এরপর `print()` ফাংশনের মধ্যে আমরা প্রথমে `age` কে স্ট্রিং -এ কনভার্ট করেছি এবং অন্য দুটি স্ট্রিং এর সাথে কনক্যাটেনেশন (যোগ) করেছি।


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://python.howtocode.dev/basic-concept/variable.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
