Python operatörleri: aritmetik, // ve %, karşılaştırma, and/or/not ve round ile yuvarlama
Python'da / her zaman float verir, // sonucu aşağı yuvarlayarak tam kısmı, % kalanı, ** ise üssü hesaplar. round(x, n) bankacılık yuvarlamasıyla n basamağa yuvarlar: round(2.5) sonucu 2, round(3.5) sonucu 4'tür; yukarı ve aşağı tam sayıya yuvarlamayı math.ceil ve math.floor, sayının mutlak değerini ise abs yapar.
Python operatörleri değerleri yeni değerlere dönüştüren işaretlerdir: + toplar, // tam böler, and koşulları birleştirir. Aşağıda operatörlerin tam listesi, / ile // arasındaki fark, and, or, not mantığı ve yuvarlama fonksiyonları — python round, math.ceil, math.floor ve abs — örneklerle anlatılıyor. Tüm örnekleri REPL'e yapıştırıp kendiniz deneyebilirsiniz.
Python operatörlerinin listesi
Operatörler amaçlarına göre gruplanır. Tabloyu baştan sona ezberlemeniz gerekmez: gerçek kodda en sık aritmetik, karşılaştırma ve mantıksal bağlaçlar kullanılır.
| Grup | Operatörler | Örnek |
|---|---|---|
| Aritmetik | + - * / // % ** | 7 // 2 → 3 |
| Karşılaştırma | == != < > <= >= | 3 < 5 → True |
| Mantıksal | and or not | not True → False |
| Özdeşlik | is, is not | x is None |
| Üyelik | in, not in | "ah" in "kahve" → True |
| Atama | = += -= *= /= //= %= **= | total += 250 |
| Walrus | := | if (n := len(s)) > 10: |
| Bit düzeyinde | & | ^ ~ << >> | 5 & 3 → 1 |
Aritmetik operatörler
Toplama, çıkarma ve çarpma okul matematiğindeki gibi çalışır. İfadede en az bir float varsa sonuç da float olur: 2 + 1.0 sonucu 3.0. Python'da tam sayılar taşmaz — 2 ** 100 kaç basamak çıkarsa çıksın tam hesaplanır.
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
Python'da üs alma: ** operatörü
Üs alma iki yıldızla yazılır, ^ ile değil: Python'da ^ bit düzeyinde «özel VEYA» anlamına gelir ve 2 ^ 3 sonucu 8 değil 1'dir. Kesirli üs kök alır: 9 ** 0.5 sonucu 3.0. Bunun bir de fonksiyon biçimi vardır: pow(x, y) aynı işi yapar, üçüncü argümanla kalan da hesaplanabilir: pow(2, 10, 1000) sonucu 24'tür.
Önceliğe dikkat edin: **, tekli eksiden önce çalışır, bu yüzden -2 ** 2 sonucu -4'tür. Negatif bir sayının karesini istiyorsanız parantez kullanın: (-2) ** 2.
Python'da bölme: /, // ve %
Python'da iki tür bölme vardır ve bu, yeni başlayanlar için sürprizlerin ana kaynağıdır. Normal bölme / her zaman float döndürür, tam bölünse bile. Tam sayı bölmesi // kesirli kısmı atar, % ise kalanı verir.
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
Tam bölme // ve kalan %: uygulamada
// ile % çifti «kaç tam var, ne kadar kaldı» sorularını çözer. Kursta harcama takipçisi, hassasiyeti kaybetmemek için parayı kuruş olarak tutar ve tutarı lira ile kuruşa böler:
kopecks = 125050 # parayı kuruş olarak tutuyoruz
lira = kopecks // 100 # 1250 — tam lira
kurus = kopecks % 100 # 50 — kalan
print(lira, kurus) # 1250 50
print(40 // 7, "hafta ve", 40 % 7, "gün") # 5 hafta ve 5 gün
İki işlemin sonucunu birlikte veren yerleşik fonksiyon divmod'dur: divmod(125050, 100) (1250, 50) demetini döndürür. Kalan çift-tek kontrolü için de işe yarar: n % 2 == 0 çift sayılar için doğrudur.
Negatif sayılar: // aşağı yuvarlar
// operatörü kesri sadece atmaz, aşağı, eksi sonsuza doğru yuvarlar. Pozitif sayılarda fark yoktur, negatiflerde vardır. Python'da % kalanının işareti bölenin işaretiyle aynıdır; bu yüzden her zaman a == (a // b) * b + a % b eşitliği geçerlidir.
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2) # kesri atar, aşağı yuvarlamaz
-3
Sıfıra bölme: hangi hata çıkar
Üç operatörden herhangi biriyle sıfıra bölmek ZeroDivisionError istisnasını fırlatır. Bu hem tam, hem kesirli sayılar için geçerlidir. Bunu try/except ile yakalayabilir ya da bölenin sıfır olmadığını önceden kontrol edebilirsiniz.
>>> 10 / 0
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 1500 / count if count else 0
>>> avg
0
Karşılaştırma operatörleri
Karşılaştırmalar True veya False döndürür. Eşitlik iki == işaretiyle kontrol edilir, tek = ise atamadır. Metinler karakter kodlarına göre karakter karakter karşılaştırılır; bu yüzden "A" < "a" doğrudur: büyük harfler küçük harflerden önce gelir.
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10 # zincir: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False
Karşılaştırma zincirleri, örneğin 0 <= x < 100, Python'un kullanışlı bir özelliğidir: and yazmanız gerekmez. Son satır ise kesirli sayılardaki hata payını hatırlatır: 0.1 + 0.2 sonucu 0.30000000000000004'tür. Kesirli sayıları math.isclose(a, b) ile karşılaştırın, parayı ise kuruş olarak ya da Decimal içinde tutun.
Mantıksal operatörler and, or, not
Python'da mantıksal operatörler && ve || gibi simgelerle değil, kelimelerle yazılır. and iki taraf da doğruysa doğrudur, or taraflardan en az biri doğruysa, not değeri tersine çevirir.
| a | b | a and b | a or b | not a |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
Öncelik sırası: önce not, sonra and, sonra or. True or False and False ifadesi True sonucunu verir, çünkü and önce hesaplanır. Karmaşık koşullarda parantez kullanın — hem sizin, hem ekibinizin işine yarar.
and ve or aslında ne döndürür
and ve or her zaman True veya False döndürmez, operandlardan birini döndürür. or ilk doğru değeri (doğru yoksa son değeri), and ise ilk yanlış değeri (yanlış yoksa son değeri) verir. Yanlış sayılan değerler: 0, 0.0, boş metin, boş koleksiyonlar, None ve False.
>>> name = ""
>>> name or "Misafir"
'Misafir'
>>> 5 and 0
0
>>> not ""
True
Değerlendirme tembeldir: sonuç sol taraftan belliyse sağ taraf hesaplanmaz. Bu yüzden count and total / count, count == 0 olduğunda sıfıra bölme hatası vermez. not ise diğer ikisinden farklı olarak her zaman bool döndürür.
is ve in operatörleri
== değerleri karşılaştırır, is ise iki adın aynı nesneyi gösterip göstermediğini kontrol eder. İki ayrı boş sepet eşittir, ama aynı nesne değildir. is'in sürekli gerekli olduğu tek yer None kontrolüdür: if x is None.
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
Sayıları ve metinleri is ile karşılaştırmayın: bazen iç önbellekleme yüzünden «çalışır», ama sonuç uygulamaya bağlıdır ve Python x is 5 gibi yapılarda SyntaxWarning uyarısı verir.
in operatörü üyeliği kontrol eder: bir metinde alt metni, listede öğeyi, sözlükte anahtarı. not in ise tersini kontrol eder.
>>> "kahve" in "kahve yanında"
True
>>> "yemek" in {"yemek": 450, "taksi": 300}
True
>>> 5 not in [1, 2, 3]
True
Atama operatörleri ve walrus operatörü :=
+=, -=, *=, //= ve diğer birleşik operatörler kısaltmadır: total += 250, total = total + 250 anlamına gelir. Python'da ++ ve -- operatörleri yoktur: x++ sözdizimi hatası verir.
Walrus operatörü := (adı, iki noktaya benzeyen gözleriyle ve dişleriyle morsa benzediği için verildi) değeri doğrudan bir ifadenin içinde atar. Değeri hem kontrol edip hem sonra kullanmak istediğinizde işe yarar:
items = ["kahve", "taksi", "öğle yemeği", "sinema"]
if (n := len(items)) > 3:
print(f"Çok fazla harcama: {n}")
while (line := input("Tutar: ")) != "":
print(int(line) * 2)
Walrus olmadan len fonksiyonunu iki kez çağırmak ya da atamayı ayrı bir satıra koymak gerekirdi. Ama abartmayın: satır okunmaz hale gelirse, normal atama daha iyidir.
Python'da yuvarlama: round, ceil, floor
Python'da yuvarlama için yerleşik round fonksiyonu ve math modülünün fonksiyonları vardır. Farklı işleri yaparlar ve bunları karıştırmak sık yapılan bir hatadır.
| Fonksiyon | Ne yapar | 2.5 | -2.5 | 2.7 |
|---|---|---|---|---|
round(x) | en yakına, yarıda çifte | 2 | -2 | 3 |
math.floor(x) | aşağı, eksi sonsuza | 2 | -3 | 2 |
math.ceil(x) | yukarı, artı sonsuza | 3 | -2 | 3 |
math.trunc(x), int(x) | kesri atar, sıfıra doğru | 2 | -2 | 2 |
Python round fonksiyonu ve bankacılık yuvarlaması
round(x, n) sayıyı virgülden sonra n basamağa yuvarlar; ikinci argüman verilmezse tam sayı (int) döndürür. Asıl tuzak şudur: python round yarıyı «bankacılık usulü» yuvarlar — yarıyı en yakın çift sayıya. Bu yüzden round(2.5) sonucu 2, round(3.5) sonucu 4'tür. Büyük hesaplamalarda yuvarlama hataları böylece tek yöne birikmez.
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2) # yüzlüklere
1200
>>> round(2.675, 2) # 2.68 değil: ikili gösterimde 2.67499...
2.67
Okulda öğretilen «yarıyı yukarı» yuvarlama gerekiyorsa, örneğin bir fişte, ROUND_HALF_UP modlu Decimal kullanın. Sayıyı float hatasını devralmamak için metin olarak verin:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
Kurstan bir kural daha: yuvarlamayı yalnızca çıktıda yapın. Güzel yazdırmak için round gerekmez — f-string yeterlidir: f"{amount:.2f}" iki basamak gösterir, sayının kendisi ise hassas kalır.
math.ceil ve math.floor: yukarı ve aşağı yuvarlama
math.ceil, «yetmemesi» kabul edilemez olduğunda gerekir: kaç otobüs sipariş edilecek, kaç sayfa çıkacak. math.floor ise yalnızca tam birimler sayıldığında kullanılır. İkisi de int döndürür.
import math
guests = 47
seats = 20
print(math.ceil(guests / seats)) # 3 otobüs
print(math.floor(9.99)) # 9
print(-(-guests // seats)) # 3 — math olmadan ceil, // ile numara
math modülünde başka yararlı fonksiyonlar da vardır: math.sqrt (kök), math.isclose (kesirleri karşılaştırma), math.pi, math.gcd. Python 3.15'te tam sayı matematiği için math.integer alt modülü geldi (PEP 791): içinde comb, factorial, gcd, isqrt, lcm, perm bulunur; eski math.gcd ve diğerleri çalışmaya devam eder.
abs fonksiyonu: sayının mutlak değeri
abs(x) mutlak değeri — sıfıra olan işaretsiz uzaklığı döndürür. Import gerekmez, fonksiyon yerleşiktir. Tam, kesirli ve hatta karmaşık sayılarla çalışır: 3+4j için vektörün uzunluğu olan 5.0'ı döndürür.
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent) # ne kadar sapma var
320
Tipik kullanım, yönü dikkate almadan farkı bulmak ve bir tolerans ile karşılaştırmaktır: abs(a - b) < 0.001. Kesirli sayılarda math.isclose daha güvenilirdir, çünkü sayıların ölçeğini de hesaba katar.
Operatörlerin önceliği
Bir ifadede birden fazla operatör varsa Python onları önceliğe göre çalıştırır — yüksekten düşüğe:
**- tekli
-x,+x,~x * / // %+ -- bit kaydırma ve bit işlemleri
- karşılaştırmalar,
in,is notandor:=
Böylece 2 + 3 * 4 sonucu 14, (2 + 3) * 4 sonucu 20'dir. Emin değilseniz parantez koyun: fazladan parantezin maliyeti yoktur, ama öncelik hatasını bulmak uzun sürer.
Operatörlerle ilgili sık yapılan hatalar
| Hata | Ne olur | Doğrusu |
|---|---|---|
if x = 5: | SyntaxError: bu bir atama | if x == 5: |
üs yerine 2 ^ 3 | bit düzeyinde XOR, sonuç 1 | 2 ** 3 |
8 / 2 ile tam sayı beklemek | 4.0 alınır | 8 // 2 |
x == 1 or 2 | her zaman doğru: or 2 | x in (1, 2) |
round(2.5) ile 3 beklemek | bankacılık yuvarlaması 2 verir | ROUND_HALF_UP ile Decimal |
"5" + 5 | TypeError | int("5") + 5 |
Sonuç
En önemli noktalar: / her zaman float verir, // aşağı yuvarlar, % bölenin işaretiyle kalan verir, üs ise **'tır. Mantıksal and, or, not kelimelerle yazılır ve tembel değerlendirilir; is ise None kontrolü için gerekir. Python round yarıyı çifte yuvarlar; yukarı ve aşağı yuvarlama için math.ceil ve math.floor vardır, sayının mutlak değerini ise abs verir. Kursta bu operatörler uygulamada, paranın kuruş olarak tutulduğu harcama takipçisinde işlenir.
Sık sorulan sorular
Python'da bir sayıyı virgülden sonra iki basamağa nasıl yuvarlarım?
round(x, 2) kullanın; sadece güzel göstermek istiyorsanız, sayının değerini değiştirmeyen f"{x:.2f}" f-string'ini kullanın.
Python'da round(0.5) neden 0 veriyor?
Çünkü round yarıyı en yakın çift sayıya yuvarlar ve 0 çifttir; aynı şekilde round(1.5) ve round(2.5) sonucu 2'dir.
Bölmenin tam kısmını Python'da nasıl alırım?
// operatörüyle: 17 // 5 sonucu 3'tür. Negatif sayılarda aşağı yuvarlar, dolayısıyla -17 // 5 sonucu -4'tür; kesri sıfıra doğru atmak için int(-17 / 5) kullanın.
Python'da üçlü (ternary) operatör var mı?
Evet, bu bir koşullu ifadedir: değer_doğruysa if koşul else değer_yanlışsa, örneğin "çift" if n % 2 == 0 else "tek".
Python'da & ile and arasındaki fark nedir?
and, tembel değerlendirmeli mantıksal bir operatördür; & ise sayılarda bit düzeyinde VE, kümelerde kesişimdir. Koşullarda if ile birlikte and kullanın.
Bu konu “Python 3.15: от новичка до профи” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git