درس آموزشی درس ۲ از ۵

انواع داده در پایتون

از عدد و متن تا لیست و دیکشنری؛ ببین هر نوع داده در پایتون چه کاربردی داره، چطور نوعش رو تشخیص بدی و کجا باید تبدیلش کنی.

مقدماتی ۲۵ دقیقه مطالعه بروزرسانی ۲۳ مهر ۱۴۰۵
فهرست این درس

ببین، وقتی تازه یادگیری پایتون رو شروع می‌کنی، خیلی زود به اسم‌هایی مثل int، str، list و dict می‌رسی. شاید اولش فکر کنی انواع داده در پایتون فقط چندتا اسم برای حفظ کردنن، اما ماجرا خیلی مهم‌تره: نوع داده تعیین می‌کنه یک مقدار چه رفتاری داشته باشه و چه عملیات‌هایی روش معنی بده. همین مثال دوخطی رو ببین:

print(10 + 5)
print("10" + "5")

خروجی :

15
105

اینجا با اینکه توی هر دو خط علامت + داریم، نتیجه یکسان نیست. دو عدد از نوع int با هم جمع می‌شن، ولی دو رشته از نوع str به هم وصل می‌شن. این تفاوت مهم‌ترین دلیله که باید نوع داده در پایتون رو از همون ابتدا درست بفهمیم. حالا یک حالت سوم رو امتحان کن:

print("10" + 5)

اینجا با TypeError روبه‌رو می‌شی؛ چون "10" رشته‌ست و 5 عدد. پایتون قرار نیست خودش حدس بزنه قصدت جمع عددیه یا چسباندن متن. برای اینکه این اختلاف‌ها رو راحت‌تر بفهمی، اول این مسیر رو به خاطر بسپر:

Object
↓
Type
↓
Behavior

یعنی نوع یک Object روی رفتار اون اثر می‌ذاره. وقتی این نکته رو درست بفهمی، Data Typeها دیگه یه جدول برای حفظ کردن نیستن؛ تبدیل میشن به یکی از پایه‌های اصلی فهم Python.

انواع داده در پایتون

نوع داده در پایتون دقیقاً چیه و چرا مهمه؟

ببین، نوع داده در پایتون یا Data Type مشخص می‌کنه یک Object چه رفتاری داره و چه کارهایی می‌تونی باهاش انجام بدی. مثلاً عدد رو می‌تونی جمع بزنی، با رشته می‌تونی متن بسازی و توی لیست چند مقدار رو کنار هم نگه داری. این پنج نمونه رو کنار هم ببین:

25
3.14
"Python"
True
[10, 20, 30]

از دید ما همه این‌ها «داده» هستن، ولی Python باهاشون یکسان رفتار نمی‌کنه. عدد 25 می‌تونه وارد محاسبات عددی بشه، روی "Python" می‌تونیم عملیات مربوط به متن انجام بدیم و یک list مثل [10, 20, 30] می‌تونه چند مقدار رو کنار هم نگه داره و بعداً تغییر کنه. Type این Objectها به‌ترتیب این‌هاست :

25              → int
3.14            → float
"Python"        → str
True            → bool
[10, 20, 30]    → list

پس دیتا تایپ در پایتون فقط یک برچسب خوشگل کنار مقدار نیست. وقتی کدی می‌نویسی، نوع خود Object مشخص می‌کنه کدوم عملیات مجازه و کجا احتمال خطا داری. جلوتر این موضوع رو با مثال‌های واقعی‌تر می‌بینیم.

آیا متغیرها در پایتون Type دارن؟

اینجا یه نکته رو به درس متغیرها در پایتون وصل کنیم. قبلاً گفتیم اسم متغیر رو صرفاً یک جعبه در نظر نگیر؛ اسم به یک Object اشاره می‌کنه. حالا یک لایه هم اضافه کن: خود Object نوع داره و نوعش روی رفتارش اثر می‌ذاره. پس مدل ذهنی دقیق‌تر اینه:

Name
↓
Object
↓
Type
↓
Behavior

مثلاً این کد رو ببین :

score = 20

اینجا اسم score به یک Object عددی از نوع int اشاره می‌کنه. ولی چند خط بعد کاملاً می‌تونیم بنویسیم :

score = "twenty"

حالا اسم score به Object دیگری از نوع str اشاره می‌کنه. این رفتار یکی از چیزهاییه که موقع صحبت درباره Dynamic Typing در پایتون می‌بینی؛ لازم نیست موقع ساخت Variable از قبل مشخص کنی که این اسم تا آخر برنامه حتماً باید فقط int باشه. مثلاً :

value = 100
print(type(value))

value = "Nabegheha"
print(type(value))

خروجی :

<class 'int'>
<class 'str'>

حالا وقتی می‌شنوی «نوع متغیر عوض شد»، می‌دونی منظور چیه؛ ولی دقیق‌ترش اینه که اسم value این بار به یک Object دیگه اشاره می‌کنه. این همون پایه Dynamic Typing در پایتونه. لازم نیست فعلاً وارد جزئیات مدیریت حافظه بشیم.

انواع داده در پایتون

تشخیص نوع داده در پایتون با type() و isinstance()

برای تشخیص Type یک مقدار، ساده‌ترین ابزار تابع type() هست. مثلاً :

age = 25
name = "Ali"
price = 149.90

print(type(age))
print(type(name))
print(type(price))

خروجی :

<class 'int'>
<class 'str'>
<class 'float'>

نکته جالب اینه که type() فقط به درد آموزش نمی‌خوره. موقع عیب‌یابی هم خیلی به کارت میاد؛ چون گاهی فکر می‌کنی با عدد طرفی، اما خروجی یک فرم یا input() در واقع رشته بوده. قبل از تغییر کد، اول نوع مقدار رو بررسی کن.

تفاوت type() و isinstance() چیه؟

برای اینکه Type دقیق یک Object رو ببینی، type() ابزار ساده و مستقیمی محسوب میشه :

number = 10
print(type(number))

ولی اگر بخوای بررسی کنی که یک Object از یک Type خاص یا یکی از زیرکلاس‌های اون هست یا نه، معمولاً isinstance() انتخاب مناسب‌تریه :

number = 10
print(isinstance(number, int))

خروجی :

True

مثلاً این مورد رو ببین :

print(type(True) == int)
print(isinstance(True, int))

خروجی :

False
True

در این مثال، Type واقعی True برابر bool هست، ولی bool در Python زیرکلاس int محسوب میشه. فعلاً لازم نیست وارد جزئیات Class و Inheritance بشیم؛ فقط بدون که type() و isinstance() دقیقاً یک سؤال رو جواب نمی‌دن.

اگه خواستی تفاوت این دو تابع رو در منبع اصلی ببینی، مستندات تابع type() و راهنمای isinstance() در سایت رسمی پایتون توضیحشون دادن. فعلاً برای این درس همین‌قدر بدون که این دو تابع سؤال یکسانی رو جواب نمی‌دن.

انواع داده در پایتون؛ ۱۴ دیتا تایپ مهم در یک نگاه

اول یه سوءتفاهم رو کنار بذاریم: پایتون فقط همین ۱۴ نوع داده رو نداره. این‌ها ۱۴ نمونه مهم از انواع داده‌های داخلی هستن که برای شروع انتخاب کردیم. توی مستندات رسمی، نوع‌های دیگه‌ای هم می‌بینی و خودت هم بعداً می‌تونی Class بسازی. فعلاً هدفمون اینه که انواع دیتا تایپ در پایتون رو بشناسیم و بدونیم هرکدوم کجا کاربرد دارن.

دستهTypeمثالقابل تغییر؟
عدد صحیحint25خیر
عدد اعشاریfloat19.95خیر
عدد مختلطcomplex2 + 3jخیر
متنstr"Python"خیر
منطقیboolTrueخیر
نبود مقدارNoneTypeNoneخیر
دنبالهlist[1, 2, 3]بله
دنبالهtuple(1, 2, 3)خیر
دنبالهrangerange(5)خیر
نگاشتdict{"name": "Ali"}بله
مجموعهset{1, 2, 3}بله
مجموعهfrozensetfrozenset({1, 2})خیر
داده باینریbytesb"ABC"خیر
داده باینریbytearraybytearray(b"ABC")بله

قرار نیست تمام ردیف‌های جدول رو همین امروز حفظ کنی. بهتره هر Type رو با یک مثال بشناسی و بفهمی چرا برای یک مسئله مناسبه. تفاوت list و tuple یا str و int وقتی کد اجرا می‌کنی خیلی روشن‌تر می‌شه.

برای جزئیات و محدودیت هر نوع، فهرست رسمی انواع داده داخلی پایتون مرجع قابل اتکاییه. قرار نیست همه این صفحه رو حفظ کنی؛ هر وقت درباره رفتار یک Type شک کردی، به بخش مربوط به همون Type برگرد.

انواع عددی در پایتون؛ int و float و complex

برای کار با اعداد، سه Type داخلی مهم داریم :

int
float
complex

نوع int برای اعداد صحیح

وقتی با اعداد صحیح کار می‌کنی، معمولاً با int طرفی :

students = 120
age = 25
balance = -10

برای دیدن Type می‌تونیم بنویسیم :

print(type(students))

خروجی :

<class 'int'>

یه اشتباه رایج اینه که فکر کنیم int در پایتون همیشه مثل بعضی زبان‌های دیگه فقط ۳۲ بیت جا داره. این‌طور نیست؛ عددهای صحیح می‌تونن خیلی بزرگ‌تر باشن و در عمل محدودیت اصلی بیشتر به منابع سیستم و بعضی تنظیمات برمی‌گرده. نمونه زیر رو اجرا کن:

