פוסט

פעולות על מספרים ב-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() במקום ==.

מה הלאה

בפוסט הבא: המרת טיפוסים, איך הופכים טקסט למספרים ובחזרה.