İçeriğe geç
academia.sh

Ders 04 / 18

İşleçler ve İfadeler

Aritmetik, karşılaştırma ve mantıksal işleçler; öncelik, birleşme yönü ve kısa devre değerlendirme.

İçindekiler

İlk derste bir mantık hatası örneği verilmişti: olcum_1 + olcum_2 / 2 ifadesi beklenen ortalamayı vermiyordu. Hata, işleçlerin hangi sırayla uygulandığını bilmemekten kaynaklanıyordu.

Bu ders o kuralları tanımlar. Kurallar dilden dile küçük farklarla tekrarlanır; ortak olan, önceliğin matematikteki alışkanlıkla uyumlu olmasıdır.

Aritmetik İşleçler

İşleç Anlam Örnek Sonuç
+ toplama 12 + 18 30
- çıkarma 18 - 12 6
* çarpma 6 * 7 42
/ gerçel bölme 7 / 2 3.5
// tam bölme 7 // 2 3
% kalan 7 % 2 1
** üs alma 2 ** 10 1024

Kalan işleci, göründüğünden daha sık kullanılır: bir sayının çift olup olmadığı (n % 2 == 0), bir sayacın belirli aralıklarla döngüye girmesi ve değerlerin sabit sayıda kovaya dağıtılması hep bu işleçle yazılır.

Karşılaştırma İşleçleri

Karşılaştırma işleçleri mantıksal değer üretir: ==, !=, <, >, <=, >=.

Eşitlik sınamasının == ile yazılması, atamanın = ile yazılmasından ayırt edilmek içindir. İkisinin karıştırılması, bazı dillerde geçerli ama yanlış bir program üretir; bu yüzden birçok dil atamayı koşul içinde yasaklar.

Önceki derste kurulan ayrım burada da geçerlidir: == içerik eşitliğini, is (veya karşılığı) aynı nesne olup olmadığını sınar.

Bazı diller karşılaştırmaların zincirlenmesine izin verir:

olcum = 12
print(0 < olcum < 100)          # True  — iki karşılaştırma ve mantıksal 've'

Bu yazım okunabilirdir ancak evrensel değildir; çoğu dilde aynı ifade beklenenden farklı sonuç verir, çünkü önce 0 < olcum hesaplanır ve sonucu 100 ile karşılaştırılır.

Mantıksal İşleçler

Üç mantıksal işleç, koşulları birleştirir:

aa bb a and b a or b not a
yanlış yanlış yanlış yanlış doğru
yanlış doğru yanlış doğru doğru
doğru yanlış yanlış doğru yanlış
doğru doğru doğru doğru yanlış

Tablo, önceki kurstaki bit düzeyi VE/VEYA tablolarının aynısıdır. Fark, bu işleçlerin bitler üzerinde değil, tüm ifade üzerinde çalışmasıdır.

Kısa Devre Değerlendirme

Mantıksal işleçlerin ayırt edici bir davranışı vardır: sonuç belli olduğunda sağ taraf hiç değerlendirilmez.

  • and işlecinde sol taraf yanlışsa, sonuç yanlıştır; sağ tarafa bakılmaz.
  • or işlecinde sol taraf doğruysa, sonuç doğrudur; sağ tarafa bakılmaz.

Bu, yalnızca bir hız eniyilemesi değil, bir programlama aracıdır: sağ tarafın çalışabilmesi için gereken koşul, sola yazılarak güvenceye alınır.

bolen = 0

# Sol taraf yanlış olduğu için bölme hiç yapılmaz; hata oluşmaz.
if bolen != 0 and 10 / bolen > 1:
    print("büyük")
else:
    print("koşul sağlanmadı")      # koşul sağlanmadı

olcumler = []

# Sol taraf doğru olduğu için ilk elemana erişilmez.
if len(olcumler) == 0 or olcumler[0] > 10:
    print("boş veya ilk ölçüm büyük")   # boş veya ilk ölçüm büyük

İki koşulun sırası değiştirilirse programlar çalışma zamanı hatası verir. Koşul sırası, bu nedenle üslup değil doğruluk meselesidir.

Öncelik ve Birleşme Yönü

Öncelik, farklı işleçlerden hangisinin önce uygulanacağını; birleşme yönü, aynı öncelikteki işleçlerin hangi yönde gruplanacağını belirler.

Yüksekten alçağa doğru sık kullanılan öncelik sırası:

