8200 אקדמי
מדריך למידה מעשי

איך למצוא שגיאה בתוכנית: דיבוג Python עם דוגמה פתורה

כדי למצוא שגיאה בתוכנית, מתחילים בפער אחד: מה ציפינו לקבל ומה קרה בפועל. מצמצמים את הדוגמה, בודקים השערה אחת ומשנים רק את מה שיש לו הסבר. במדריך נתרגל את הדרך הזאת על קוד Python שרץ בלי הודעת שגיאה, אבל מפספס מקרה גבול. זהו תרגיל לימודי מקורי, לא שאלה ממיון צבאי או מדד לסיכויי קבלה.

מערכת 8200 אקדמיעודכן:

הדרך הקצרה: לצפות, להשוות, לצמצם ולבדוק

דיבוג, או איתור ותיקון תקלות בקוד, אינו ניסיון לשנות שורות עד שהתוכנית נראית תקינה. לצורך התרגול כאן נעבוד עם דרישה כתובה, קלט ידוע ותוצאה צפויה. כך אפשר לבדוק אם השינוי פתר את הבעיה שהגדרנו, ולא רק הזיז אותה למקום אחר.

הדוגמה מתאימה למי שכבר פגש משתנים, רשימה, לולאת for ותנאי if. הלולאה עוברת על איברי הרשימה לפי הסדר; התנאי קובע אם לבצע את הפעולה שבתוכו.[3] אם אלה עדיין חדשים לכם, התחילו בקריאת הדוגמה שורה־שורה או בקשו הסבר נקודתי לפני התיקון.

  1. 1. כתבו מה אמור לקרות

    נסחו כלל שאפשר לבדוק, כולל ערך הגבול. למשל: לספור כל מפגש שנמשך לפחות 30 דקות, כולל מפגש של 30 בדיוק.

  2. 2. שמרו מה קרה בפועל

    רשמו את הנתונים, הפלט והקוד שהרצתם. אם יש הודעת שגיאה, שמרו אותה בשלמותה לפני שמשנים משהו.

  3. 3. מצאו דוגמה קטנה שמראה את הפער

    נסו להשאיר רק נתון אחד שעדיין מפיק תוצאה שגויה. רשמו השערה שמסבירה למה דווקא הוא נכשל.

  4. 4. שנו דבר אחד ובדקו שוב

    הריצו שוב את הדוגמה שנכשלה, ואז גם מקרה רגיל ומקרי גבול. אם הפער נשאר, אל תציגו את הניסיון כתיקון.

לפני השורה הראשונה שמשנים, משלימים משפט: עבור הקלט ___ ציפיתי ל־___, אבל קיבלתי ___.

האם יש הודעת שגיאה, או רק תוצאה לא נכונה?

התיעוד של Python מבחין בין שגיאות תחביר לבין חריגות שמתגלות בזמן ביצוע. בהודעת חריגה, השורה האחרונה מציינת את סוג החריגה ואת הפרטים שלה; החלק שלפניה מציג את ההקשר שבו התרחשה.[1] זו נקודת פתיחה לקריאה, לא הוראה לתקן תמיד את השורה האחרונה בקובץ.

גם הסימון בהודעת SyntaxError מצביע על המקום שבו הבעיה התגלתה, ולא בהכרח על המקום שבו צריך לתקן אותה.[1] למשל, כדאי לבדוק גם את השורה הקודמת ואת הסוגריים והמירכאות שסביבה, ולא למחוק מיד את הקטע שסומן.

בתרגיל שלנו יש מצב אחר: התוכנית מסתיימת ומדפיסה מספר, אבל המספר אינו תואם את הדרישה. הודעת חריגה לא תסביר את הפער הזה; נצטרך להשוות בין הכלל לבין התנאי שכתבנו.

