Data Types (ডাটার প্রকার ভেদ)

ডাটা টাইপস কি?

প্রোগ্রামার হিসেবে আপনি আপনার নির্ধারিত ডাটাকে কিভাবে ব্যবহার করতে চান তা কম্পাইলার বা ইন্টারপ্রেটারকে বলে দেয়া যায় এবং কম্পাইলার বা ইন্টারপ্রেটার আপনার ঐ নির্ধারিত ডাটাতে আপনার নির্ধারিত শ্রেণীবিন্যাস অনুযায়ী অপারেশন চালানোর অনুমতি দেয়। এইযে আমরা শ্রেণীবিন্যাস এর কথা বললাম, ডাটা এর এই শ্রেণীবিন্যাস কেই ডাটা টাইপ বলা হয়।
পাইথন ডাটা টাইপস
মোটামুটি সব প্রোগ্রামিং ল্যাংগুয়েজ এর মত পাইথনেও ডাটা টাইপস নির্ধারন করা যায়। কিন্তু পাইথন এর ডাটা টাইপস নির্ধারনে বিস্তর ভিন্নতা রয়েছে। পাইথনে ডাটা টাইপস নির্ধারন করতে আলাদা করে টাইপটি লিখে দিতে হয় না, ভ্যারিয়েবেলে যে ধরনের ডাটা ইনপুট দেয়া হয় তার ডাটা টাইপ পাইথন নিজে নিজে নির্ধারন করে নেয়। পাইথনে ডাটা টাইপস এর এই ব্যপারটা অন্যান্য ল্যাংগুয়েজ থেকে আলাদা কারন, পাইথন সব কিছুকে অবজেক্ট হিসেবে নেয়, আর তাই, ডাটা টাইপস পাইথন এ ক্লাস এবং ভ্যারিয়েবেলকে উক্ত ক্লাস এর ইন্সটেন্স(ক্লাস এর একটি অব্জেক্ট) হিসেবে পরিগনিত করা হয়।
পাইথন এ কোন ভ্যারিয়েবেল এর ডাটা নির্ধারন করার সাথে সাথে তার ডাটা টাইপ নির্ধারন হয়ে যায়। যেমন-
x = "Hello Pythonista"
y = 20

যেহেতু x এর মান স্ট্রিং নির্ধারন করা হয়েছে তাই, পাইথন x এর টাইপ হিসেবে স্ট্রিং কে ধরে নিবে এবং y এর টাইপ হসেবে ইন্টিজার কে ধরে নিবে।

আমরা চাইলে কোন ভ্যারিয়েবেল এর ডাটা টাইপ জানতে পারি। কোন ভ্যারিয়েবেল এর ডাটা টাইপ জানতে type() ফাংশনটি ব্যবহার করতে হয়। এই ফাংশনটি অনেক কাজে আসে পাইথন এ অনেক লম্বা কোড লেখার সময়।
x = "Hello Pythonista"
type_of_x = type(x)
print(type_of_x)
Output: <class 'str'>
প্রধান কিছু পাইথন ডাটা টাইপস
* নিওমেরিক টাইপস
* স্ট্রিং টাইপস
* সিকুয়্যান্স টাইপস
* ম্যাপিং টাইপস
* সেট টাইপস
* বুলিয়ান টাইপস
* বাইনারি টাইপস
নিওমেরিক টাইপস
পাইথনে, নিওমেরিক ডেটা টাইপ সেই ডেটাকে নির্দেশ করে যার একটি সংখ্যাসূচক মান রয়েছে। এখন সংখ্যাসূচক ডাটা আবার অনেক রকমের হতে পারে। যেমন- ইন্টিজার(Integer) , ফ্লোটিং(Floating) নাম্বার, কমপ্লেক্স(Complex) নাম্বার ইত্যাদি
১। ইন্টিজারসঃ
ইন্টিজারস টাইপে ধনাত্মক এবং ঋণাত্মক সকল পূর্ণসংখ্যাকে নির্দেশ করে। যেমন : ১, ২, ২২, -১, -২, -১১ ইত্যাদি। পাইথনে এই পূর্ণসংখ্যা নির্ধারনে কোন লিমিট নেই।
x = 84
print(type(x))
Output: <class 'int'>
y = -84
print(type(y))
Output: <class 'int'>

