פייתון

נושא

השגיאות שפגשנו

שמונה שגיאות, ועוד אחת שלא מודיעה על עצמה.

מגיע מיחידות: 2, 3, 4, 5, 6, 7, 8

בעמוד הזהאיך קוראים TracebackהטבלהTypeError: חמש פניםהשארהשגיאה השקטהבדיקה עצמית

איך קוראים Traceback

  1. השורה האחרונה קודם. שם כתוב סוג השגיאה והסבר קצר
  2. מספר השורה אומר איפה פייתון נתקעה
  3. הסמן הקטן (^) מצביע על המקום המדויק בשורה

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

הטבלה

שגיאה מה היא אומרת איפה ראינו התיקון
SyntaxError הקוד לא בנוי לפי חוקי השפה 3.1: מרכאות. 5.3: ברירת מחדל לפני פרמטר בלי לתקן את הכתיבה
IndentationError הזחה במקום הלא נכון 4.1: רווחים בתחילת שורה ארבעה רווחים, רק בתוך בלוק
TypeError פעולה שהטיפוס לא תומך בה 2.3, 3.3, 5.1, 6.2, 8.1 הסבה, או טיפוס אחר
NameError שם שלא מוכר כאן 5.2: משתנה לוקאלי מחוץ לפונקציה לבדוק איות וטווח הכרה
IndexError מיקום שלא קיים 3.3, 6.3 לבדוק את len
ValueError הערך לא מתאים 6.3: remove של ערך שאינו ברשימה לבדוק עם in לפני
KeyError מפתח שלא קיים במילון 8.3 לבדוק עם in לפני
שגיאה לוגית אין הודעה. התוכנית עושה משהו אחר 7.1: לולאה שלא נגמרת לבדוק את ההנחות

TypeError: חמש פנים

אותה שגיאה, חמש סיבות שונות. מה שמשותף להן: הטיפוס לא מתאים לפעולה.

>>> "5" ** 2
Traceback (most recent call last):
  ...
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
>>> "Change me"[0] = "S"
Traceback (most recent call last):
  ...
TypeError: 'str' object does not support item assignment
>>> ("a", "b")[0] = "c"
Traceback (most recent call last):
  ...
TypeError: 'tuple' object does not support item assignment
>>> ["H"] + "O"
Traceback (most recent call last):
  ...
TypeError: can only concatenate list (not "str") to list
>>> def square(number):
...     return number ** 2
...
>>> square()
Traceback (most recent call last):
  ...
TypeError: square() missing 1 required positional argument: 'number'

השאר

>>> 'I really hope defining this string will work"
Traceback (most recent call last):
  ...
SyntaxError: unterminated string literal (detected at line 1)
>>> "joker"[5]
Traceback (most recent call last):
  ...
IndexError: string index out of range
>>> ["Earth"].remove("Pluto")
Traceback (most recent call last):
  ...
ValueError: list.remove(x): x not in list
>>> {"copy": "Ctrl+C"}["cut"]
Traceback (most recent call last):
  ...
KeyError: 'cut'

בגרסאות ישנות ה-SyntaxError של מרכאה פתוחה מנוסח EOL while scanning string literal, וזה מה שמופיע בסרטון.

השגיאה השקטה

answer = input("How many months? ")
while answer != 7:
    answer = input("Try again: ")

התוכנית לא קורסת, ואין שום הודעה. היא פשוט שואלת לנצח, כי "7" אינו 7. שגיאה לוגית היא הקשה ביותר, כי אין מה לקרוא. מה שעוזר: להדפיס ערכים באמצע (print(answer, type(answer))) ולבדוק את ההנחות.

בדיקה עצמית

איזו שגיאה תתקבל?

  1. print("hello')
  2. [1, 2, 3][3]
  3. "3" + 3
  4. {"a": 1}["b"]
  5. if True: ושורה אחריה בלי הזחה
  6. def f(): y = 1, ואז print(y)

תשובות. 1: SyntaxError. 2: IndexError, כי המיקום האחרון הוא 2. 3: TypeError. 4: KeyError. 5: IndentationError. 6: NameError, כי y לוקאלי.