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 משנה את הערך שעליו מצביע הקישור, כך שכל שם אחר המצביע על אותו ערך רואה את השינוי.