২। ফ্লোটিং নাম্বারঃ

সাধারনত ভগ্নাংশ প্রকাশক ধনাত্নক বা ঋনাত্বক সংখ্যা গুলো ফ্লোট ডাটা দিয়ে নির্দেশ করা হয়। যেমন : -১.৭৮,  -৮.৩২৩,  ৭.০০, ৯.৯৮। একটি দশমিক বিন্দু দ্বারা সংখ্যা গুলোকে নির্দিষ্ট করা হয়।

x = 84.12
print(type(x))

## Output: <class 'float'>


y = -84.12
print(type(y))

## Output: <class 'float'>

৩। কমপ্লেক্স নাম্বারঃ

পাইথন জটিল সংখ্যা কেও ডাটা টাইপ হিসেবে নির্ধারন করতে সক্ষম । জটিল সংখ্যার গঠন সাধারনত (84+74j) এর মত হয়ে থাকে। পাইথন এমন গঠনের সংখ্যা কে জটিল সংখ্যা হিসেবে নির্ধারন করে যা অন্যান্য অনেক ল্যাংগুয়েজ পারে না।

x = 84+74j

print(type(x))

## Output: <class 'complex'>

 

স্ট্রিং টাইপস  স্ট্রিং ইউনিকোড অক্ষরের একটি ক্রম। একটি স্ট্রিং একটি উদ্ধৃতি চিহ্ন(”), ডবল উদ্ধৃতি(“”), বা ট্রিপল উদ্ধৃতি(”’ ”’) চিহ্ন দিয়ে আবদ্ধ থাকতে পারে। পাইথন স্ট্রিং প্রাকাশক এই তিনটি পাদ্ধতি কেই সমর্থন করে। যেমন-

string1 = "Hello pythonistas"
print(type(string1))


## Output: <class 'str'>


string2 = 'Hello pythonistas'
print(type(string2))


## Output: <class 'str'>


string3 = ''' Hello pythonistas '''
print(type(string3))


## Output: <class 'str'>
স্ট্রিং ডাটা টাইপস এ অনেক ধরনের অপারেশন্স করা যায়, তার মধ্যে স্ট্রিং কনক্যাটানেশন(concatenation), স্লাইশিং, রিপিট্যাশন ইত্যাদি অন্যতম। আমরা স্ট্রিং অপারেশন পার্টে এই অপারেশন গুলো নিয়ে বিস্তারিত দেখব।

সিকুয়্যান্স টাইপস


ক্রম জাতীয় ডাটা কে নির্ধারন করার জন্য সাধারনত সিকুয়্যান্স টাইপস ব্যবহার করা হয়। পাইথন এ ক্রম জাতীয় ডাটা সংরক্ষনের জন্য কয়েক ধরনের ডাটা স্ট্রাকচার বিদ্যমান রয়েছে। তারা হল-
– লিস্ট (List)

– টাপল (Tuple)

১। লিস্টঃ

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

# List with same type of data
list_example_1 = [1, 2, 3, 4, 5, 6]

# List example with different types of data
list_example_2 = [1,"Dhaka",['Mirpur', 1216]]

print(type(list_example_2))

## Output: <class 'list'>

উপরের ২য় উদাহারনটিতে আমরা দেখতে পাচ্ছি, লিস্ট নিজে অপর একটি লিস্ট কে তার মধ্যে রাখতে পারছে। একে লিস্ট নেস্টিং করা বলে।


২। টাপলঃ