האם יש הודעת שגיאה, או רק תוצאה לא נכונה? — דף עבודה
מה רואיםמה בודקים קודםמה לא מסיקים מיד
SyntaxErrorאת הניסוח והמבנה ליד המקום שסומןשהסימון הוא בהכרח המקום היחיד שצריך לתקן
NameErrorאם השם שבו השתמשנו הוגדר, ואם האיות עקבישכל התוכנית צריכה להיכתב מחדש
TypeErrorאילו ערכים וטיפוסים הגיעו לפעולהשמספר וטקסט שמכיל ספרות הם אותו דבר
פלט שאינו תואם לדרישהאת הקלט, התוצאה הצפויה והכלל שמומששהיעדר הודעת שגיאה מוכיח שהתשובה נכונה

התרגיל: סופרים מפגשים של לפחות 30 דקות

הדרישה: בהינתן רשימה של משכי מפגשי לימוד, לספור כמה מהם נמשכו לפחות 30 דקות. לצורך התרגיל כל משך הוא מספר שלם שאינו שלילי; רשימה ריקה מותרת. לא נחשב ממוצע ולא נסכם דקות, אלא נספור מפגשים. הכללים האלה הם חלק מהתרגיל, לא המלצה למשך הלמידה שלכם.

לפני ההרצה, בדקו ביד את הרשימה: 20 לא נספר, 30 נספר ו־45 נספר. לכן הפלט הצפוי הוא 2. בקוד הבא השארנו טעות מכוונת. אם Python 3 כבר מותקן, שמרו אותו בקובץ session_count.py והריצו בסביבת העבודה שלכם. הקוד מקומי: אין בו רשת, קבצים חיצוניים או פרטים אישיים.

קראו את count כמונה שמתחיל באפס. בכל פעם שהתנאי מתקיים מוסיפים לו אחד. אל תתקנו עדיין את הקוד: הריצו תחילה את הגרסה הזאת ושמרו את הפלט, כדי שתהיה לכם דוגמה שאפשר לחזור אליה.

minutes = [20, 30, 45]
threshold = 30
count = 0

for duration in minutes:
    if duration > threshold:
        count = count + 1

print(count)

הקוד הזה מדפיס 1, אף שהדרישה והנתונים מחייבים 2. הפער הוא העדות שממנה מתחיל הדיבוג.

מצמצמים את הבעיה למפגש אחד של 30 דקות

שנו רק את שורת הרשימה ל־minutes = [ 30 ], והשאירו את שאר הקוד כפי שהוא. התחזית לפי הדרישה היא 1, אבל הגרסה עם הטעות מדפיסה 0. כעת אין צורך לעקוב אחרי כמה מפגשים: נתון יחיד כבר מראה את הבעיה.

ההשערה שנבדוק היא שהתנאי אינו כולל שוויון. ב־Python הסימן > משווה ׳גדול מ־׳ ואילו >= משווה ׳גדול או שווה ל־׳.[2] לכן עבור 30 מול סף 30, התנאי בגרסה עם הטעות אינו מתקיים. זו התאמה בין הסבר לבין מקרה נכשל, ולא רק ניחוש של תו אחר.

כדי לעקוב ידנית, שאלו בכל מעבר: מהו duration, האם התנאי מתקיים ומהו count לאחריו? על הרשימה המקורית, המונה בגרסה עם הטעות נשאר 0 אחרי 20, נשאר 0 אחרי 30 ועולה ל־1 אחרי 45. המקום הראשון שבו ההתנהגות סוטה מהדרישה הוא המפגש של 30 דקות.

המילה ׳לפחות׳ בדרישה כוללת את ערך הסף עצמו. מקרה הגבול הוא זה שהבדיל כאן בין שני התנאים.

מתקנים תנאי אחד, בלי להחליף את התוכנית

החזירו את הרשימה המקורית ושנו רק את התנאי מ־> ל־>=. אין צורך לשנות גם את המונה, את שמות המשתנים או את ההדפסה כדי לפתור את הפער הזה. הגרסה המלאה לאחר התיקון מופיעה כאן, כדי שאפשר יהיה להעתיק ולהשוות בלי לנחש היכן השינוי.

הפלט כעת הוא 2. ההסבר: 20 אינו מגיע לסף, 30 שווה לסף ו־45 גבוה ממנו. שני המפגשים האחרונים נספרים. בדיקה אחת שמתאימה לציפייה היא התחלה טובה, אבל עדיין נבדוק שהשינוי לא פגע במקרים אחרים.

