پیش‌نیاز و هدف یادگیری

این بخش، گام 18 از مسیر «پایتون از صفر» است. هدف این درس گزارش ورودی‌های نامعتبر بدون پنهان‌کردن خطاهای برنامه است. پیش‌نیاز: pathlib و نام فایل؛ مسیر را مثل داده پردازش کنید. کتابخانهٔ خارجی لازم نیست؛ ماژول‌های استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیش‌نیاز را بخوانید و مثالش را اجرا کنید؛ حفظ‌کردن کد جای فهم ورودی و خروجی را نمی‌گیرد.

مفهوم اصلی به زبان ساده

خطای نحوی مانع شروع برنامه می‌شود، ولی استثنا هنگام اجرای یک دستور رخ می‌دهد. تبدیل int("hello") نمونهٔ ValueError است؛ متن از نوع رشته است اما محتوای مناسب ندارد. پیام traceback را از خط آخر بخوانید و سپس به شمارهٔ خط خودتان برگردید. حذف پیام خطا راه حل نیست؛ باید علت و مرز قابل انتظار آن را پیدا کنید.

مسئلهٔ این درس

در پروژهٔ «مبدل امن متن به عدد صحیح» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار می‌دهد؛ تابع solve دیکشنری داده را می‌گیرد و نتیجهٔ خود را برمی‌گرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.

نمونه‌کد قابل اجرا

def solve(data):
    numbers, invalid = [], []
    for index, text in enumerate(data['values']):
        try:
            numbers.append(int(text))
        except ValueError:
            invalid.append(index)
    return {'numbers': numbers, 'invalid_indices': invalid}

print(solve({'values': [' 12 ', 'bad', '-3', '2.5']}))

نتیجهٔ مورد انتظار

{
  "numbers": [
    12,
    -3
  ],
  "invalid_indices": [
    1,
    3
  ]
}

توضیح مرحله‌به‌مرحله

برای هر رشتهٔ values، تلاش می‌کنیم آن را با int به عدد صحیح تبدیل کنیم. رشتهٔ دارای فاصلهٔ دو طرف و علامت منفی قابل قبول است؛ "2.5" عدد صحیح نیست. مقدارهای موفق در numbers می‌آیند و اندیس مقدارهای ناموفق در invalid_indices ذخیره می‌شود. ترتیب هر دو فهرست باید با ورودی سازگار باشد.

قرارداد ورودی و خروجی

مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرست‌ها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره می‌کند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درست‌بودن پاسخ و قبولی ارزیابی یکسان نیست.

خطای رایج و راه تشخیص

except بدون مشخص‌کردن نوع، خطاهای برنامه‌نویسی مثل نام متغیر اشتباه را هم پنهان می‌کند. فقط ValueError قابل انتظار از تبدیل را بگیرید. ورودی این تمرین همیشه لیست رشته‌هاست؛ اضافه‌کردن مدیریت ده‌ها نوع فرضی، هدف آموزش را گم می‌کند.

تمرین مستقل و خودآزمایی

ورودی‌های " 12 "، "-3"، "2.5" و رشتهٔ خالی را امتحان کنید. بعد عمداً نام یک متغیر را اشتباه بنویسید و بررسی کنید چرا آن خطا نباید به عنوان ورودی نامعتبر گزارش شود.

برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچک‌تر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر هم‌زمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام می‌شود و پاسخ ثابت نمونه پذیرفته نخواهد شد.

گام بعدی

موضوع‌های این درس: try · except · ValueError. اگر می‌توانید دلیل هر خط را توضیح دهید و ورودی تازه‌ای را بدون دست‌کاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژه‌های یادگیری ماشین عجله نکنید.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.