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

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

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

تاریخ را نباید مثل عدد سال‌ماه‌روز از هم کم کرد؛ طول ماه‌ها و سال کبیسه این روش را خراب می‌کند. ماژول datetime تقویم میلادی را می‌شناسد و اختلاف دو date را به timedelta تبدیل می‌کند. در این تمرین تاریخ‌ها میلادی و بدون ساعت هستند. این قرارداد را با تاریخ جلالی یا منطقهٔ زمانی اشتباه نگیرید.

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

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

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

from datetime import date

def solve(data):
    try:
        today = date.fromisoformat(data['today'])
        due = date.fromisoformat(data['due'])
    except ValueError:
        return {'error': 'invalid_date'}
    days = (due - today).days
    return {'days': days, 'overdue': days < 0}

print(solve({'today': '2024-02-28', 'due': '2024-03-01'}))

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

{
  "days": 2,
  "overdue": false
}

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

fromisoformat تاریخ با شکل YYYY-MM-DD را می‌خواند. تاریخ due را از today کم می‌کنیم و days را از نتیجه می‌گیریم. مقدار مثبت یعنی موعد در آینده است، صفر یعنی امروز و مقدار منفی یعنی موعد گذشته. overdue فقط وقتی درست است که فاصله منفی باشد. عبور از مرز ماه یا سال به‌صورت خودکار محاسبه می‌شود.

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

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

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

نوشتن تاریخ ناممکن مثل روز سی‌ام فوریه ValueError می‌دهد. آن را به invalid_date تبدیل می‌کنیم؛ حدس‌زدن یک روز جایگزین مناسب نیست. برای برنامه‌های دارای ساعت، آگاهی از timezone لازم است، ولی افزودن زمان محلی دستگاه به این تمرین نتیجه را غیرقابل تکرار می‌کند.

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

فاصلهٔ ۲۸ فوریه تا اول مارس در سال ۲۰۲۴ و سال ۲۰۲۵ را مقایسه کنید. ورودی today همیشه داده می‌شود تا نتیجه به روز اجرای آزمون وابسته نباشد.

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

گام بعدی

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

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

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