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

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

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

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

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

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

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

def is_prime(n):
    if n < 2:
        return False
    divisor = 2
    while divisor * divisor <= n:
        if n % divisor == 0:
            return False
        divisor += 1
    return True

def solve(data):
    return {'prime': [is_prime(n) for n in data['numbers']]}

print(solve({'numbers': [-7, 0, 1, 2, 3, 9, 49]}))

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

{
  "prime": [
    false,
    false,
    false,
    true,
    true,
    false,
    false
  ]
}

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

تابع is_prime ابتدا عددهای کمتر از دو را رد می‌کند. سپس مقسوم‌علیه‌ها را تا وقتی مربعشان از n بیشتر نشده بررسی می‌کند؛ اگر هیچ مقسوم‌علیهی پیدا نشود عدد اول است. solve نتیجهٔ تابع را برای همهٔ عددهای ورودی به ترتیب می‌سازد. برای تمرین محلی می‌توانید assert is_prime(2) و assert not is_prime(1) را اضافه کنید.

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

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

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

عدد یک اول نیست و فراموش‌کردن این شرط خطای رایج است. شرط حلقه باید <= باشد تا مربع عدد اول مانند ۴۹ اشتباه پذیرفته نشود. assert ابزار مناسب تست و تمرین است، نه اعتبارسنجی امنیتی ورودی در محصول؛ اجرای بهینهٔ پایتون ممکن است assert را حذف کند.

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

تست برای منفی۷، صفر، یک، دو، نه و چهل‌ونه بنویسید. سپس عمداً <= را به < تبدیل کنید و ببینید کدام تست خطای تازه را آشکار می‌کند.

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

گام بعدی

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

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

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