پاسخ کوتاه: در پایتون، نوع داده مشخص میکند هر مقدار چگونه ذخیره و تفسیر شود. انواع اصلی عبارتاند از int برای اعداد صحیح، float برای اعداد ممیز شناور، str برای متن، bool برای درست/نادرست و None برای مقدار ثبتنشده؛ انتخاب نوع درست از خطاهای محاسباتی و دادهای جلوگیری میکند.
چرا "10" با 10 یکسان نیست؟ چرا مقدار صفر نباید همیشه بهمعنای داده گمشده تفسیر شود؟ و چرا جمع دو عدد اعشاری گاهی نتیجهای با رقمهای اضافی تولید میکند؟ پاسخ این پرسشها به یکی از پایهایترین مفاهیم برنامهنویسی برمیگردد: نوع داده.
برای شروع، کافی است پنج مفهوم اصلی را بشناسید: int برای اعداد صحیح، float برای اعداد ممیز شناور، str برای متن، bool برای مقدارهای منطقی و None برای نمایش نبود مقدار. انتخاب و تفسیر درست آنها، پایه محاسبات صحیح، پاکسازی داده و نوشتن برنامههای قابلاعتماد است.
در این راهنما، این مفاهیم را با مثالهایی از فروش، موجودی و دادههای پژوهشی بررسی میکنیم.
نوع داده چیست و چرا اهمیت دارد؟
نوع داده مشخص میکند یک مقدار چگونه تفسیر شود و چه عملیاتی روی آن معنا داشته باشد. برای مثال، جمع دو عدد با اتصال دو رشته متفاوت است:
print(10 + 5) # 15print("10" + "5") # 105در خط اول، جمع عددی انجام میشود؛ در خط دوم، دو متن به یکدیگر متصل میشوند. بنابراین، ظاهر عددی یک مقدار لزوماً بهمعنای عدد بودن آن نیست.
| نوع | کاربرد | نمونه |
|---|---|---|
int | تعداد و اعداد صحیح | 12، 0، -5 |
float | اندازهگیری و محاسبات ممیز شناور | 3.14، -0.5 |
str | متن و شناسههای متنی | "Python"، "00125" |
bool | وضعیت منطقی | True، False |
NoneType | نوع مقدار ویژه None | None |
۱. نوع int؛ اعداد صحیح و شمارش
از int برای مقدارهایی مانند تعداد محصول، تعداد نمونه یا شمار رویدادها استفاده کنید:
units_sold = 12stock = 0temperature_change = -3صفر و اعداد منفی نیز عدد صحیح هستند. برای خواناتر شدن اعداد بزرگ میتوان از زیرخط استفاده کرد:
sample_count = 1_000_000زیرخط در اینجا فقط خوانایی کد را افزایش میدهد و مقدار عدد را تغییر نمیدهد.
تفاوت تقسیم معمولی، تقسیم کف و باقیمانده
| عملگر | کاربرد | مثال | نتیجه |
|---|---|---|---|
/ | تقسیم معمولی | 7 / 2 | 3.5 |
// | تقسیم کف | 7 // 2 | 3 |
% | باقیمانده | 7 % 2 | 1 |
** | توان | 2 ** 3 | 8 |
تقسیم با / میان دو عدد صحیح نیز نتیجه float میدهد. همچنین // بهمعنای حذف ساده بخش اعشاری نیست؛ نتیجه را به سمت منفی بینهایت گرد میکند:
print(8 / 2) # 4.0print(-7 // 2) # -4برای مثال، اگر ۲۹ قطعه داشته باشید و ظرفیت هر بسته ۶ قطعه باشد:
items = 29box_capacity = 6
print(items // box_capacity) # 4 full boxesprint(items % box_capacity) # 5 remaining itemsاین مثالها نشان میدهند انتخاب عملگر باید با معنای مسئله هماهنگ باشد. Python 3.15.0 documentation
۲. نوع float؛ اندازهگیری و محاسبات اعشاری
از float برای بسیاری از اندازهگیریها و محاسبات علمی استفاده میشود:
unit_price = 49.50
temperature = 36.7
duration = 0.025بااینحال، بسیاری از کسرهای دهدهی در نمایش دودویی رایانه دقیق نیستند:
print(0.1 + 0.2)# 0.30000000000000004این رفتار ویژگی محاسبات ممیز شناور است. برای مقایسه تقریبی میتوان از math.isclose() استفاده کرد:
import mathresult = 0.1 + 0.2
print(math.isclose(result, 0.3)) # Trueدر دادههای علمی، تلورانس مقایسه باید با مقیاس داده و دقت اندازهگیری هماهنگ باشد؛ تنظیمات پیشفرض برای همه مسئلهها مناسب نیستند. نمایش دو رقم اعشار نیز دقت مقدار ذخیرهشده را تغییر نمیدهد. Python 3.15.0 documentation
برای محاسبات مالی چه کنیم؟
در محاسبات مالی، واحد پول، تعداد رقمهای اعشار و روش گردکردن را مشخص کنید. بسته به مسئله، نگهداری مبلغ بهصورت عدد صحیح در کوچکترین واحد پولی یا استفاده از Decimal مناسب است.
from decimal import Decimal, ROUND_HALF_UPquantity = 3unit_price = Decimal("19.95")tax_rate = Decimal("0.09")subtotal = quantity * unit_pricetotal = (subtotal * (Decimal("1") + tax_rate)).quantize( Decimal("0.01"), rounding=ROUND_HALF_UP,)print(total) # 65.24در این نمونه، مقادیر اعشاری از رشته ساخته شدهاند تا تقریب اولیه float وارد محاسبه نشود. روش ROUND_HALF_UP صرفاً انتخاب این مثال است؛ سیاست واقعی گردکردن باید با قواعد پروژه هماهنگ باشد. Decimal نیز تنظیمات دقت دارد و بهمعنای دقت نامحدود نیست. Python 3.15.0 documentation
۳. نوع str؛ متن، برچسب و شناسه
از رشته برای نام محصول، توضیح آزمایش، کد نمونه و سایر اطلاعات متنی استفاده میکنیم:
product_name = "حسگر دما"sample_code = "00125"کد نمونه بالا بهتر است رشته باقی بماند؛ تبدیل آن به عدد، صفرهای ابتدایی را حذف میکند. عددی بودن ظاهر یک شناسه، دلیل کافی برای ذخیره آن بهصورت عدد نیست.
ساخت خروجی خوانا با f-string
با f-string میتوانید مقدار متغیرها را در متن قرار دهید:
product_name = "Sensor"quantity = 12unit_price = 49.50revenue = quantity * unit_pricemessage = f"{product_name}: {quantity} units, total = {revenue:.2f}"print(message)# Sensor: 12 units, total = 594.00عبارت :.2f مقدار را در خروجی با دو رقم اعشار نمایش میدهد و نتیجه قالببندی یک رشته است. Python 3.15.0 documentation
پاکسازی متن فارسی
در داده فارسی، اختلاف «ي» و «ی»، «ك» و «ک» یا فاصلههای اضافی میتواند تطبیق متن را مختل کند:
raw_name = " كابل پزشكي "clean_name = ( raw_name .strip() .replace("ي", "ی") .replace("ك", "ک"))print(clean_name) # کابل پزشکیرشتهها تغییرناپذیرند؛ این متدها رشته تازه میسازند. درباره نیمفاصله نیز سیاست مشخصی داشته باشید: حذف همه نیمفاصلهها ممکن است برای متن نمایشی مناسب نباشد. بهتر است متن اصلی را حفظ و نسخه استانداردشده را برای جستوجو یا تطبیق جداگانه تولید کنید.
۴. نوع bool؛ شرط و تصمیمگیری
نوع bool دو مقدار True و False دارد:
stock = 8requested_quantity = 3can_fulfill = stock >= requested_quantityprint(can_fulfill) # Trueبرای ترکیب شرطها از and، or و not استفاده کنید:
payment_confirmed = Truecan_ship = (stock >= requested_quantity) and payment_confirmedمراقب تبدیل متن به Boolean باشید
رشته غیرخالی در ارزیابی منطقی درست محسوب میشود؛ حتی اگر محتوای آن "False" باشد:
print(bool("False")) # Trueprint(bool("")) # Falseبنابراین، وضعیتهای متنی را صریح تفسیر کنید:
raw_status = " false "status = raw_status.strip().lower()if status == "true":
is_active = Trueelif status == "false":
is_active = Falseelse:
raise ValueError("Expected 'true' or 'false'")همچنین and و or همیشه مقدار bool برنمیگردانند؛ ممکن است یکی از عملوندها را برگردانند. در شرطها، عبارتهای مقایسهای روشن معمولاً خواناترند. Python 3.15.0 documentation
۵. مقدار None؛ وقتی مقداری ثبت نشده است
فرض کنید مقدار یک اندازهگیری هنوز وارد نشده است:
measurement = Noneif measurement is None:
print("No measurement recorded")None با صفر تفاوت معنایی دارد. صفر میتواند نتیجه معتبر آزمایش باشد، درحالیکه None نشان دهد هنوز اندازهگیری انجام نشده است.
برای بررسی نبود مقدار، از is None استفاده کنید:
value = 0if value is None:
print("Missing")else:
print("Available:", value)شرط کلی if not value برای این هدف کافی نیست؛ چون صفر، رشته خالی و False نیز در شرط نادرست ارزیابی میشوند.
۶. تشخیص و تبدیل نوع داده
برای مشاهده نوع مقدار از type() و برای بررسی تعلق آن به یک نوع از isinstance() استفاده کنید:
quantity = 12
print(type(quantity)) # <class 'int'>
print(isinstance(quantity, int)) # Trueتبدیل نوع باید آگاهانه انجام شود:
print(int("12")) # 12
print(float("12.5")) # 12.5
print(str(12)) # "12"
print(int(12.9)) # 12تبدیل float به int بخش اعشاری را به سمت صفر حذف میکند؛ گردکردن نیست. همچنین int("12.5") معتبر نیست. ورودی input() نیز رشته برمیگرداند و برای محاسبه به تبدیل نیاز دارد. Python 3.15.0 documentation
ورودی نامعتبر را مدیریت کنید
raw_quantity = "12"
try:
quantity = int(raw_quantity)except
ValueError:
print("Enter a valid integer.")
else:
if quantity < 0:
print("Quantity cannot be negative.")
else:
print("Accepted:", quantity)در اینجا دو بررسی جدا داریم: امکان تبدیل به عدد صحیح و معتبر بودن مقدار برای مسئله. تبدیل موفق بهتنهایی بهمعنای معتبر بودن داده نیست. Python 3.15.0 documentation
۷. تفاوت صفر، متن خالی، False و None
در طراحی داده، این مقدارها را براساس معنای واقعیشان ثبت کنید:
| مقدار | معنای احتمالی در پروژه |
|---|---|
0 | تعداد یا اندازهگیری برابر صفر |
"0" | متن حاوی رقم صفر |
"" | متن خالی |
" " | متن شامل فاصله |
False | وضعیت منفی یا شرط برقرارنشده |
None | مقدار ثبتنشده یا در دسترس نیست |
برای مثال، موجودی صفر یعنی کالا تمام شده است؛ موجودی نامشخص یعنی اطلاعات قابل اتکا نداریم. یکسان کردن این دو میتواند گزارش موجودی را نادرست کند.
۸. دادههای گمشده در pandas
در pandas، بسته به نوع ستون، مقدار گمشده ممکن است با NaN، NaT یا pd.NA نمایش داده شود. برای شناسایی آنها از isna() استفاده کنید:
import pandas as pddf = pd.DataFrame({ "quantity": pd.Series([12, 0, None], dtype="Int64"), "note": pd.Series(["checked", "", None], dtype="string"),})print(df.isna().sum())خروجی:
quantity 1
note 1
dtype: int64صفر و رشته خالی در این مثال گمشده محسوب نمیشوند. اگر رشته خالی طبق تعریف پروژه نشانه نبود اطلاعات است، آن را صریح تبدیل کنید:
df["note"] = df["note"].replace(r"^\s*$", pd.NA, regex=True)حذف یا جایگزینی مقادیر گمشده باید با دلیل انجام شود. جایگزینی همه مقادیر گمشده با صفر ممکن است میانگینها و سایر نتایج را تغییر دهد. pandas 3.0.6 documentation
پرسشهای رایج
آیا None همان False است؟
خیر. False وضعیت منطقی منفی است؛ None معمولاً نبود مقدار را نشان میدهد. شباهت رفتار آنها در شرط، بهمعنای یکسان بودن معنا نیست.
آیا "10" با 10 برابر است؟
خیر. اولی متن و دومی عدد صحیح است. پیش از تبدیل، بررسی کنید مقدار واقعاً عدد است یا شناسهای که باید متنی باقی بماند.
آیا برای شماره تلفن باید از int استفاده کنیم؟
معمولاً خیر. شماره تلفن شناسه است و ممکن است صفر ابتدایی یا علامت + داشته باشد؛ ذخیره آن بهصورت رشته مناسبتر است.
آیا round مشکل دقت float را کاملاً حل میکند؟
خیر. گردکردن جایگزین انتخاب روش محاسبه و سیاست دقت نیست. برای مقایسه علمی و محاسبه مالی، راهکار مناسب همان مسئله را انتخاب کنید.
چگونه مقدارهای گمشده هر ستون را بشماریم؟
از دستور زیر استفاده کنید:
df.isna().sum()جمعبندی
نوع داده را با معنای مقدار هماهنگ کنید: تعداد برای int، اندازهگیری برای float، متن و شناسه برای str، وضعیت منطقی برای bool و نبود مقدار برای None.
پیش از محاسبه، نوع و اعتبار ورودی را بررسی کنید و تفاوت میان صفر، متن خالی و داده گمشده را حفظ کنید. این عادتها در پروژههای کوچک شکل میگیرند و در تحلیل دادههای بزرگ، ارزش خود را نشان میدهند. گام بعدی، یادگیری لیستها و شیوه نگهداری و پردازش چند مقدار در کنار یکدیگر است.
منابع رسمی
- آموزش مقدماتی پایتون: عددها و رشتهها
- انواع داده داخلی پایتون
- توابع داخلی و تبدیل نوع
- قالببندی خروجی و f-string
- محدودیتهای محاسبات ممیز شناور
- مستندات decimal
- مدیریت داده گمشده در pandas
برای ادامهٔ یادگیری، این منابع مرتبط آکادمی تک را ببینید:

