מספרים

מספר הוא טיפוס הנתונים הנפוץ ביותר בכל שפת תכנות. אנחנו קולטים נתונים מספריים, מבצעים חישובים מספריים ואפילו משתמשים במספרים כדי להגדיר ולספור כמות פעמים שתכנית מסוימת צריכה להתבצע (זה נקרא לולאה ועל הנושא הזה אסביר בהמשך בהרחבה). בפייתון אנחנו מבצעים הבדלה בין שני סוגים עיקריים של מספרים – מספרים שלמים (integers) ומספרים עשרוניים (floats). חשוב להבדיל בין מספר לבין מחרוזת המורכבת מספרות. דוגמה קטנה להמחשה:

number הוא משתנה המכיל מספר. אנחנו יודעים את זה מעצם העובדה שהוא מקבל מספר ללא גרשיים או מרכאות, וכשאנו בודקים את הטיפוס שלו בעזרת הפונקציה type אנחנו מקבלים את התשובה int שזה קיצור של integer – מספר שלם. כאשר המשתנה מוכפל ב-3 אנחנו מקבלים את התוצאה שהיינו מצפים לה – 300. עכשיו נגדיר משתנה בשם not_a_number שיאותחל לערך דומה

טוב, אז אולי בעצם לא כל כך דומה. הספרות הן אותן ספרות אבל הגרשיים שעוטפים את הערך הופכים את המשתנה למשתנה מחרוזתי ואנחנו מקבלים אישור לכך באמצעות פונקציית type שמחזירה הפעם את הערך str – כלומר מחרוזת. פירוש הדבר הוא שפייתון אינה מתייחסת לספרות כאל מספר אמיתי אלא כעל אוסף של תווים, 1-0-0, ללא כל משמעות מתמטית. כאשר נבצע הכפלה על הערך הזה נקבל את רצף התווים 3 פעמים. הדבר שקול לשרשור המחרוזת לעצמה 3 פעמים. מספרים בפורמט מחרוזתי הן לא דבר נדיר כמו שאולי נראה במבט ראשון. מספרי זהות, מספרי רישוי, מספרי טלפון, מספרי בניינים בכתובות, מיקודים ועוד ועוד. אלה מספרים שאף פעם לא נתייחס אליהם כאל "מספרים" – לעולם לא נבצע עליהם חישובים חשבוניים והרבה פעמים הם לא באמת מתנהגים כמו מספרים (יכולים להתחיל ב-0, יכולים להכיל מקפים, סוגריים או סימנים אחרים)

חישובים על מספרים

בפרק על ביטויים ליטרלים ראינו כיצד ניתן לבצע את הפעולות החשבוניות הבסיסיות ביותר -חיבור, חיסור, כפל, וחילוק. בנוסף ראינו שאפשר לחשב חזקות באמצעות זוג כוכביות (**), אבל אפשר לבצע את אותו החישוב גם באמצעות הפונקציה pow המקבלת זוג מספרים כפרמטרים ומחזירה לנו את התוצאה של המספר הראשון בחזקת המספר שני.

בנוסף, הפונקציה pow יכולה לקבל פרמטר שלישי אשר מגדיר מודולו על תוצאה החזקה

הדוגמה הזאת מקבילה לחישוב 5 % (4**3) (השארית של 64 חלקי 5 היא 4) אבל פייתון תבצע את החישוב באופן מעט יותר יעיל כאשר נשתמש בפונקציה.

כדי לחשב שורש ריבועי, לעומת זאת כבר נאלץ לייבא ספרייה נוספת

הספרייה math מכילה עשרות פונקציות לחישובים מתקדמים יותר כך שאם אתם מגיעים מתחומי המתמטיקה, פיזיקה, סטטיסטיקה, הנדסה וכו' כדאי לכם להכיר אותה היטב.
חישוב ערך מוחלט (מרחק מ-0) ניתן לקבל באמצעות הפונקציה abs

עיגול מספרים

הפונקציה round עוזרת לנו לעגל מספרים עשרוניים

שימו לב שהתוצאה חזרה בפורמט עשרוני. אפשר לראות את זה ע"פ הנקודה העשרונית וספרת ה-0 שנמצאת אחריה. מבחינת ערך המספר הזה שווה ל-5 שלם אבל עדיין מדובר בנתון מטיפוס שונה.

המונח float נפוץ מאוד בשפות מחשב והכוונה היא לנקודה העשרונית ש"צפה" בין הספרות ומיקומה קובע את גודלו של המספר. תזוזה של מיקום אחד לשמאל תקטין את המספר פי 10. תזוזה ימינה – תגדיל אותו פי 10
בפייתון 2, כל פעולה חשבונית על שני מספרים שלמים תמיד תחזיר מספר שלם. בכל מקרה אחר (אחד מהמספרים או שניהם עשרוניים) התוצאה תהיה עשרונית. זאת הסיבה שביצוע פעולת עיגול על מספר עשרוני מחזירה לנו ערך מטיפוס עשרוני, גם אם הוא שווה למספר שלם. במידה ונרצה לעגל עד למקום מסוים לאחר הנקודה העשרונית (למשל לקבל מספר מדו"ח בנקאי המציג 4 ספרות אחרי נקודה עשרונית ולהציג אותו בדו"ח תקציבי עם 2 ספרות אחרי הנקודה בלבד), ניתן להוסיף לפונקציית round פרמטר המגדיר את מידת הדיוק שנרצה לקבל בתוצאה, כלומר, כמה ספרות יש להציג אחרי הנקודה העשרונית.

round מבצעת עיגול משתנה, זאת אומרת שאת הספרות 0-4 היא תעגל למטה בעוד שאת הספרות 5-9 תעגל למעלה. אם אנחנו רוצים לוודא עיגול בכיוון מסוים אנחנו יכולים להשתמש בפונקציות בעלות השמות הציוריים ceil (תקרה – תמיד תעגל למעלה) ו-floor (רצפה – תמיד תעגל למטה). הפונקציות האלה לא יכולות לקבל פרמטר נוסף לקביעת דיוק ולכן תמיד יעגלו למספר שלם (אך עדיין מטיפוס עשרוני). שתי הפונקציות האלה הן חלק מספריית math שראינו קודם ולכן גם כדי להשתמש בהן נצטרך לייבא את הספרייה.

יצירת מספרים אקראיים

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

הפונקציה random מספריית random מייצרת מספר אקראי עשרוני בין 0 ל-1

הפונקציה randint כבר הרבה יותר שימושית, ומייצרת לנו ערך מספרי שלם בין שני מספרים שלמים

הפונקציה randint מקבלת מספרים שלמים בלבד (גם שליליים) ומחזירה מספר שלם. המספר יכול לכלול את ערכי הקצה שהגדרתם (בדוגמה הזאת, למשל, הגדרתי מספר אקראי בין 1 ל-10 ולכן המספר שאקבל בחזרה יכול להיות 1 או 10 או כל מספר שלם ביניהם). כמו כן המספר הראשון חייב להיות קטן מהמספר השני.

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

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