অনেকটা লিস্ট এর মত একই রকম ক্রম ডাটা সংরক্ষণ এর উপযোগী পাইথন ডাটা স্ট্রাকচার হল টাপল(Tuple) । লিস্ট এর সাথে টাপল এর প্রধান পার্থক্য হল, লিস্ট কে যেমন ইচ্ছা মত পরিবর্তন করা যায়, টাপল কে তা করা যায় না। টাপল একবার ক্রিয়েট করার পর তা আর পরিবর্তনযোগ্য নয়।

টাপল এর এমন অপরিবর্তনীয়তার জন্য এটি লিস্ট থেকে ফাস্টার এবং সাধারনত প্রোটেক্টেড ক্রম ডাটা তৈরীতে ব্যবহার করা হয় কিন্তু এটি লিস্ট এর মত ডাইনামিক নয়।

# Tuple with same type of data
tuple_example_1 = (1, 2, 3, 4, 5, 6)

# Tuple with different types of data in it
tuple_example_2 = (1,"Dhaka",['Mirpur', 1216])
print(type(tuple_example_2))

## Output: <class 'tuple'>

ম্যাপিং টাইপসঃ


পাইথন যে ম্যাপিং টাইপ ব্যবহার করে তাকে বলা হয় ডিকশনারি। ডিকশনারি একটি আনঅর্ডারড ডাটা স্ট্রাকচার। তবে, পাইথন ৩.৬ থেকে ইনসার্টের অর্ডার ধরে রাখে । এটি ম্যাপ ডাটা স্ট্রাকচার এর মত কাজ করে। ক্রম তে একটি করে উপাদান রাখার পরিবর্তে এতে **কী** ও **ভ্যালু** জোড় রাখা হয়। এইভাবে ডাটা রাখার সুবিধা হল, এক ধরনের ডাটা কে অন্য ধরনের ডাটার সাথে ম্যাপ করা যায়।
dictionary_example = {"country" : "Bangladesh", "location" : "Mirpur", "temperature": 36}
print(type(dictionary_example))

## Output: <class 'dict'>

সেট টাইপসঃ

সেট এমন একটি ডাটা স্ট্রাকচার যাতে সাধারনত অনন্য(পুনরাবৃত্তি হয় না এমন) ডাটা রাখার জন্য ব্যবহার করা হয়। যেমন

set_example = {1, 2, 3, 4, "Dhaka"}
print(type(set_example))

## Output: <class 'set'>

সেট একটি আনঅর্ডারড লিস্ট, তাই ইনডেক্স দিয়ে সেটের মান নিরুপন এর চেষ্টা বৃথা যাবে।

set_example = {1, 2, 3, 4, "Dhaka"}
print(set_example[1])

## Output: TypeError: 'set' object is not subscriptable
সেটে একই ডাটা পুনরায় রাখা হলে, সেট পুনরাবৃত্ত ডাটা কে একবার নেয় এবং বাকি ডাটা গুলোকে নেয় না।
set_example = {1, 2, 3, 4, 4}
print('set result:', set_example)

#Output: set result: {1, 2, 3, 4}
সেটের মধ্যে ভিন্ন টাইপের কিন্তু একই মানের ডাটা রাখা যায়, এ থেকে আমরা বুঝি সেটে রাখা উপাদান গুলোর ডাটা টাইপ নিরুপনে সেট পারদর্শী।
set_example = {1, 2, 3, 4, '4'}
print('set result:', set_example)

#Output: set result: {1, 2, 3, 4, '4'}
ফ্রোজেন সেটঃ
যে সেটের উপাদান গুলো অপরিবর্তনযোগ্য সেই রকম সেট কে ফ্রোজেন সেট বলা হয়। যদিও একটি সেটের উপাদান যে কোনো সময় পরিবর্তন করা যেতে পারে, ফ্রোজেন সেটের উপাদানগুলো সৃষ্টির পরে একই থাকে।রেগুলার সেট ইন্সার্সনঃ
set_example = {1, 2, 3, 4}
set_example.add(5)
print('set result after one element add: ', set_example)