number = 999999999999999999999999999999999999999999999999
print(number)

برای برنامه‌نویسی مقدماتی همین رو بدون که وقتی با یک عدد صحیح مثل 10، 0 یا -50 طرفی، معمولاً Type اون int هست.

نوع float برای اعداد اعشاری

برای اعداد اعشاری معمولاً از float استفاده می‌کنیم :

price = 199.99
temperature = 36.5
score = 18.75

برای مثال :

print(type(36.5))

خروجی :

<class 'float'>

فقط حواست باشه همه عددهای اعشاری دقیقاً همون‌طوری که روی کاغذ می‌نویسیم، در قالب float ذخیره نمی‌شن. برای همین ممکنه جمع ساده زیر خروجی غیرمنتظره‌ای داشته باشه:

print(0.1 + 0.2)

خروجی ممکنه برات عجیب باشه :

0.30000000000000004

این ایراد مخصوص پایتون نیست؛ به روش نمایش دودویی اعداد اعشاری برمی‌گرده. برای تمرین روزمره معمولاً مسئله‌ای ایجاد نمی‌کنه، اما برای محاسبات مالی دقیق باید بااحتیاط پیش بری. اگه به دقت ده‌دهی نیاز داری، decimal.Decimal رو هم بشناس؛ لازم نیست همین‌جا تمام جزئیاتش رو یاد بگیری.

اگه می‌خوای بفهمی چرا 0.1 + 0.2 دقیقاً 0.3 چاپ نمی‌کنه، توضیح رسمی پایتون درباره دقت اعشاری رو بخون. این موضوع ربطی به خراب بودن کدت نداره؛ به روش ذخیره عدد برمی‌گرده.

نوع complex برای اعداد مختلط

خود پایتون به‌صورت داخلی از اعداد مختلط هم پشتیبانی می‌کنه :

number = 2 + 3j
print(type(number))

خروجی :

<class 'complex'>

در برنامه‌نویسی روزمره احتمالاً خیلی کمتر از int و float با complex سروکار داری، ولی خوبه بدونی Python چنین Type داخلی‌ای هم داره.

نوع str برای متن در پایتون

هر وقت با متن کار می‌کنی، معمولاً با Typeای به اسم str طرفی : از همین‌جا می‌فهمی که ظاهر داده کافی نیست؛ برای تحلیل رفتار اون، نوع داده در پایتون رو هم باید بشناسی.

name = "Ali"
course = "Python"
message = "Welcome to Nabegheha"

مثلاً :

print(type(course))

خروجی :

<class 'str'>

یکی از اشتباه‌هایی که اول کار زیاد می‌بینیم، قاطی کردن ظاهر مقدار با نوع داده‌ست. این دوتا رو ببین؛ هر دو شبیه ۱۰۰ هستن، ولی یکی عدد و اون یکی رشته‌ست:

number = 100
text = "100"

از نظر ظاهری هر دو 100 هستن، ولی یکی int و اون یکی str هست :

print(type(number))
print(type(text))

خروجی :

<class 'int'>
<class 'str'>

همین تفاوت روی رفتار + هم اثر می‌ذاره :

print(100 + 20)
print("100" + "20")

خروجی :

120
10020

نوع str در Python از نوع Immutable هست؛ یعنی بعد از ساخته شدن String نمی‌تونی خود همون Object رو درجا تغییر بدی. جلوتر Mutable و Immutable رو دقیق‌تر بررسی می‌کنیم.

نوع bool و مقادیر True و False

نوع Boolean دو مقدار اصلی داره :

True
False

مثلاً :

is_logged_in = True
has_discount = False

برای بررسی Type :

print(type(is_logged_in))

خروجی :

<class 'bool'>

این Type وقتی به مبحث شرط‌ها برسیم خیلی مهم‌تر میشه، چون نتیجه خیلی از مقایسه‌ها یک مقدار Boolean هست :

age = 20
print(age >= 18)

خروجی :

True

یه نکته جالب هم اینه که bool در Python زیرکلاس int محسوب میشه و به همین دلیل این کد نتیجه True میده :

print(isinstance(True, int))

در بعضی Contextهای عددی هم True رفتاری شبیه 1 و False رفتاری شبیه 0 داره :

print(int(True))
print(int(False))

خروجی :

1
0

با این حال بهتره در کد واقعی Boolean رو به معنی «درست یا غلط» ببینی، نه به‌عنوان روش جایگزین برای نوشتن صفر و یک.

None در پایتون یعنی چی؟

بعضی وقت‌ها می‌خوای مشخص کنی که یک مقدار هنوز وجود نداره یا فعلاً مشخص نشده. Python برای چنین شرایطی مقدار خاصی به اسم None داره :

