Walrus operatörü (:=), ya da ifade atama operatörü, Python'un 3.8 sürümünden itibaren kullanılmaktadır. Değişkenlere değeri doğrudan ifadelerde (örneğin, döngülerin veya if koşullarının içinde) atamaya olanak sağlamak için tanıtılmıştır; yani bir fonksiyonun ya da işlemin sonucunu iki kez çağırmadan almak ve kullanmak mümkündür.
Walrus'un çözdüğü sorun; atama yapmak için hesaplamaları kopyalamak veya gereksiz kod satırları yazma gereğidir: önce bir ayrı çağrı yapıp ardından sonucu kullanmak gerekiyordu.
Çözüm: artık bir ifade koşulun içinde hemen bir değişkene atanabilir, bu da kodu daha özlü ve bazen daha okunabilir kılar. Ancak, yanlışlıkla walrus kullanımının fazla olması kodun anlaşılmasını zorlaştırabileceğini unutmamak önemlidir, özellikle de deneyimsiz meslektaşlar için.
Kod örneği:
while (line := input('Bir satır girin: ')) != 'çıkış': print(f'Girdiğiniz: {line}')
Ana özellikler:
Walrus operatörü küresel bir değişkenin değerini atamak için kullanılabilir mi?
Evet, kullanılabilir, ancak walrus uygulandığı kapsamda çalışır. LEGB kuralını hatırlamak ve fonksiyonların dışındaki değişkenleri dikkatli kullanmak önemlidir.
x = expr ile (x := expr) arasındaki fark nedir?
x = expr bağımsız bir atama talimatıdır, oysa (x := expr) bir ifadeyi döndüren ve onu başka bir ifade içinde x'e atayan bir ifadedir. Çoğu durumda, ikincisi if koşullarında, while döngüsünde veya liste ifadelerinde kullanılabilir.
Walrus, liste ifadeleri ve üreticiler içinde kullanılabilir mi?
Evet, walrus comprehension içinde yaygın olarak kullanılmakta, bu da tekrar eden hesaplamalardan kaçınmak için özellikle uygundur.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Burada n int(s) sonucunu saklar, hesaplamaları tasarruf ederiz
Geliştirici karmaşık bir if yazıyor ve birkaç iç içe walrus kullanıyor:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Artıları:
Eksileri:
Hesaplamaları korumak ve okunabilirlik için bilinçli kullanım:
while (line := sys.stdin.readline()) != '': process(line)
Artıları:
Eksileri: