למה טיפוסים בכלל חשובים
טיפוס הוא פשוט קטגוריה שאומרת ל-Python איך ערך צריך להתנהג. חיבור של שני מספרים שלמים הוא פעולה חשבונית; חיבור של שתי מחרוזות מצרף אותן; חיבור של מחרוזת למספר שלם הוא שגיאה. הטיפוס של ערך קובע אילו פעולות הגיוניות עליו.
ל-Python יש סט קטן וידידותי של טיפוסים מובנים. בארבעה מהם, int, float, str ו-bool, תשתמשו כמעט בכל תוכנית שתכתבו. השאר מופיעים כשמתחילים לארגן נתונים באוספים.
מספרים: int ו-float
יש שני סוגי מספרים, ו-Python בוחרת איזה מהם תקבלו לפי הדרך שבה כתבתם אותו:
אין נקודה עשרונית? מקבלים int. יש נקודה עשרונית? מקבלים float. אפשר לערבב ביניהם בחופשיות בחישובים: כל פעולה שמעורב בה float מחזירה float:
מספרים שלמים ב-Python יכולים להיות גדולים ככל שהזיכרון מאפשר: אין גלישה, ואין תקרה קבועה של 32 או 64 ביט. אפשר לחשב 2 ** 1000 ו-Python תחזיר כל ספרה וספרה.
מספרי float פועלים לפי כללי IEEE 754 הרגילים, ולכן יש כמה הפתעות קלאסיות:
זה מדפיס 0.30000000000000004, לא 0.3. זה לא באג ב-Python: כך עובדת נקודה צפה בינארית בכל שפה. כשצריך ערכים עשרוניים מדויקים (למשל כסף), השתמשו במודול decimal. לכל השאר, עיגול בזמן התצוגה בדרך כלל מספיק.
מחרוזות: str
מחרוזות הן רצפים של תווים. עוטפים אותן במירכאות בודדות או כפולות. ל-Python לא משנה באילו, כל עוד מירכאות הפתיחה והסגירה תואמות:
מחרוזות במירכאות משולשות (""" ... """) יכולות להשתרע על פני כמה שורות:
למחרוזות יש API עצום שתלמדו עם הזמן: חיתוך, מתודות כמו .upper(), .split() ו-.replace(), ועיצוב f-string שנותן לכם f"Hello, {name}". יש עמוד ייעודי על מחרוזות מיד בהמשך.
בוליאנים: bool
שני ערכים, שנכתבים בדיוק כך: True ו-False, עם אות גדולה בהתחלה. השוואות מחזירות בוליאנים:
מאחורי הקלעים, True ו-False הם ממש 1 ו-0, כך שאפשר לסכם בוליאנים אם צריך לספור כמה תנאים התקיימו:
None: היעדר ערך
None היא הדרך של Python לומר "אין ערך". פונקציות שלא מחזירות משהו במפורש מחזירות None. תשתמשו בו גם כממלא מקום:
המוסכמה היא לבדוק עם is None ו-is not None, ולא עם == None. is בודק זהות, וזה מה שבאמת מתכוונים אליו כאן.
רשימות, tuples, קבוצות ומילונים
אלה ארבעת טיפוסי האוספים המובנים. כל אחד מהם מוסבר בפירוט בעמוד משלו, אבל הנה סקיצה מהירה כדי שתזהו אותם:
כללי אצבע:
- List: רצף שאתם מצפים שישתנה. הוספה, הסרה, מיון: הכל בסדר.
- Tuple: רצף שאתם רוצים להגן עליו משינוי. משמש הרבה לרשומות בצורה קבועה, כמו קואורדינטות
(x, y). - Set: שק של פריטים ייחודיים, כשכפילויות יהיו באג.
- Dict: חיפוש לפי מפתח. המבנה בצורת JSON.
המרה בין טיפוסים
Python לא תמיר טיפוסים בשבילכם אוטומטית כשזה עלול להיות מסוכן. הפיכת מספר שלם למחרוזת, או מחרוזת למספר, היא משהו שמבקשים במפורש:
אם המרה לא הגיונית, למשל int("hello"), Python זורקת ValueError ואומרת לכם מה העברתם לה. שגיאה, הסבר, מתקנים וממשיכים.
בדיקת טיפוס
שני כלים שכדאי להכיר:
type() מצוינת להצצה מהירה ב-REPL. isinstance() היא מה שמשתמשים בו בקוד אמיתי, כי היא מסתדרת טוב עם ירושה ויכולה לבדוק מול כמה טיפוסים בבת אחת.
תרגיל סקירה קצר
נסו להריץ את הבלוק הבא כמו שהוא, ואז שנו כמה ערכים וראו לאילו טיפוסים הם הופכים:
עוד לא צריך להבין את for, נגיע לזה, אבל זה נותן תחושה של הטיפוסים המובנים במבט אחד.
בחרו את הטיפוס שמתאים לנתונים
לא צריך לשנן עכשיו כל טיפוס. כן צריך לדעת לזהות טיפוס כשרואים אותו, ולבחור את הנכון כשיוצרים נתונים. "האם זה קבוע או משתנה? ייחודי או לא? האם אני מחפש לפי מפתח או לפי מיקום?" השאלות האלה בוחרות את טיפוס האוסף בתשעים אחוז מהמקרים.
בהמשך: מחרוזות לעומק, כי זה טיפוס הנתונים היחיד שתיגעו בו כמעט בכל תוכנית.
שאלות נפוצות
מהם טיפוסי הנתונים העיקריים ב-Python?
מספרים (int ו-float), מחרוזות (str), בוליאנים (bool), None, וארבעה טיפוסי אוספים: list, tuple, set ו-dict. כל השאר שרואים בקוד Python בנוי מהם ומעוד כמה טיפוסים (bytes, complex, frozenset).
איך בודקים את הטיפוס של ערך ב-Python?
עטפו אותו ב-type(): type(42) מחזירה <class 'int'>, ו-type('hi') מחזירה <class 'str'>. לבדיקת כן/לא, השתמשו ב-isinstance(value, int): היא גמישה יותר כי היא מטפלת גם בתת-מחלקות.
האם Python היא שפה עם טיפוסים סטטיים או דינמיים?
דינמיים. משתנה יכול להצביע על ערך מכל טיפוס, ואותו משתנה יכול לשנות טיפוס במהלך חייו. זה שונה משפות כמו Java או C++, שבהן מצהירים על הטיפוס של משתנה פעם אחת והוא לא יכול להשתנות.