Operatör Öncelikleri

Python’da ve diğer programlama dillerinde de bir ifadenin genelde en az bir operatör içerdiğini söyleyebiliriz. Bir ifadede birden fazla operatör olması da çok yaygın bir durumdur. Peki bu durumda hangi operatör diğerlerinden daha önce işleme sokulacaktır? Operatörlerin çalıştırılma sırası nasıl olacaktır? İşte bu bölümde değineceğimiz operatör önceliği konusu bu sorunun cevabını vermektedir.

c = a + b * c ifadesini örnek olarak ele alalım. Matematik kuralları çerçevesinde çarpma, *, işleminin toplama, +, işlemine göre önce yapılacağını söyleyebiliriz. Yani b ve c çarpılacak, sonra bu çarpımın sonucu a ile toplanacak. Python kuralları açısından da gerçekten de böyledir. Yani bu durumda matematik kuralları ile yaptığımız tahmin Python açısından da tutarlıdır. Fakat her zaman böyle olmak zorunda değildir. Kaldı ki matematikte olmayan çeşitli operatörler programlama dillerinde bulunur. Bu durumda elimizde tahmin yapacağımız bir dayanak da kalmaz.

Yukarıdaki örnek ifadedeki operatörlerin değerlendirilme sırasını şu şekilde gösterebiliriz:

İ1: b * c
İ2: a + İ1
İ3: c = İ2

İ, İşlem demektir.

Şimdi de a = b + c + d ifadesini ele alalım. Bunda da sıra şu şekilde olacaktır.

İ1: b + c
İ2: İ1 + d
İ3: a = İ2

Burada hala matematik ile açıklayabileceğimiz bir durum var. Peki neden b + c işlemi c + d den önce yapılıyor dedik? İşte yavaş yavaş Python’ın kurallarını bilmemiz gereken kısımlara geliyoruz.

Parantez, ()

Matematikten de bilebileceğimiz gibi parantez, (), kullanarak işlem sırasını kontrol edebiliyoruz. Örneğin a = (b + c) * d yazdığımız zaman bu sefer + operatörü daha önce işleme alınacaktır. Yani b ve c önce toplanacak, sonra toplamın sonucu d ile çarpılacaktır.

Programcılar, parantez kullanılmadığı zaman zaten operatör öncelikleri ile istenilen sonuç alınıyorsa boş yere parantez kullanmama eğiliminde olabilmektedir. Fakat bazı durumlarda kod okunabilirliğini arttırmak adına sonuca etki etmese de parantez kullanımı iyi bir tercih olabilir.

Operatör Öncelik Tablosu

Python’daki operatörlerin öncelik sıralamasını gösteren bir tablo yapalım. Öncelik numarası düşük olan operatörlerin önceliği yüksek olmaktadır. Yani tablonun altına doğru ilerledikçe öncelik düşmektedir, yukarı çıktıkça da artmaktadır. Bir öncelik derecesini birden fazla operatör paylaşabilmektedir. Bu operatörlerin tablodaki sırası bir şey ifade etmemektedir. Örneğin * ve / operatörleri aynı öncelik derecesine sahiptir. Tabloda ise bir birinin üstündedir. Bu, üstte olanın daha yüksek öncelikli olduğu anlamına gelmez. Aynı öncelik derecesine sahip operatörler bir ifadede bulunduğunda bunların kendi aralarında hangi sıra ile çalıştırılacağı operatörlerin birleşme yani associativity özelliği ile ilgilidir.

Yapılacaklar

Tablo yarımdır. Notlarda ilerlendikçe tablo da genişletilmektedir.

Öncelik

Operatör

Açıklama

Associativity (Birleşme)

1 (en yüksek)

soldan sağa

()

Hem fonksiyon çağrı operatörünü hem de öncelik parantezini gösterir

2

sağdan sola

**

Üs alma operatörü

3

sağdan sola

+

İşaret artı operatörü

-

İşaret eski operatörü

4

soldan sağa

*

Çarpma

/

Bölme

//

floordiv

%

Modulo (mod alma) operatörü

5

soldan sağa

+

Toplama

-

Çıkarma

6

soldan sağa

<, >, <=, >=, ==, !=

Karşılaştırma Operatörleri

7

sağdan sola

not

Değil

8

soldan sağa

and

Ve

9

soldan sağa

or

Veya

10

sağdan sola

=

Atama

:=

Walrus operatörü

+=, -=, *= vb. ¶

İşlemli Atama Operatörleri

‡: C gibi dillerin aksine Python’da atama operatörü =, ve benzeri operatörler bir ifade oluşturmaz, bir deyim oluşturur. Bu yüzden tabloda = operatörünün bulunması C gibi dillerdekinin aksine çok da anlamlı değildir. Ama bütünsellik adına tabloda bulundurulmaktadır. [1] [2]

¶: Tüm işlemli atama operatörleri burada verilmemiştir. Tam liste için Python dokümanlarına bakabilirsiniz.

Tabloyu nasıl okumalıyız?

Birden fazla operatör bir ifadede bulunduğu zaman önceliği yüksek olan, nümerik olarak düşük önceliğe sahip olan, 1 en yüksek, operatör ilk olarak çalıştırılır. Daha sonra sıra ile en düşük önceliğe doğru gidilir. Peki aynı öncelik derecesine sahip olan birden fazla operatör bir ifadede varsa ne olacak? İşte bu durumda da ilgili önceliğin associativity yani birleşme özelliği devreye girecektir. Eğer o grubun özelliği soldan sağa ise ifadenin en solunda bulunan operatör ilk olarak değerlendirilir yani çalıştırılır. Benzer şekilde sağdan sola ise en sağdaki operatör önce çalıştırılır. Bu, öncelik seviyesinin bir özelliğidir. Aynı öncelik seviyesindeki operatörler aynı sırayı paylaşır.

Örnekler

a = b / c * d ifadesinde * ve / operatörleri aynı öncelik sırasını paylaşır. Bu seviye için birleşme soldan sağadır. Bu durumda ifadede / operatörü * operatörünün solunda olduğu için önce b /c işlemi yapılır sonra bunun sonucu ile d, * operatörü sayesinde çarpılır.

a = b = c ifadesinde atama operatörünün, =, birleşme özelliği sağdan sola olduğu için önce b = c işlemi yapılır. Daha sonra a = b işlemi yapılır.

a = foo() + 2 ifadesinde de () aslında bir operatördür, öncelik parantezi değildir. Fonksiyon çağrı operatörüdür. Önceliği + operatöründen daha yüksek olduğu için önce foo fonksiyonu çağrılır. Onun geri dönüş değeri ile + operatörü ile 2 değeri toplanır ve son olarak = operatörü ile bu değer a ya atanır.


💭 Yorumlar

Yorum altyapısı giscus tarafından (evet tarafından!) sağlanmaktadır. Yorum yazabilmek için GitHub hesabınız üzerinden giriş yapmanız gerekmektedir. Yorumlar, Github Discussions üzerinde saklanmaktadır.

a9307cfe-5d3e-4d65-945d-678289925fed