حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش کار با فایل در پایتون؛ CSV، JSON و گزارش‌گیری

رفع باگ فیلتر بازه تاریخ پایتون؛ شامل بودن دو مرز

تاریخ فروش در پایتون؛ ISO، بازه بسته و گروه‌بندی روز · 0٪

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

مثلاً برای بازه دهم تا دوازدهم اکتبر، یعنی 2026-10-10 تا 2026-10-12، هر سه روز دهم، یازدهم و دوازدهم معتبرند. اگر شروع و پایان یک روز باشند، همان یک روز باید قابل انتخاب باشد، نه اینکه نتیجه همیشه خالی شود.

کد اولیه اعتبار تاریخ‌های ورودی را بررسی و داده خراب را رد می‌کند، اما شرط بازه دو مرز را جا انداخته است. آن را اصلاح کن و ترتیب و تکرار تاریخ‌های ورودی را نگه دار. start و end در این تمرین معتبرند و start از end دیرتر نیست. خطای رایج، مرتب کردن خروجی به جای حفظ ترتیب خواسته‌شده یا پذیرفتن تاریخ با فاصله دو سر است. شکل دقیق ISO همچنان لازم است؛ فقط محصول را در پروژه strip می‌کنیم، نه تاریخ را.

تابع آماده course_check از ورودی کپی عمیق می‌گیرد، تابع اصلی را اجرا می‌کند و تغییر ورودی را رد می‌کند؛ آن را نگه دار و فقط تابع اصلی را کامل کن.

فعالیت شما

تابع filter_dates(values,start,end) فهرست رشته‌ها و دو تاریخ دقیق معتبر ISO با start<=end می‌گیرد. فقط تاریخ‌های واقعی با شکل دقیق YYYY-MM-DD و در بازه بسته start<=day<=end را، با همان ترتیب و تکرار ورودی، بده؛ نامعتبرها نادیده گرفته شوند. خالی []؛ شروع=پایان معتبر است. filter_dates(['2026-10-10','2026-10-12'],'2026-10-10','2026-10-12') هر دو را نگه می‌دارد. ورودی تغییر نکند. course_check آماده را نگه دار؛ این تابع تغییر ورودی را رد و همان خروجی اصلی را برمی‌گرداند.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

from datetime import date
def filter_dates(values, start, end):
    low, high = date.fromisoformat(start), date.fromisoformat(end)
    result = []
    for text in values:
        try:
            day = date.fromisoformat(text)
        except ValueError:
            continue
        if day.isoformat() == text and low < day < high:
            result.append(text)
    return result


def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = filter_dates(*args)
    if args != before:
        raise AssertionError("ورودی نباید تغییر کند.")
    return result