Sıra İşleçler
1 () gruplama
2 ** üs alma
3 tekil - (işaret)
4 *, /, //, %
5 +, -
6 karşılaştırmalar
7 not
8 and
9 or
print(2 + 3 * 4)          # 14   — çarpma önce
print((2 + 3) * 4)        # 20   — gruplama önceliği değiştirir
print(2 ** 3 ** 2)        # 512  — üs alma sağdan sola: 2 ** (3 ** 2)
print(-2 ** 2)            # -4   — üs alma tekil eksiden önce: -(2 ** 2)
print(10 - 3 - 2)         # 5    — çıkarma soldan sağa: (10 - 3) - 2
print(True or False and False)   # True — 'and' önce

İlk dersteki mantık hatası bu tabloyla açıklanır: olcum_1 + olcum_2 / 2 ifadesinde bölme dördüncü sırada, toplama beşinci sıradadır; bölme önce yapılır.

Pratik kural: öncelik kurallarını bilmek gerekir, ancak okuyucunun da bilmesine güvenmemek gerekir. Karışıklık ihtimali olan yerde parantez kullanmak, kuralı bilmenin yerine geçmez — onu görünür kılar.

Bileşik Atama

Bir değişkenin kendi değeri üzerinden güncellenmesi o kadar sık yazılır ki, diller bunun için kısa bir yazım sunar:

toplam = 0
toplam = toplam + 12       # açık yazım
toplam += 18               # bileşik atama: aynı işlem
print(toplam)              # 30

sayac = 10
sayac -= 1                 # 9
sayac *= 2                 # 18
sayac //= 5                # 3
print(sayac)               # 3

Bileşik atama bir işleç değil, bir yazım kısaltmasıdır: a += b ifadesi a = a + b anlamına gelir. Kısaltmanın iki yararı vardır — değişken adı bir kez yazılır (yanlış ada atama olasılığı düşer) ve okuyucu, güncellemenin aynı değişken üzerinde olduğunu tek bakışta görür.

Değiştirilebilir tiplerde bu eşdeğerlik incelir: bazı dillerde bileşik atama yeni bir nesne üretmek yerine var olan nesneyi yerinde günceller. Paylaşılan bir listede bu fark gözlenebilir sonuçlar doğurur; ayrım, değiştirilemezlik konusunda kurulan kuralın uzantısıdır.

Bir uyarı: bileşik atama da bir deyimdir, ifade değildir. Değeri yoktur; başka bir ifadenin içine yerleştirilemez.

Aynı İşleç, Farklı Anlam

Bir işlecin anlamı, uygulandığı tiplere bağlıdır:

print(3 + 4)              # 7        — sayısal toplama
print("3" + "4")          # 34       — dizgi birleştirme
print([1, 2] + [3])       # [1, 2, 3] — liste birleştirme
print("ab" * 3)           # ababab   — yineleme

Aynı simgenin farklı tiplerde farklı işlem yapması işleç aşırı yükleme olarak adlandırılır. Kolaylık sağlar; buna karşılık, tipi yanlış varsayan kod sessizce beklenmedik sonuç üretebilir. Kullanıcıdan alınan bir değerin sayı mı dizgi mi olduğu bilinmeden yapılan + işlemi, bunun tipik örneğidir.

Bu, sonraki dersin konusuna doğrudan bağlanır: değerin tipi beklenenden farklıysa ne yapılır?

Özet

  • Aritmetik işleçler arasında tam bölme ve kalan, sayısal problemlerde sık kullanılır.
  • Karşılaştırma işleçleri mantıksal değer üretir; == içerik eşitliğini sınar, atama değildir.
  • and, or ve not koşulları birleştirir; doğruluk tabloları bit düzeyi karşılıklarıyla aynıdır.
  • Kısa devre değerlendirmede sonuç belli olduğunda sağ taraf çalıştırılmaz; koşul sırası doğruluğu etkiler.
  • Öncelik hangi işlecin önce uygulanacağını, birleşme yönü aynı öncelikteki işleçlerin gruplanmasını belirler; üs alma sağdan sola birleşir.
  • Aynı işleç farklı tiplerde farklı anlam taşıyabilir.

Sonraki Adım

Bir ifadede farklı tipler karşılaştığında ne olur? Sayıya dizgi eklenebilir mi, gerçel sayı tam sayıya nasıl çevrilir ve bu çevirilerde ne kaybedilir? Sonraki ders tip dönüşümünü ve kayıplı dönüşümün sonuçlarını ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat