2.2. משתנים וטיפוסים בסיסיים

משתנה הוא שם שאתה מקשר לערך באמצעות האופרטור =. לאחר ההשמה, ניתן להשתמש בשם בכל מקום שבו ניתן להשתמש בערך:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

הצד הימני של = מוערך תחילה, ואז התוצאה מקושרת לשם שמשמאל. קריאת שם שמעולם לא הושם מעלה NameError.

משתנה הוא רק תווית. הוא מצביע על ערך – הערך חי במקום אחר, ולאותו ערך יכול להיות כל מספר של תוויות.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

משתנים הם תוויות המצביעות על ערכים. השמה מחדש של משתנה מזיזה את התווית; היא לא משנה את הערך שעליו התווית הצביעה קודם.

2.2.1. כללי שמות

  • שמות מתחילים באות או בקו תחתון ועשויים להכיל אותיות, ספרות וקווים תחתונים. frame_count ו-_internal בסדר; 1st_frame היא שגיאת תחביר.

  • שמות רגישים לאותיות גדולות/קטנות: Width ו-width הם שני משתנים שונים.

  • הימנע משימוש חוזר בשמות מובנים כמו list, str, id(), או print() – הסתרתם אינה מעלה שגיאה, אך הפונקציה המובנית המקורית הופכת בלתי נגישה לשארית הסקריפט.

  • מוסכמה: snake_case עבור משתנים ופונקציות, ALL_CAPS עבור קבועים שאינך מתכוון לשנות, CamelCase עבור שמות מחלקות.

2.2.2. טיפוסים בסיסיים

לכל ערך ב-Python יש טיפוס הקובע אילו פעולות הוא תומך. ארבעת הטיפוסים שתכתוב הכי הרבה הם:

  • int – מספרים שלמים, חיוביים או שליליים. מספרים שלמים ב-MicroPython גדלים עד כמה שהזיכרון מאפשר. ליטרלים נכתבים כספרות פשוטות: 0, 42, -7. גם ליטרלים הקסדצימליים (0x1A), אוקטליים (0o17) ובינאריים (0b1010) תקפים ושימושיים לאוגרים ולמסכות סיביות.

  • float – מספרים עם נקודה עשרונית או מעריך: 3.14, 1.0, -0.5, 2e6 (= 2,000,000.0). כל ה-float במצלמה הם IEEE 754 ברוחב 32 סיביות – מדויקים עד כשבע ספרות משמעותיות.

  • bool – אחד משני הליטרלים True או False (שים לב לאות הגדולה).

  • str – טקסט, נכתב כתווים בין מרכאות בודדות או כפולות: "hello", 'OpenMV'. שני סגנונות המרכאות שקולים; בחר את זה שמאפשר לך להימנע מהבריחה (escaping) של תווי המרכאות המופיעים בתוך המחרוזת.

ישנו גם ערך חמישי ששווה להכיר מיד:

  • None – הערך היחיד מטיפוס NoneType. משמש לציון ”אין ערך“ או ”לא נקבע עדיין“. פונקציות שאינן מחזירות דבר במפורש מחזירות באופן מובלע None.

2.2.3. בדיקת טיפוסים והמרתם

הפונקציה המובנית type() מחזירה את הטיפוס של כל ערך:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

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

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

המרות שאינן מוגדרות היטב מעלות ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. השמה מחדש וטיפוסיות דינמית

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

x = 42
x = "now I'm a string"
x = 3.14

Python אינה מקשרת משתנה לטיפוס. קוד התלוי בכך ש-x הוא מספר שלם פשוט מצפה למספר שלם בנקודה שבה הוא משתמש בו; אם הוא מקבל משהו אחר, אתה מקבל TypeError בזמן ריצה.

הערה

השמה מחדש של x אינה משנה את הערך שעליו הצביע הקישור הישן. אם שני שמות חולקים את אותו ערך, השמה מחדש של אחד אינה משפיעה על השני:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

שינוי (mutation) של ערך משותף שונה: מתודה כמו list.append משנה את הערך שעליו מצביע הקישור, כך שכל שם אחר המצביע על אותו ערך רואה את השינוי.