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

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

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

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

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

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

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

def subtotal(items):
    return sum(item['price'] * item['quantity'] for item in items)

def solve(data):
    discount = data['discount']
    if not 0 <= discount <= 100:
        return {'error': 'invalid_discount'}
    amount = subtotal(data['items'])
    return {'subtotal': round(amount, 2), 'total': round(amount * (1 - discount / 100), 2)}

print(solve({'items': [{'price': 20, 'quantity': 3}], 'discount': 10}))

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

{
  "subtotal": 60,
  "total": 54
}

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

تابع subtotal مجموع price ضرب در quantity همهٔ سطرها را می‌سازد. solve درصد تخفیف را بررسی می‌کند و مبلغ پس از تخفیف را برمی‌گرداند. تخفیف معتبر از صفر تا صد است. اگر ۱۰ درصد تخفیف داریم، باید مجموع را در ۰٫۹ ضرب کنیم؛ کم‌کردن عدد ۱۰ از مبلغ، همان معنی را ندارد.

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

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

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

وقتی return فراموش شود، تابع None می‌دهد و ضرب بعدی روی آن خطا می‌سازد. نام متغیر total را به جای نام sum انتخاب کنید تا تابع داخلی sum را نپوشانید. گردکردن در پایان انجام می‌شود، نه بعد از هر ضرب کوچک.

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

سبد خالی، تخفیف صفر و تخفیف صددرصد را آزمایش کنید. یک تابع دیگر برای تعداد کل واحدها بنویسید، بدون اینکه تابع محاسبهٔ قیمت را تغییر دهید.

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

گام بعدی

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

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

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