List comprehension, Python'un erken sürümlerinde ortaya çıktı. Bu sözdizimi şekeri, fonksiyonel dillerden alınmıştır. Kodu daha kompakt hale getirir ve bazen normal for döngüsünden biraz daha hızlıdır.
Birçok deneyimsiz geliştirici, list comprehension'ları özelliklerini anlamadan kullanır, bu da kodun okunabilirliğini kötüleştirebilir veya beklenmedik etkilerin ortaya çıkmasına neden olabilir. Ayrıca, yeni geliştiricilerin list comprehension'ların ve map/filter/lambda fonksiyonlarının kullanımını ayırt etmeleri zordur.
List comprehension, her bir öğeye bir ifade uygulayarak yeni bir liste oluşturmanın hızlı bir yoludur:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Ana özellikler:
List comprehension bir jeneratör döner mi?
Hayır, tam olarak bir liste döner. Jeneratör, parantezler kullanılarak oluşturulur:
# Bu bir jeneratördür: (x*x for x in range(10)) # Bu bir listedir: [x*x for x in range(10)]
List comprehension içinde değişkenlere değer atayabilir miyiz?
Standart sözdiziminde hayır. Sadece "walrus" ifadesi (:=) ile Python 3.8+ ile:
[x for x in (y := range(5))] # Hata! [x for x in [(y := i*i) for i in range(5)]] # y sadece bu listede görünür
List comprehension içinde dış değişkenleri değiştirebilir miyiz?
List comprehension içinde tanımlanan değişken — yerel olup dışarıdan görünmeyecektir. Bu, iç içe yapılarla yeni başlayanların sıkça karıştırdığı bir durumdur.
** Olumsuz Durum Geliştirici, karmaşık veri dönüşümleri için iç içe list comprehension'lar kullanıyor. Avantajlar: Kod kompakt, "Python'u biliyorum!" etkisi. Dezavantajlar: Okunması zor, yeni meslektaşlar zorlanıyor, hata ayıklama eziyet haline geliyor. ** Olumlu Durum Geliştirici, kısa listeleri filtreleme ve dönüştürme için basit list comprehension'lar kullanıyor ve karmaşık işlemler için açık fonksiyonlar ve döngüler yazıyor. Avantajlar: Kod kolay okunur, bakımı ve genişletilmesi kolaydır. Dezavantajlar: Bazı durumlarda kod biraz daha uzun ve ek değişkenler kullanılıyor.