result = None

نوع اون رو هم می‌تونیم بررسی کنیم :

print(type(None))

خروجی :

<class 'NoneType'>

نکته مهم اینه که None با صفر، String خالی یا False یکی نیست :

print(None == 0)
print(None == "")
print(None == False)

خروجی :

False
False
False

مثلاً فرض کن هنوز شماره پیگیری برای یک سفارش ایجاد نشده :

tracking_code = None

اینجا None خیلی واضح‌تر از اینه که به‌زور 0 یا "" رو به معنی «کد نداریم» استفاده کنیم.

نوع list در پایتون

وقتی می‌خوای چند مقدار رو به‌ترتیب کنار هم نگه داری و بعداً هم بتونی اون مجموعه رو تغییر بدی، list یکی از مهم‌ترین انتخاب‌هاست : موقع انتخاب بین انواع داده در پایتون، اول بپرس آیا قراره اعضای مجموعه رو بعداً کم‌وزیاد کنی یا نه.

courses = ["Python", "Linux", "Flutter"]

مثلاً می‌تونیم مقدار جدیدی به List اضافه کنیم :

courses.append("Security")
print(courses)

خروجی :

['Python', 'Linux', 'Flutter', 'Security']

از نظر خود زبان، List می‌تونه Objectهایی با Typeهای متفاوت رو هم کنار هم داشته باشه :

data = ["Python", 350, True, 4.9]

این کد معتبره، هرچند اینکه ترکیب چند Type مختلف داخل یک List از نظر طراحی برنامه تصمیم خوبی باشه یا نه، به مسئله‌ای که داری حل می‌کنی بستگی داره. نوع list از نوع Mutable هست؛ یعنی محتوای همون List رو می‌تونی بعد از ساخته شدن تغییر بدی. خود List مبحث بزرگیه و بعداً باید جدا سراغ Index، Slicing، Methodها، Nested List و رفتارهای عمیق‌ترش بریم.

نوع tuple در پایتون

در نگاه اول Tuple خیلی شبیه List دیده میشه : این تفاوت رو موقع مقایسه انواع داده در پایتون یادت باشه: مرتب بودن با قابل‌تغییر بودن یکی نیست.

position = (35.72, 51.33)

ولی یکی از تفاوت‌های خیلی مهمش اینه که Tuple از نوع Immutable هست. مثلاً این کد معتبر نیست :

position = (35.72, 51.33)
position[0] = 40

اینجا پایتون TypeError میده، چون نمی‌تونی عضو Tuple رو به این شکل تغییر بدی. برای داده‌هایی که ساختار دنباله نباید بعد از ایجاد شدن تغییر کنه، Tuple می‌تونه انتخاب مناسبی باشه. یه نکته ریز ولی مهم هم درباره Tuple تک‌عضوی داریم؛ این کد Tuple نمی‌سازه :

value = (10)
print(type(value))

خروجی :

<class 'int'>

برای ساختن Tuple تک‌عضوی باید کاما داشته باشی :

value = (10,)
print(type(value))

حالا خروجی :

<class 'tuple'>

پس در Tuple تک‌عضوی، کاما نقش مهمی داره و صرفاً گذاشتن پرانتز کافی نیست.

نوع range در پایتون

نوع range رو وقتی وارد Loopها بشیم خیلی بیشتر می‌بینی :

numbers = range(5)

اگر برای مشاهده نتیجه اون رو به List تبدیل کنیم :

print(list(numbers))

خروجی :

[0, 1, 2, 3, 4]

ولی نکته مهم اینه که خود range(5) یک List آماده نیست و Type مستقل خودش رو داره :

print(type(range(5)))

خروجی :

<class 'range'>

این تفاوت وقتی وارد حلقه‌ها و بحث مصرف حافظه بشیم معنی بیشتری پیدا می‌کنه.

نوع dict برای داده‌های Key-Value

بعضی اطلاعات رو بهتره به‌جای اینکه فقط با شماره Index پیدا کنیم، با یک Key معنی‌دار ذخیره کنیم. مثلاً اطلاعات یک دوره رو ببین : این مدلِ دسترسی با کلید، یکی از تفاوت‌های مهم انواع داده در پایتون با ساختارهای شماره‌محوره.

course = {
    "title": "Python",
    "lessons": 342,
    "published": True
}

نوع این Object برابر dict هست :

print(type(course))

خروجی :

<class 'dict'>

در Dictionary با ساختار Key → Value طرفیم :

"title"     → "Python"
"lessons"   → 342
"published" → True

برای گرفتن عنوان دوره می‌تونیم بنویسیم :

print(course["title"])

خروجی :

Python

نوع dict از نوع Mutable هست، پس می‌تونیم بعداً مقدارهاش رو تغییر بدیم :

course["lessons"] = 350

یا Key جدید اضافه کنیم :

