Liste ifadeleri (list comprehensions), mevcut yinelemeli nesnelerden kısa bir sentaksla liste oluşturmaya yönelik özlü bir yöntemdir:
kareler = [x**2 for x in range(10)]
Bu ifade aşağıdaki ile eşdeğerdir:
kareler = [] for x in range(10): kareler.append(x**2)
Liste ifadelerinin birkaç avantajı vardır:
çiftler = [x for x in range(10) if x % 2 == 0];map() ile benzerlik:
def f(x): return x**2 kareler = list(map(f, range(10)))
map, büyük verilerde C'de var olan bir işlev kullanılıyorsa daha hızlıdır ve tüm öğelere aynı işlev uygulamak için uygundur. Liste ifadeleri - yalnızca hazır işlevler değil, herhangi bir ifade için kullanılır. For döngüsü daha esnektir, ancak daha karmaşıktır.
Neden
[x for x in range(10)]gibi bir ifadede döngü değişkeni (x), Python2'de ifade çalıştırıldıktan sonra erişilebilirken, Python3'te erişilemez?
Cevap: Python2'de döngü değişkeni (x) list comprehension çalıştıktan sonra değerini korur. Python3'te ise "tecrit edilir" ve liste dışında erişilemez, bu da istenmeyen yan etkileri önler.
Örnek:
# Python 2.x: [x for x in range(3)] print(x) # x == 2 # Python 3.x: [x for x in range(3)] print(x) # NameError: name 'x' is not defined
Hikaye 1
Bir geliştirici büyük bir projede list comprehension ile yeni bir liste oluşturup filtrelemek istedi:
my_list = [item.transform() for item in data if item.is_valid()]
Ancak item.transform() işlemi, item.is_valid() False dönerse hata veriyordu. Ancak kontrol işlevi potansiyel yan etkilere sahipti ve sonuçta list comprehension, yan etkileri olan kısımda belirsiz bir şekilde hata oluşturdu.
Hikaye 2
Python2'den Python3'e geçişte bir geliştirici döngü değişkeninin erişilebilir kalacağından emindi:
[x for x in range(5)] print(x) # 4 almayı bekliyordu, ancak NameError aldı.
Bu, döngüsel mantıkta, değişkenin comprehension dışında talep edilen bir şekilde kalması gerektiği bir hataya yol açtı.
Hikaye 3
Açık seviye belirtmeden iç içe liste ifadelerinin kullanımı:
def flatten(matrix): return [cell for row in matrix for cell in row]
Yeni başlayanlar, yanlış dolaşım sırasından dolayı sık sık hatalar yaparlar (örneğin, [cell for cell in row for row in matrix] veya gereksiz iç içe geçme), bu da yanlış sonuca - tek boyutlu bir liste yerine iki boyutlu veya tam tersine - yol açar.