Python’ın anlamlı (semantic) ve kolay öğrenilebilir bir söz dizimine sahip olması, kendisini diğer dillerden ayıran özelliklerin başında yer alıyor. PEP572{.rank-math-link} ile önerilen ve Python 3.8 ile hayatımıza giren Walrus operatörü de, diğer adıyla atama ifadeleri, Python’un kolay okunabilirliğini ve anlaşılabilirliğini arttırıyor.

Kod yazarken okunabilirliği azaltmadan bakım maliyetini düşürmek istiyoruz. Dolayısıyla daha basit yapılar kurmak istiyoruz ki sonrasında bu yapıları yenilememiz gerektiğinde işimiz zorlaşmasın. Ama aynı zamanda kurduğumuz bu yapılar okunabilirliğini de korumalı. İşte, tam bu noktada bu yeni operatör yardımımıza koşuyor.

Walrus Operatörü Kullanımı

Kullanıcıdan basit bir girdi aldığımız ve bu girdinin tüm harflerini büyük şekilde tekrar ekrana yazdıracağımız bir betik hazırlayalım.

</figure>

Gördüğünüz gibi, 3. satırda kullanıcıdan bir girdi aldık ve 5. satırda bu girdinin boş bir metin olup olmadığını kontrol ettik. Çünkü, eğer girdimiz boş bir metin ise karakterlerini büyütüp yazdırmamıza, özetle bir işlem yapmamıza gerek yok. Aynı yapıyı bir de yeni operatörü kullanarak hazırlayalım.

</figure>

Bu sefer kullanıcıdan aldığımız girdiyi bir değişkene atamadık. Aslında bir değişkene atıyoruz ancak geleneksel yöntem ile değil. 2. satırda := şeklinde bir ifade var, bu bir Walrus operatörüdür. Ayrıca bu ifadeyi bir koşulun içinde kullandığımıza dikkat edin. Bizim senaryomuzda koşulun gerçekleşmesi için kullanıcının bir şeyler girmesi gerekiyor, bu durumda elde edeceğimiz çıktı değeri, kullanıcı girdisinin büyük harfli hali olacak. Dolayısıyla biz, 3. satırda yaptığımız gibi bu değişkeni işleyebileceğiz. Eğer kullanıcı bir şey yazmadan Enter’e basarsa koşul olumsuz sonuçlanacak. Bu durumda direkt olarak else bloğuna düşeceği için herhangi bir atama işlemi de yapılmamış olacaktır.

Benzer bir örnek ile bu kullanımı pekiştirelim. Elimizde bir liste var ve bu listenin eleman sayısı 5’den fazla olduğunda eleman sayısını yazdırmak istiyoruz. Eğer Walrus operatörü kullanmayacaksak öncelikle listenin eleman sayısını bir değişkene atayacağız, sonrasında değişkenin boyutunu kontrol edip sonucu ona göre ekrana yazdıracağız. Ya da hem kontrol aşamasında hem de yazdırma aşamasında tekrardan liste boyutunu alacağız.

</figure>

Ama biz Walrus operatörü sayesinde eğer koşul gerçekleşirse ilgili değeri değişkene atayabiliyoruz. Burada dikkat etmemiz gereken şey, Walrus operatörünün yeni bir yetki alanı (scope) oluşturmadığı. Yani if koşulunun bulunduğu alan ile ortak alanı paylaşan tüm kod blokları yine Walrus operatörü ile değeri atanan değişkene erişebilirler.

Kullanım alanlarından bir diğeri de maliyetli işlemleri tekrarlamamak ve maliyeti azaltmak. Somut bir örnekle bu konuyu detaylandıralım.

</figure>

Bu örnekte hem normal kullanım hem de Walrus operatörü ile kullanımı bir arada görebiliyoruz. Öncelikle ne yaptığımı biraz açıklayayım. maliyetli_islem isimli bir fonksiyonumuz var ve kendisi parametre olarak bir sayı alıyor. Eğer aldığı sayı 4 ise olumsuz sonuç döndürüyor, aksi tüm durumlarda parametre olarak aldığı sayının bir fazlasını döndürüyor. Örnek olması adına basit bir fonksiyon, ancak bu kullanımı daha iyi anlayabilmek adına bu fonksiyonun çok büyük işler yaptığını ve bu fonksiyonu her çağırışımızın bize 5 saniye kadar maliyeti olduğunu hayal edelim.

Önce normal kullanımı (Walrus olmadan) inceleyelim. Yani 10. satırdan başlayan kısmı. Burada aslında veri isimli değişkenimizin içinde dönen bir döngü oluşturduk. Ve verinin içindeki her sayı için maliyetli_islem fonksiyonumuzu çağırdık. Eğer fonksiyonumuz olumsuz dönmemişse aynı değer için tekrar çağırdık ve bu sefer o halini bir listeye ekledik. Dolayısıyla 4 için bir kere çağırmış olduk diğer tamamı için ikişer kere. Toplamda 9 kere maliyetli_islem fonksiyonu çalışmış oldu. Eğer bu işlem gerçekten 5 saniye sürseydi bize en az 45 saniyelik maliyeti olan bir program olacaktı.

Şimdi de Walrus ile yeniden yazılmış halini inceleyelim. Yapılan işler tamamen aynı. Ama bu sefer her değer için bir kere fonksiyonu çağırdık ve eğer olumsuz dönmemişse sonucu bir değişkene atadık. Listeye eklerken de bu atanmış değişkeni kullandık. Dolayısıyla fonksiyonu toplam 5 kere (Her bir değer için bir kere) çağırmış olduk. Bu da 25 saniyelik işlem süresi demek. Hem kendimizi tekrar etmedik, hem de olabildiğince az ve okunaklı (diğer bir deyişle pythonic) bir kod yazmış olduk.