פוסט

המרת טיפוסים ב-Python

איך ממירים בין טיפוסים ב-Python עם int(), float(), str(), bool(), list(), tuple() ו-set(): מה כל המרה עושה, קיצוץ, בסיסים, אמת ושקר, ושגיאות כשההמרה נכשלת.

Python כמעט לא ממירה טיפוסים בשבילכם. "5" + 1 היא שגיאה, ולא 6. כשצריך מספר מטקסט, או טקסט ממספר, קוראים לפונקציית המרה בעצמכם. לפונקציות יש את אותם שמות כמו הטיפוסים, כך ש-int("5") בונה int מהמחרוזת “5”.

כל דוגמה כאן הורצה עם Python 3.13. ההתנהגות נבדקה מול התיעוד הרשמי של int() ופונקציות קשורות.

מטקסט למספר

int() ו-float() קוראות מחרוזת ומחזירות מספר:

print(int("42"), int("-7"), int("  8  "))
print(float("3.5"), float("1e3"))
42 -7 8
3.5 1000.0

int מתעלמת מרווחים בשני הקצוות של הטקסט. באמצע מותרות רק ספרות (וסימן אופציונלי).

מעבירים ל-int ארגומנט שני כדי לקרוא בבסיס אחר. לפי התיעוד, הבסיסים המותרים הם 0 ו-2 עד 36:

print(int("ff", 16), int("1010", 2))
255 10

ממספר לטקסט

str() הופכת כל ערך לטקסט. משתמשים בה כשרוצים לחבר טקסט ומספר עם +:

print(str(42) + "!")
print(str(3.0), str(True))
42!
3.0 True

אפשר גם לכתוב f"{age}", ולרוב זה ברור יותר (ראו את הפוסט על f-strings).

מ-float ל-int: קיצוץ

int() על float חותך את החלק העשרוני, לכיוון האפס:

print(int(3.9), int(-3.9))
3 -3

זה לא עיגול. כדי לעגל משתמשים קודם ב-round(), ואם צריך int ממירים אחר כך. round() מוסברת בפוסט על פעולות מספריות.

True ו-False כמספרים

bool היא תת-מחלקה של int, ולכן True נחשב 1 ו-False נחשב 0:

print(int(True) + 1)
2

אמת ושקר: bool()

bool() מחזירה True או False לפי בדיקת האמת של הערך. לפי התיעוד: “אם הארגומנט שקרי או לא סופק, מוחזר False; אחרת מוחזר True”. הערכים השקריים הם: 0, 0.0, "", [] ו-None. כל השאר אמת:

print(bool(0), bool(""), bool([]), bool(None), bool(0.0))
print(bool("0"))
False False False False False
True

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

בין סוגי אוספים

list(), tuple() ו-set() הופכות אוסף לאוסף אחר:

print(list("abc"))
print(tuple([1, 2]), set([1, 1, 2]))
['a', 'b', 'c']
(1, 2) {1, 2}

set מוחק כפילויות.

כשההמרה נכשלת

יש טקסטים שאי אפשר להפוך למספר. Python מעלה ValueError:

int("3.5")
ValueError: invalid literal for int() with base 10: '3.5'

"3.5" הוא מספר עשרוני, ו-int לא מקבל אותו. אם רוצים עשרוניים, ממירים עם float. מחרוזת ריקה נכשלת באותו אופן:

int("")
ValueError: invalid literal for int() with base 10: ''

כשהארגומנט הוא מסוג לא מתאים, מקבלים TypeError. למשל, None אינו טקסט ואינו מספר:

int(None)
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'

בודקים את קלט המשתמש קודם, או תופסים את השגיאה עם try ו-except (פוסט על חריגות).

מה הלאה

בפוסט הבא: input(), שקוראת טקסט מהמשתמש וצריכה המרת טיפוסים מיד.