## Output: set result after one element add: {1, 2, 3, 4, 5}
ফ্রোজেন সেট ইন্সার্সনঃ
set_example = {1, 2, 3, 4}
frozen_set = frozenset(set_example)
frozen_set.add(5)
print('set result after one element add: ', frozen_set)

#Output: AttributeError: 'frozenset' object has no attribute 'add'

বুলিয়ান টাইপসঃ

বুলিয়ান ভ্যালু এর সাথে আমরা মোটামুটি সবাই পরিচিত। প্রোগ্রামিং এ কোন কিছুতে সত্য অথবা মিথ্যা এই ধরনের নির্দেশ প্রয়োগের ক্ষেত্রে সাধারনত বুলিয়ান ব্যবহার করা হয়। পাইথনেও বুলিয়ান এর ধারনাতে কোন ব্যতিক্রম নেই। True এবং False অথবা bool(শূন্য বাদে যে কোন সংখ্যা)->(True) এবং bool(শূন্য)->(False) দিয়ে বুলিয়ান টাইপ নির্দেশ করা যায়।


boolean_example_true = True
print(type(boolean_example_true))

## Output: <class 'bool'>
boolean_example_false = False
print(type(boolean_example_false))

## Output: <class 'bool'>
boolean_example_with_negative_number = bool(-84)
print(boolean_example_with_negative_number)

## Output: True
boolean_example_with_positive_number = bool(84)
print(boolean_example_with_positive_number)

## Output: True
boolean_example_with_zero = bool(0)
print(boolean_example_with_zero)

## Output: False

বাইনারি টাইপসঃ


byte এবং bytearrays ফাংশন দুটি পাইথন কে বাইনারি ডাটা ম্যানিপুলেশন এর অনুমুতি দেয়। এই দুটি ফাংশন memoryview নামের বাফার প্রোটোকল এর মাধ্যমে রান করে। memoryview অন্যান্য বাইনারি অব্জেক্ট এর মেমরি অ্যাক্সেস করতে পারে প্রকৃত ডাটা কে কপি না করে। byte অপরিবর্তনযোগ্য কিন্তু bytearrays আবার পরিবর্তনযোগ্য।
bytes_string_value = bytes(b'abc')
print(bytes_string_value)
print(bytes_string_value[1])

## Output:
## b'abc'
## 98
যেহেতু byte অপরিবর্তনযোগ্য তাই, এখন উপরের উদাহারনে যদি আমরা bytes_string_value এর মান পরিবর্তন করতে চাই তাহলে ইন্টারপ্রেটার ইরর জেনারেট করবে।
bytes_string_value = bytes(b'abc')
bytes_string_value[1] = 97
print(bytes_string_value)
print(bytes_string_value[1])

## Output: TypeError: 'bytes' object does not support item assignment
আবার আমরা এক্ষেত্রে bytearrays ব্যবহার করি তাহলে উপরুক্ত ইররটি জেনারেট হবে না এবং ডাটা পরিবর্তন করা যাবে।
bytes_string_value = bytearray(b'abc')
bytes_string_value[1] = 97
print(bytes_string_value)
print(bytes_string_value[1])

## Output:
## bytearray(b'aac')
## 97
স্পেসালঃ
যেহেতু পাইথন সব কিছুকে অব্জেক্ট হিসেবে নেয়, তাই পাইথন এর ক্লাস, মেথড সব কিছু পাইথন ক্লাস এর অব্জেক্ট। তাই, সব কিছুর টাইপ জানা সম্ভব। আমরা কোন ক্লাসের অবজেক্ট এর টাইপ যদি দেখি তাহলে দেখব, ঐ ক্লাস এর টাইপ হিসেবে ঐ ক্লাস এর নাম ই দেখাবে।
class RandomClass():
    def hello(self):
        pass


rm_class = RandomClass()

print(type(rm_class))


## Output: <class '__main__.RandomClass'>

 