course["level"] = "Beginner"

دیکشنری یکی از مهم‌ترین ساختارهای داده Python محسوب میشه و خودش نیاز به یک آموزش کامل جداگانه داره.

نوع set برای نگهداری مقادیر یکتا

وقتی مهمه هر مقدار فقط یک بار در مجموعه وجود داشته باشه، set می‌تونه خیلی کاربردی باشه : اینجا دوباره می‌بینی که انتخاب انواع داده در پایتون به کاری بستگی داره که از مجموعه می‌خوای، نه فقط ظاهرش.

tags = {"python", "linux", "python", "security"}
print(tags)

مقدار تکراری "python" به‌عنوان دو عضو مستقل نگهداری نمیشه. یکی از کاربردهای ساده Set حذف Duplicateهاست :

numbers = [1, 2, 2, 3, 3, 3]
unique_numbers = set(numbers)
print(unique_numbers)

مجموعه نهایی شامل مقادیر یکتا خواهد بود :

{1, 2, 3}

فقط نباید برای منطق برنامه روی ترتیب نمایش اعضای یک Set حساب کنی. اگر ترتیب داده برای مسئله اهمیت داره، باید ساختار متناسب با همون نیاز رو انتخاب کنی.

نوع frozenset چیه؟

نوع frozenset از نظر مفهوم به set شبیهه، ولی بعد از ساخته شدن قابل تغییر نیست :

permissions = frozenset({"read", "write"})

یعنی می‌تونیم مجموعه‌ای از مقادیر یکتا داشته باشیم که خود مجموعه بعداً تغییر نکنه. برای شروع معمولاً خیلی بیشتر با set روبه‌رو می‌شی، پس لازم نیست الان روی frozenset زمان زیادی بذاری.

داده‌های باینری در پایتون

زبان پایتون برای کار با داده‌های باینری هم Typeهای داخلی مختلفی داره که از مهم‌ترین‌هاشون bytes، bytearray و memoryview هستن. مثلاً : برای کار با فایل و شبکه، تشخیص نوع داده در پایتون جلوی اشتباه گرفتن متن با بایت رو می‌گیره.

data = b"Python"
print(type(data))

خروجی :

<class 'bytes'>

نوع bytes Immutable هست، ولی bytearray قابل تغییره :

data = bytearray(b"ABC")
data[0] = 90
print(data)

این Typeها وقتی وارد موضوعاتی مثل فایل‌های باینری، Network Programming، Protocolها، Encoding، Cryptography یا پردازش داده خام بشیم اهمیت خیلی بیشتری پیدا می‌کنن. برای شروع، شناخت کاربرد کلی‌شون کافیه.

Mutable و Immutable در پایتون یعنی چی؟

ببین، فرق Mutable و Immutable در پایتون رو اگه از همین اول بفهمی، بعداً با لیست‌ها و توابع خیلی کمتر گیج می‌شی. Mutable یعنی محتوای خود Object رو می‌شه تغییر داد؛ Immutable یعنی برای تغییر مقدار، معمولاً Object تازه‌ای ساخته می‌شه یا اسم به مقدار جدیدی اشاره می‌کنه. اول یه لیست رو امتحان کن: پس برای شناخت انواع داده در پایتون فقط به اسم Type نگاه نکن؛ مهمه بدونی خود Object قابل تغییر هست یا نه.

numbers = [10, 20, 30]
numbers[0] = 100
print(numbers)

خروجی :

[100, 20, 30]

ولی String این رفتار رو نداره :

name = "Python"
name[0] = "J"

اینجا TypeError می‌گیری، چون str از نوع Immutable هست. چند Type مهم رو کنار هم ببین :

Typeوضعیت
intImmutable
floatImmutable
boolImmutable
strImmutable
tupleImmutable
frozensetImmutable
bytesImmutable
listMutable
dictMutable
setMutable
bytearrayMutable

یه نکته مهم درباره Tuple

ممکنه بگی اگر Tuple تغییر نمی‌کنه، پس این کد چرا کار می‌کنه؟

data = ([1, 2], "Python")
data[0].append(3)
print(data)

خروجی :

([1, 2, 3], 'Python')

اینجا خود Tuple عوض نشده؛ فقط لیستی که به‌عنوان عضو اولش نگه داشته بودیم تغییر کرده. پس Immutable بودن Tuple به این معنی نیست که همه Objectهای داخلش هم غیرقابل‌تغییرن. این مثال رو خوب به خاطر بسپار؛ یکی از جاهای مهمیه که فهم Reference به کارت میاد.

تبدیل نوع داده در پایتون

