حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش دیباگ و تست‌نویسی در پایتون؛ رفع خطا با تمرین

ساخت تابع خالص کوچک در پایتون؛ جداسازی محاسبه ردیف فاکتور

دیباگ تابع و فهرست در پایتون · 0٪

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

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

✍️ مثال حل‌شده:

def area(width, height):
    return width * height

def areas(rectangles):
    return [area(w, h) for w, h in rectangles]

assert areas([[2, 3], [4, 5]]) == [6, 20]

حالا نوبت توئه: دو تابع بنویس: line_total(price, quantity) حاصل ضرب دو عدد نامنفی را بدهد و invoice_lines(lines) برای هر جفت [price,quantity] یک مبلغ به‌ترتیب بسازد. [[100,2],[50,0]]=>[200,0] و []=>[]. هیچ ورودی یا متغیر سراسری تغییر نکند؛ inspect_lines آماده باید ورودی اصلی را هم بدون تغییر برگرداند.

فعالیت شما

دو تابع بنویس: line_total(price, quantity) حاصل ضرب دو عدد نامنفی را بدهد و invoice_lines(lines) برای هر جفت [price,quantity] یک مبلغ به‌ترتیب بسازد. [[100,2],[50,0]]=>[200,0] و []=>[]. هیچ ورودی یا متغیر سراسری تغییر نکند؛ inspect_lines آماده باید ورودی اصلی را هم بدون تغییر برگرداند.

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

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

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

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

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

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

def line_total(price, quantity):
    pass

def invoice_lines(lines):
    pass

def inspect_lines(lines):
    totals = invoice_lines(lines)
    return {"totals": totals, "original": lines}