আবার কোন ক্লাস এর মেথড গুলো পাইথন মেথড টাইপ এর অন্তর্ভুক্ত। যেমন-
class RandomClass():
    def hello(self):
        pass


rm_class = RandomClass()

print(type(rm_class.hello))

#Output: <class 'method'>

 

মোটামুটি পাইথনের সকল মৌলিক ডাটা টাইপস গুলো বিস্তারিত আলোচনা করা হল, এইখানে যে ডাটা স্ট্রাকচার গুলো মেনশন করা হয়েছে তা সামনে ডিটেইলস আলোচনা করার প্রত্যয় ব্যক্ত করে ডাটা টাইপস এর এই ব্লগটি এইখানেই শেষ করছি। কোন টপিকস এর আলোচনার শেষ নেই, তাই পাঠক দের প্রতি অনুরূধ থাকবে যেন আরো জানার চেষ্টা থেকে কখনো পিছপা না হতে।
***
What we would end create, creates the ground and You are the one to warm it. (*collected)
***
 
উদাহরন

Example 1:

string1 = "Hello pythonistas"
print(type(string1)) 

#<class 'str'>


string2 = 'Hello pythonistas'
print(type(string2)) 

#<class 'str'>


string3 = ''' Hello pythonistas '''
print(type(string3)) 

#<class 'str'>

 

Example 2:

# List with same type of data
list_example_1 = [1, 2, 3, 4, 5, 6]

# List example with different types of data
list_example_2 = [1,"Dhaka",['Mirpur', 1216]]

print(type(list_example_2)) 

#<class 'list'>

 

Example 3:

dictionary_example = {"country" : "Bangladesh", "location" : "Mirpur", "temperature": 36}
print(type(dictionary_example)) 

#<class 'dict'>

 

Example 4:

class RandomClass():
    def hello(self):
        pass
        
rm_class = RandomClass()
print(type(rm_class))

 #<class '__main__.RandomClass'>

 

Example 5:

bool= False
bool_1 = True

print(bool)
print(type(bool_1))

#False
#<class 'bool'>

 

 

 

এসো নিজে করি
  • একটা মোবাইল ক্লাস বানান , যেখানে আমরা কত মেগাপিক্সেল ক্যামেরা আছে , ডিসপ্লে সাইজ কত , র‍্যাম কত , রম কত , এই তথ্য গুলা আলাদা ভাবে জানতে পারবো এবং এর স্ট্রিং রিপ্রেজেন্টেশনে এর ব্রান্ড নেম এবং মডেল নেম সহ দেখাবে । যেমন ঃ Samsung – brand name ; S21 – model name -> তাহলে রিপ্রেজেন্টেশনে দেখাবে “Samsung S21”
  • একটি Student ক্লাস বানাবেন , যেখানে একটি মেথড থাকবে `total_student()` ; এখান থেকে মোট স্টুডেন্ট সংখ্যা দেখান।
  • একটি সাধারণ সেট বানিয়ে তাতে ডেটা ইন্সার্ট করেন ।
  • একটি ফ্রোজেন সেট বানিয়ে তাতে ডেটা ইন্সার্ট করতে চাইলে কি হয়।
  • একটি ডিকশনারি তৈরী করবেন যাতে স্ট্রিং টাইপ কী থাকবে এবং ভ্যালু ভিন্ন ভিন্ন ডেটা টাইপের হবে ।
ইন্টারভিউ প্রশ্নোত্তর
গুরুত্বপূর্ন প্রশ্নসমুহ
১। পাইথনে List এবং Tuple মধ্যে পার্থক্য কী?
২। পাইথনের লিস্ট এ insert অপারেশনের time complexity কত ?
৩। পাইথনের লিস্ট এ sort অপারেশনের time complexity কত ?
৪। পাইথনে set এর মধ্যে কি ডুপ্লিকেট ভ্যালু রাখা যায়?
৫। immutable কি? immutable ডাটা টাইপ কি কি?