خیلی وقت‌ها داده همون نوعی نیست که برای محاسبه نیاز داری. تبدیل نوع داده در پایتون یعنی مثلاً رشته‌ای رو که شامل عدد هست به int یا float تبدیل کنی. فقط قبلش مطمئن شو مقدار واقعاً قابلیت تبدیل شدن داره. این نمونه رو ببین: توی کد واقعی، تشخیص نوع داده در پایتون و تبدیل درستش اغلب جلوی یک TypeError ساده ولی آزاردهنده رو می‌گیره.

age = "25"

اینجا age یک str هست. اگر بخوای عملیات عددی انجام بدی، می‌تونی اون رو به int تبدیل کنی :

age = int(age)
print(age + 5)

خروجی :

30

چند تبدیل رایج دیگه رو ببین :

int("25")
float("3.14")
str(100)
bool(1)
list((1, 2, 3))
tuple([1, 2, 3])
set([1, 1, 2, 3])

ولی هر تبدیلی معتبر نیست. مثلاً :

number = int("Python")

اینجا پایتون نمی‌تونه "Python" رو به یک عدد صحیح معنی‌دار تبدیل کنه، بنابراین ValueError می‌گیری.

تبدیل float به int

این مثال رو ببین :

number = int(12.9)
print(number)

خروجی :

12

تبدیل float به int در این حالت عدد رو Round نمی‌کنه؛ قسمت اعشاری به سمت صفر کنار گذاشته میشه. بنابراین این دو عملیات با هم فرق دارن :

print(int(12.9))
print(round(12.9))

خروجی :

12
13

پس Type Conversion و Rounding دو مفهوم جدا هستن.

تبدیل نوع داده در پایتون

یکی از رایج‌ترین باگ‌ها : input() مقدار str برمی‌گردونه

فرض کن از کاربر سنش رو می‌گیری : این یکی از بهترین مثال‌هاست که نشون می‌ده نوع داده در پایتون چطور روی نتیجه اجرای کد اثر می‌ذاره.

age = input("سن شما : ")

کاربر وارد می‌کنه :

20

ممکنه فکر کنی چون 20 وارد شده، پس age هم int شده. ولی این‌طور نیست :

age = input("سن شما : ")
print(type(age))

خروجی :

<class 'str'>

پس این کد مشکل داره :

age = input("سن شما : ")
print(age + 1)

به‌جای اینکه صرفاً نسخه درست رو کپی کنی، بیا علتش رو بفهمیم. مقدار input() رو گرفتیم، با type() دیدیم رشته‌ست و حالا می‌دونیم چرا جمع کردنش با عدد خطا می‌ده. پس بعد از اعتبارسنجی ورودی می‌تونیم اون رو تبدیل کنیم:

age = int(input("سن شما : "))
print(age + 1)

اگر کاربر 20 وارد کنه، خروجی میشه :

21

برای تشخیص نوع داده در پایتون و عیب‌یابی چنین خطاهایی، این ترتیب خیلی کمک می‌کنه:

مشکل
↓
بررسی مقدار
↓
بررسی Type
↓
فهم علت
↓
اصلاح

خیلی از Bugهایی که اوایل عجیب به نظر میان با همین بررسی ساده Type خیلی سریع‌تر قابل فهم میشن.

برای هر داده در پایتون کدوم Type رو انتخاب کنم؟

اینجا می‌رسیم به اصل ماجرا: هدف این نیست که انواع داده در پایتون رو طوطی‌وار حفظ کنی. باید بر اساس کاری که می‌خوای انجام بدی انتخاب کنی؛ متن می‌خوای، عدد می‌خوای، چند مقدار مرتب داری یا چند جفت کلید و مقدار؟ این جدول راهنمای سریعی برای انتخابه: وقتی انواع داده در پایتون رو بر اساس کاربردشون یاد می‌گیری، انتخاب نوع درست تبدیل به یک تصمیم منطقی می‌شه.

نیازType رایج
عدد صحیحint
عدد اعشاریfloat
متنstr
درست یا غلطbool
نبودن مقدارNone
چند مقدار مرتب و قابل تغییرlist
چند مقدار مرتب و ثابتtuple
ارتباط Key و Valuedict
مقادیر یکتاset
داده باینری ثابتbytes
داده باینری قابل تغییرbytearray

مثلاً فرض کن قراره بخشی از اطلاعات یک دوره رو نگهداری کنیم. عنوان دوره می‌تونه String باشه :

title = "Python"

تعداد ویدیوها یک Integer :

videos = 342

وضعیت انتشار می‌تونه Boolean باشه :

published = True

سرفصل‌ها می‌تونن داخل List قرار بگیرن :

topics = ["Variables", "Data Types", "Conditions"]

و اگر بخوای اطلاعات مرتبط دوره رو کنار هم قرار بدی، Dictionary می‌تونه مناسب باشه :

course = {
    "title": "Python",
    "videos": 342,
    "published": True
}

اینجا Type رو بر اساس مسئله انتخاب کردیم، نه اینکه صرفاً چون امروز dict یاد گرفتیم بخوایم همه‌جا از Dictionary استفاده کنیم.

نوع داده در پایتون

اشتباه‌های رایج در کار با دیتا تایپ در پایتون

بیا چند خطای رایج رو کنار هم ببینیم. اولیش اینه که "10" رو با 10 یکی بدونیم. هر دو شبیه هم هستن، ولی فقط یکی از اون‌ها عدد صحیحه. با type() خیلی سریع تفاوتشون رو می‌بینی: اگر نوع داده در پایتون رو درست تشخیص بدی، خیلی از این خطاها رو قبل از اجرای برنامه پیدا می‌کنی.

print(type(10))
print(type("10"))

خروجی :

<class 'int'>
<class 'str'>

این دو مقدار ظاهر مشابهی دارن ولی رفتار یکسانی ندارن. اشتباه رایج بعدی اینه که تصور کنیم هر مقدار عددی داخل String رو مستقیماً میشه به int تبدیل کرد. مثلاً این معتبره :

print(int("10"))

ولی این کد خطا میده :

print(int("3.5"))

چون "3.5" نمایش مستقیم یک Integer نیست. اشتباه مهم دیگه یکی گرفتن None و صفره؛ مثلاً :

price = 0
discount = None

اینجا price = 0 یعنی قیمت مشخصه و مقدارش صفره، ولی discount = None می‌تونه یعنی اصلاً هنوز مقداری برای تخفیف تعیین نشده. یه اشتباه مفهومی دیگه هم اینه که Mutable بودن رو با Reassignment یکی بدونیم. مثلاً :

number = 10
number = 20

اینجا Integer قبلی رو تغییر ندادیم؛ اسم number رو به Object دیگری Bind کردیم. ولی در این مثال :

numbers = [1, 2]
numbers.append(3)

خود List تغییر کرده. فهمیدن همین تفاوت بعداً جلوی خیلی از سردرگمی‌ها رو می‌گیره.

۵ تمرین کوتاه انواع داده در پایتون؛ قبل از اجرا حدس بزن

این پنج تمرین رو اول با فکر خودت حل کن. قبل از اجرای هر قطعه کد بگو چه خروجی‌ای می‌ده و چرا. بعد کد رو اجرا کن؛ این کار خیلی بیشتر از حفظ کردن اسم دیتا تایپ‌ها بهت کمک می‌کنه.

تمرین اول؛ جمع یا چسباندن متن؟

value = "20"
print(value + "5")

جواب :

205

هر دو مقدار str هستن، پس به هم متصل میشن.

تمرین دوم؛ جمع دو عدد

value = 20
print(value + 5)

جواب :

25

اینجا هر دو مقدار عددی هستن.

تمرین سوم؛ تبدیل رشته به عدد

value = "20"
print(int(value) + 5)

جواب :

25

قبل از جمع، "20" به Integer تبدیل شده.

تمرین چهارم؛ دو اسم و یک لیست

data = [10, 20]
backup = data
backup.append(30)
print(data)

خروجی :

[10, 20, 30]

دلیلش اینه که data و backup در این مثال به همون List اشاره می‌کنن و List هم Mutable هست. بعداً در بحث Reference و Copy دقیق‌تر می‌بینیم چرا این اتفاق می‌افته.

تمرین پنجم؛ مقدار بولی رشته‌ها

print(bool(0))
print(bool(1))
print(bool(""))
print(bool("False"))

خروجی :

False
True
False
True

مورد آخر خیلی مهمه؛ "False" یک String خالی نیست و چند کاراکتر داخلش وجود داره، بنابراین Truth Value اون True هست. پس متن "False" با Boolean واقعی False یکی نیست.

برای تکمیل این مسیر، بعد از درس متغیرها و همین صفحه، توی درس حلقه‌های پایتون هم با list و range کار می‌کنیم. وقتی تمرین‌ها رو خودت اجرا کنی، انتخاب نوع داده در برنامه‌های واقعی برات خیلی طبیعی‌تر می‌شه.

تمرین عملی انواع داده در پایتون؛ انتخاب Type درست

حالا نوبت خودته. اول برای نام دانشجو، سن، میانگین نمره، وضعیت حساب و فهرست دوره‌ها متغیر بساز و نوع هرکدوم رو با type() چاپ کن. بعد برو سراغ این کد که عمداً خطا داره؛ قبل از اصلاحش سعی کن علتش رو توضیح بدی: اینجا هدف تمرینه، نه حفظ جدول؛ انواع داده در پایتون رو باید موقع حل مسئله به‌کار بگیری.

price = input("قیمت دوره : ")
discount = 50000

final_price = price - discount

print(final_price)

