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

چرا جمع دو ورودی گاهی ۲۳ می‌شود؟

رشته‌ها با + به هم متصل می‌شوند. اعداد با همین عملگر جمع می‌شوند. نمونهٔ زیر را بدون نیاز به تایپ ورودی اجرا کنید:

first = "2"
second = "3"
print(first + second)
print(int(first) + int(second))
assert first + second == "23"
assert int(first) + int(second) == 5

هر دو رفتار درست‌اند؛ نوع داده تعیین می‌کند کدام معنا اجرا شود. تابع type() کمک می‌کند فرض خود را بررسی کنید. وقتی خطایی دربارهٔ ترکیب str و int می‌بینید، از محل ورود داده شروع کنید.

هر چیزی که رقم دارد عدد محاسباتی نیست

کد دانشجویی، شمارهٔ تلفن و کد پستی معمولاً شناسه‌اند. تبدیل آن‌ها به int می‌تواند صفر ابتدایی را حذف کند. برای مثال، رشتهٔ "0012" پس از تبدیل به عدد 12 می‌شود. اگر قصد جمع یا مقایسهٔ عددی ندارید، نگه‌داشتن رشته اغلب با مسئله سازگارتر است.

در مقابل، تعداد شرکت‌کنندگان باید عدد صحیح باشد. نمره می‌تواند اعشاری باشد. تاریخ هم با چند تکه عدد تشکیل می‌شود، اما تبدیل کل آن به عدد مسئلهٔ اعتبار تقویمی را حل نمی‌کند. ابتدا معنای داده را تعیین کنید، سپس نوع را انتخاب کنید.

تبدیل موفق با ورودی معتبر فرق دارد

پایتون می‌تواند "-3" را به عدد صحیح تبدیل کند؛ اما تعداد ثبت‌نام منفی معتبر نیست. برای نمره هم موفقیت float() کافی نیست: float("nan") و float("inf") تبدیل می‌شوند، در حالی که نمرهٔ عادی نیستند.

import math

def parse_score(text):
    value = float(text.strip())
    if not math.isfinite(value) or not 0 <= value <= 20:
        raise ValueError("score must be finite and between 0 and 20")
    return value

print(parse_score(" 17.5 "))
assert parse_score("20") == 20
for sample in ["nan", "inf", "-1", "21", "hello"]:
    try:
        parse_score(sample)
    except ValueError:
        print("invalid:", sample)

در این مثال strip() فاصلهٔ ابتدا و انتهای متن را برمی‌دارد. مقدار نامعتبر را صفر نمی‌کنیم، چون صفر می‌تواند نمرهٔ واقعی باشد. کد فراخوان باید از کاربر بخواهد ورودی را اصلاح کند یا خطا را در گزارش داده ثبت کند.

چند استثنای مهم

int("3.5") خطا می‌دهد؛ رشتهٔ اعشاری نمایش عدد صحیح نیست. int(3.5) مقدار 3 می‌دهد و به‌سمت صفر قطع می‌کند، بنابراین جایگزین گردکردن نیست. تبدیل int(float(text)) هم ممکن است کسری را بی‌صدا حذف کند و برای تعداد مناسب نباشد.

همچنین bool("False") برابر True است، چون این رشته خالی نیست. برای گزینهٔ بله/خیر، متن‌های مجاز را صریح تعریف کنید. در دادهٔ فارسی ممکن است رقم فارسی، جداکنندهٔ هزارگان یا ممیز متفاوت داشته باشید؛ سیاست پذیرش و تبدیل را بنویسید و با چند ورودی واقعی امتحان کنید.

تمرین و گفت‌وگو

تابعی برای تعداد جلسه بنویسید که فقط عدد صحیح بین صفر و ۳۰ را بپذیرد. دربارهٔ "03"، "3.0" و "۳" تصمیم بگیرید و دلیل تصمیم را بنویسید. در دیدگاه بگویید کدام‌یک را معتبر می‌دانید و چرا؛ تفاوت قراردادها می‌تواند از تفاوت نیاز برنامه باشد.

منابع و ادامهٔ یادگیری

این آموزش بر پایهٔ پایتون مقدماتی ۱ آکادمی کدچ، فصل ۳: ورودی، تبدیل نوع و عملگرها، و مثال‌های بازنویسی‌شده برای این مقاله تدوین شده است.

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

گفت‌وگو دربارهٔ این مطلب

هنوز دیدگاهی منتشر نشده است.

برای ثبت دیدگاه وارد حساب کاربری شوید.