פוסט
פעולות על מספרים ב-Python
אופרטורים חשבוניים ב-Python: + - * / // % ו-**, ההבדל בין חילוק אמיתי לחילוק עם עיגול למטה, round, המודול math, ולמה floats אינם מדויקים.
Python מחשבת כמו שמצפים, עם כמה פרטים שחשובים: / ו-// הן פעולות שונות, ו-round() לא תמיד מעגל חצאים כלפי מעלה.
כל דוגמה הורצה עם Python 3.13 ונבדקה מול התיעוד של טיפוסי המספרים.
האופרטורים הבסיסיים
print(7 + 2, 7 - 2, 7 * 2)
print(2 ** 10)
9 5 14
1024
** הוא אופרטור החזקה: 2 ** 10 הוא 2 בחזקת 10.
סדר הקדימויות הרגיל: קודם **, אחר כך *, /, // ו-%, ואז + ו--. כשלא בטוחים, סוגריים:
print(2 + 3 * 4 ** 2)
50
4 ** 2 הוא 16, 3 * 16 הוא 48, ו-2 + 48 הוא 50.
חילוק אמיתי וחילוק עם עיגול למטה
/ תמיד נותן float, ו-// מעגל למטה למספר שלם:
print(7 / 2)
print(7 // 2)
print(10 / 4 * 2)
3.5
3
5.0
// מעגל לכיוון מינוס אינסוף, לא לכיוון האפס: 1//2 הוא 0, (-1)//2 הוא -1, ו-1//(-2) הוא -1. אותו כלל חל על floats:
print(1 // 0.5, -7.5 // 2)
2.0 -4.0
השארית: %
% נותן את השארית אחרי החילוק: 7 % 2 הוא 1. יש לו פוסט משלו: במה הוא שימושי, איך הוא מתנהג עם מספרים שליליים, ו-divmod().
אופרטורי השמה
הקיצור += מהפוסט על משתנים קיים לכל האופרטורים כאן: -=, *=, /=, //=, %= ו-**=:
x = 5
x += 2
x *= 3
print(x)
21
פונקציות מובנות
abs מחזירה ערך מוחלט. round מעגלת למספר הקרוב:
print(abs(-3.5))
print(round(2.5), round(3.5))
print(round(2.675, 2))
3.5
2 4
2.67
Python מעגלת חצאים למספר הזוגי הקרוב. round(2.675, 2) נותן 2.67, כי 2.675 נשמר כ-float קצת קטן ממנו.
המודול math
לשורש ריבועי, עיגול למעלה או למטה ופונקציות נוספות מייבאים את math:
import math
print(math.sqrt(16), math.floor(3.7), math.ceil(3.2))
4.0 3 4
math.floor מעגל למטה ו-math.ceil למעלה, ושתיהן מחזירות int.
floats אינם מדויקים
מחשבים שומרים את רוב השברים העשרוניים כקירוב:
print(0.1 + 0.2)
0.30000000000000004
זה לא באג של Python: ככה פועלים floats בבסיס בינארי. לכסף או להשוואות מדויקות משתמשים במודול decimal, או משווים עם math.isclose() במקום ==.
מה הלאה
בפוסט הבא: המרת טיפוסים, איך הופכים טקסט למספרים ובחזרה.