minutes = [20, 30, 45]
threshold = 30
count = 0

for duration in minutes:
    if duration >= threshold:
        count = count + 1

print(count)

בודקים מקרה רגיל, שוויון ורשימה ריקה

בכל שורה בטבלה מחליפים רק את הרשימה בקוד המתוקן ומשאירים את הסף 30. כתבו את הפלט הצפוי לפני ההרצה. הטבלה מציגה תוצאות של ספירת מפגשים, לא ציונים או יעדי למידה.

למה לבחור דווקא את המקרים האלה? [ 30 ] בודק את הטעות המקורית; [ 29 ] ו־[ 31 ] בודקים את שני צדי הגבול; רשימה ריקה בודקת שאין מפגש שייספר; ושתי הופעות של 30 בודקות שסופרים כל מפגש, גם אם משכו זהה לאחר. בדיקות אלה אינן הוכחה לכל תוכנית אפשרית, אלא בדיקה ממוקדת של הדרישה שהגדרנו.

טקסט כמו "30", מספרים שליליים או נתונים שמגיעים מטופס אינם חלק מהקלט שהתרגיל הזה תומך בו. אם רוצים להרחיב אותו, צריך להחליט בנפרד איך לאמת או להמיר את הקלט. אל תוסיפו המרה רק כדי להעלים שגיאה בלי להבין אילו נתונים אמורים להתקבל.

בודקים מקרה רגיל, שוויון ורשימה ריקה — דף עבודה
רשימת דקותפלט צפוימה המקרה בודק
[20, 30, 45]2המקרה המקורי עם ערך מתחת, על הסף ומעליו
[ 30 ]1שוויון נכלל בדרישה
[ 29 ]0ערך אחד מתחת לסף
[ 31 ]1ערך אחד מעל הסף
[]0אין מפגשים לספור
[30, 30]2שני מפגשים נפרדים באותו משך
[0, 10, 29]0כל הערכים מתחת לסף, כולל אפס

אם יש בדיקה שאינכם יודעים להסביר את התוצאה הצפויה שלה, חזרו לדרישה לפני שמחליטים אם הקוד נכון.

דף תיעוד קצר: מה נכשל, מה שיניתי ואיך בדקתי

העתיקו למחברת חמש שורות: הדרישה; הקלט שמראה את הבעיה; צפוי מול בפועל; ההשערה והשינוי; בדיקות לאחר התיקון. בדוגמה שלנו: ׳לספור לפחות 30; הרשימה [ 30 ]; צפוי 1 ובפועל 0; התנאי לא כולל שוויון ולכן החלפתי > ב־>=; בדקתי גם [ 29 ], [ 31 ] ורשימה ריקה׳.

נסו להסביר את התיקון בלי להסתכל בקוד: מה בדיוק היה שגוי, למה הדוגמה הקטנה חושפת אותו ומדוע השינוי מתאים לדרישה. אם ההסבר הוא רק ׳ככה יצא נכון׳, חסר עדיין החיבור בין הכלל לבין הבדיקה.

אפשר לבקש עזרה ממורה, חבר או כלי AI, אבל בקשו תחילה רמז: ׳עבור הרשימה [ 30 ] ציפיתי ל־1 וקיבלתי 0. איזה חלק בדרישה כדאי להשוות לתנאי? אל תכתוב לי עדיין פתרון מלא׳. השתמשו רק בקוד שאתם מורשים לשתף, בלי סיסמאות, מידע אישי או שאלות חסויות. גם הצעת תיקון שקיבלתם צריכה לעבור את הבדיקות שלכם.

התרגול הבא: משנים את הדרישה, לא מנחשים פתרון

אחרי שהצלחתם להסביר את הדוגמה, בחרו סף אחר, למשל 45, והשאירו את הקוד המתוקן ללא שינוי נוסף. ברשימה המקורית התוצאה צריכה להיות 1, כי רק המפגש של 45 דקות מגיע לסף. אחר כך נסו רשימה שמכילה שני מפגשים בדיוק על הסף החדש. רשמו תחזית לפני כל הרצה.