قبل از تغییر کد، با type() بررسی کن خطا از کجا اومده. تمرین بعدی هم اینه که برای نام کاربر، تعداد تلاش‌های ناموفق، وضعیت 2FA، لیست IPهای مجاز، اطلاعات یک محصول، Permissionهای یکتا و مقدار هنوز مشخص‌نشده Type مناسب انتخاب کنی. قرار نیست فقط Syntax رو حفظ کنی؛ می‌خوام بتونی برای انتخاب نوع داده دلیل بیاری.

آیا Python دقیقاً تعداد مشخصی Data Type دارد؟

شاید بعضی جاها دیده باشی نوشته «پایتون ۱۴ نوع داده داره». این عدد معمولاً به یک فهرست منتخب از Built-inها اشاره می‌کنه، نه تمام Typeهای ممکن. در پایتون کتابخانه‌ها و Classهای خودت هم می‌تونن نوع‌های تازه بسازن. پس به‌جای حفظ یک عدد ثابت، مهم‌ترین دسته‌ها رو بشناس: نوع‌های عددی، متنی، منطقی، دنباله‌ها، دیکشنری‌ها و مجموعه‌ها. انواع داده‌های پایتون به همین جدول مقدماتی محدود نمی‌شن.

سؤالات متداول درباره انواع داده در پایتون

نوع داده یا Data Type در پایتون چیست؟

نوع داده مشخص می‌کنه یک Object چه نوع مقداری داره و چه رفتارها و Operationهایی برای اون تعریف شده. مثلاً int برای اعداد صحیح، str برای متن، list برای دنباله قابل تغییر و dict برای داده‌های Key-Value استفاده میشه.

چطور نوع یک متغیر را در پایتون بفهمیم؟

برای دیدن Type Objectی که یک اسم به اون اشاره می‌کنه می‌تونی از type() استفاده کنی :

value = 10
print(type(value))

خروجی :

<class 'int'>
تفاوت int و float در پایتون چیست؟

نوع int برای اعداد صحیح مثل 10 و -25 استفاده میشه، درحالی‌که float برای اعداد اعشاری مثل 3.14 و 19.99 کاربرد داره.

آیا list و tuple هر دو Data Type هستند؟

بله. هر دو از Sequence Typeهای مهم Python هستن، ولی یکی از تفاوت‌های اصلی اینه که list از نوع Mutable و tuple از نوع Immutable هست.

تفاوت str و int چیست؟

نوع str برای متن استفاده میشه و int برای اعداد صحیح. مثلاً "25" یک String و 25 یک Integer هست و به همین دلیل رفتار اون‌ها در عملیات مختلف یکسان نیست.

None چه نوع داده‌ای دارد؟

مقدار None از Typeای به اسم NoneType هست و معمولاً برای نمایش نبودن یک مقدار استفاده میشه.

Mutable و Immutable یعنی چی؟

در واقع، Objectهای Mutable بعد از ساخته شدن می‌تونن تغییر کنن؛ مثل list، dict و set. Objectهای Immutable مثل int، str و tuple بعد از ساخته شدن خودشون درجا تغییر نمی‌کنن.

آیا نوع یک متغیر در پایتون می‌تواند تغییر کند؟

یک اسم در Python می‌تونه در زمان‌های مختلف به Objectهایی با Typeهای متفاوت اشاره کنه :

value = 10
value = "Python"

به همین دلیل Python رو یک زبان Dynamically Typed می‌دونیم. مدل دقیق‌تر اینه که اسم value Type ثابت و دائمی نداره و در هر لحظه به یک Object مشخص اشاره می‌کنه.

جمع‌بندی

اگه از این درس فقط اسم int، str، list و dict یادت بمونه، نصف ماجرا رو از دست دادی. چیزی که می‌خوام واقعاً بفهمی اینه که اسم به Object اشاره می‌کنه و Type اون Object روی رفتارش اثر می‌ذاره. این خلاصه تصویری رو ببین:

Name
↓
Object
↓
Type
↓
Behavior

حالا می‌دونی چرا "10" با 10 فرق داره، چرا list قابل تغییره ولی tuple نه و چرا ورودی کاربر گاهی TypeError می‌ده. با type() و isinstance() هم آشنا شدیم و چند تمرین حل کردیم. این‌ها پایه‌های مهم انواع داده در پایتون هستن.

برای مرحله بعد می‌تونی بری سراغ آموزش شرط‌ها در پایتون و یاد بگیری چطور بر اساس همین داده‌ها تصمیم بگیری. اگه مسیر ویدیویی و پروژه‌محور می‌خوای، صفحه دوره کامل پایتون نابغه‌ها رو ببین و سرفصل‌هاش رو با نیازت مقایسه کن.

می‌خواهی عمیق‌تر جلو بروی؟

این درس فقط یک بخش از مسیر کامل است

اگر می‌خواهی مباحث را به‌ترتیب، همراه تمرین و پروژه دنبال کنی، مسیر کامل دوره را ببین.

دوره پایتون از صفر