İşlemli Atama “Operatörleri”, +=, *= vb

12-00.31.00

Önceki notlarda belirtmiştim ama bu konu başlığı altında tekrar vurgulamak istiyorum. C gibi dillerin aksine, Python’da ++ ve -- operatörleri yoktur. Olan dillerde bu operatörleri bir değişkenin değerini bir arttırmak ya da eksiltmek için kullanıyoruz. Python’da ise bunu yapmanın iki yolu vardır. Birincisi:

x = x + 1
y = y - 1

kullanmak.

İkincisi ise bu yazının konusu olan işlemli atama operatörleri yani augmented assignment statements (işlevi arttırlmış anlamdında, C’de mesela compound assignments diyoruz) kullanmaktır. Dikkat ederseniz başlıkta "Operatör" yazıyor. Python’da atama işlemi nasıl bir deyim ise, yani aslında = bir operatör değil ve ifade oluşturmuyorsa işlemli atama operatörleri de aslında operatör değildir, onlar da = gibi birer deyim yani statement oluşturur. Ama anlarken kolaylık olsun diye nasıl atama operatörü dediysek bunlara da operatör diyoruz kolaya kaçıp. Bu operatörler de atama operatörü gibi bir değer üretmezler.

İşte ikinci yol da şu olmaktadır:

x += 1
y -= 1

Not

Python’da neden ++ ve -- operatörlerinin olmadığı ile ilgili internette tartışmalar vardır, örneğin burası. Temel söylenen Python’daki programlama şekli yani Pythonic tarzda kod yazarken C gibi dillerin aksine bu operatörlere ihtiyaç duyulmamasıdır. Örneğin Python’da bulunan range() fonksiyonunun yaygın kullanılması ve i++ gibi işlemlere bu yüzden ihtiyaç duyulmaması gibi. Elbette bu olsa hiç işe yaramazdı demek değil ama eksikliğini çok fazla hissediyorsak yazdığımız kodlara bakıp, Pythonic way de miyiz diye kontrol etmek iyi olabilir.

C dili ile uğraştıysanız ++ ve -- operatörleri yan etki, side effect, ten dolayı bazen size göremediğiniz sürprizler yapabiliyor. Python’daki olmayış, programcının hata yapmasını bir nebze azaltıyor diyebiliriz. Mesela Swift dilinde de bu operatörler varmış ama versiyon 2 ile beraber dilden çıkartılmış.

Python da biraz fonksiyonel programlama tarzını daha çok benimsediği için görece, bu tarz yan etki yaratan operatörleri barındırmama tercih edilebiliyor.


Python’da +=, -=, *=, /=, //=, %= şeklinde işlemli atama “operatörü” bulunmaktadır. Burada arada boşluk olmamalıdır, * = geçerli değildir örneğin. Bu operatörler binary infix operatörlerdir. op bir operatör dersek

a op= b

bu ifade

a = a op b

ile eşdeğer olmaktadır.

Ben yukarıda tüm kombinasyonları yazmadım. Tam liste için dilin referans açıklamasına bakabilirsiniz. Birçok operatörün bu formu bulunsa da örneğin and, or, not gibi operatörlerin bu şekilde işlemli biçimi yoktur.


Python’da bir değişkeni arttırmak için tercih edilen yöntem gerçekten de a += 1 şeklinde işlemli atama operatörü kullanmaktır. Elbette bu tarz işlemli atama operatörleri burada olduğu gibi temel bir veri türü olan int gibi değiştirilemez yani immutable türlerle kullanıldığında bu işlem arka planda yeni nesne oluşmasına sebep olur.

>>> a = 4
>>> id (a)
1754405759376
>>> a += 1
>>> a
5
>>> id (a)
1754405759408

Yukarıdaki örnekte id değerlerinin farklı olduğuna dikkat ediniz.


Önceliği düşük olduğu için a *= 2 + 3 ün eşdeğeri, a = 2 * a + 3 DEĞİL a = 5 * a olmaktadır, önce toplama işlemi yapılır.

Kaynaklar

12-00.56.35

💭 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.

3952acd5-f2b4-4894-b9bf-fcc240204442