כעת שאלו שאלה אחרת: מה היה צריך להשתנות אילו הדרישה הייתה ׳יותר מ־30 דקות׳ ולא ׳לפחות 30 דקות׳? במקרה הזה דווקא התנאי המקורי היה מתאים, והציפייה לרשימה המקורית הייתה 1. תו בקוד אינו נכון או לא נכון לבדו; בודקים אותו מול דרישה מסוימת.

אם התרגיל קשה בגלל משתנים או בחירת שפה, אפשר לחזור לבסיס לפני שמוסיפים כלי דיבוג. מדריך השפות באתר 8200 אקדמי מציע הקשר רחב יותר לבחירת שפת התחלה; הוא אינו נדרש כדי להריץ את התרגיל הזה. אם התחלתם ממבחן לדוגמה, חזרו לקושי אחד שמצאתם בו ובחרו לו דוגמה קטנה משלכם.

שאלות נפוצות

הקוד רץ בלי שגיאה. איך יודעים שהתוצאה נכונה?

מגדירים מראש מה צריך לקרות עבור נתונים מסוימים, מחשבים תוצאה צפויה ומשווים לפלט. בדוגמה כאן הקוד המקורי רץ, אבל מדפיס 1 במקום 2. היעדר הודעת שגיאה אינו מחליף בדיקה מול הדרישה.

האם צריך להתקין כלי דיבוג כדי להתחיל?

לא בשביל הדוגמה הזאת. אפשר להתחיל עם Python 3 בסביבת העבודה הקיימת, לעקוב אחרי המשתנים ביד ולהריץ מקרה קטן. אם ההפעלה עצמה אינה מוכרת, בקשו עזרה בהגדרת הסביבה. אין במדריך דרישה להתקין תוסף או להוריד קובץ תרגול.

מה ההבדל בין > לבין >= ב־Python?

עבור המספרים בתרגיל, > בודק אם הערך גדול מהסף, ו־>= בודק אם הוא גדול ממנו או שווה לו.[2] לכן 30 אינו מקיים ׳גדול מ־30׳, אבל כן מקיים ׳גדול או שווה ל־30׳. בוחרים לפי ניסוח הדרישה.

מה עושים כשיש הודעת שגיאה באנגלית?

שומרים את ההודעה המלאה, מתחילים מזיהוי סוג החריגה והפרטים בשורה האחרונה ואז קוראים את ההקשר שמעליה.[1] לא מניחים שכל סימון מצביע בדיוק על מקור הבעיה. אם מבקשים עזרה, מצרפים גם קוד קטן, נתונים ומה ניסיתם, בלי מידע רגיש.

האם פתרון התרגיל מעיד על מוכנות למיון טכנולוגי?

לא. הוא מתרגל קריאת דרישה, מעקב אחרי תנאי ובדיקת גבול בנושא אחד. אין כאן תיאור של מבחן רשמי, כיסוי של מסלול מיון או הערכה של סיכויי קבלה. השתמשו בו כדי לבחור את צעד הלמידה הבא שלכם.

מקורות להמשך הלמידה

  1. תיעוד Python הרשמי: שגיאות תחביר, חריגות וקריאת הודעות שגיאה
  2. תיעוד Python הרשמי: משתנים, מספרים ואופרטורי השוואה
  3. תיעוד Python הרשמי: תנאי if ולולאות for

רוצים לבדוק איך נראית למידה מונחית?

אפשר לעבור לעמוד שיעור הניסיון ולבדוק את אפשרות ההרשמה. זו דרך להכיר את ההמשך, לא הבטחה להתאמה או לקבלה למסלול. השיעור אינו מוטמע במדריך הזה.

לפרטים ולהרשמה לשיעור הניסיון

אין כל קשר רשמי בין "8200 אקדמי" ליחידת 8200 או לצה"ל | הקורס אינו מבטיח קבלה לתפקיד צבאי כלשהו