25 Ağustos 2008 Pazartesi

List Comprehension

Türkçesi için uygun bir karşılık bulamadığım için python dökümantasyonun da olduğu gibi yazdım. (Uygun bir karşılığı varsa ya da uydurursanız yorum belirtirseniz değiştirmek taraftarıyım.)

Daha önce Mirat Can Bayrak'ın anlatmış olduğu map() ve filter() fonksiyonlarının yaptığı işleri ve çok daha fazlasını yapabilmemize olanak sağlar. Anlaşılması biraz zor gelebilir fakat alıştıktan sonra hayat kurtarıcı olabiliyor. Sözü fazla uzatmadan hemen örnekler üzerinde açıklamaya başlayalım.

İlk örneğimiz map() fonksiyonunun anlatıldığı örneğin aynısı olsun


In [65]: def sayhello(to_who):
print "hello %s" %to_who
....:
....:

In [67]: people = ('Ahmet','Mehmet','Hale','Jale','Bülent')
In [68]: [sayhello(i) for i in people] #lc (List Comprehension)'ın olayı burada başlıyor. Kolay anlayabilmek için sağdan-sola doğru okuyunuz. "i İnsanların içerisinde olduğu sürece sayhello() fonksiyonunu çalıştır"
hello Ahmet
hello Mehmet
hello Hale
hello Jale
hello Bülent


Örneklere yine Mirat Can Bayrak'ın filter()
fonksiyonunu anlattırken kullandığı tek sayilar üzerinden gidelim.

In [72]: [i for i in range(10) if i%2!=0] #Gördüğünüz gibi lc içerisinde if koşullarınıda kullanabiliyoruz.
Out[72]: [1, 3, 5, 7, 9]


Biraz abartıp iç içe döngüleri kullarak sadece TEK satırda amatör bir çarpım tablosu bile yapabiliriz.

In [77]: [[i*j for i in range(1,10)] for j in range(1,11)]
Out[77]:
[[1, 2, 3, 4, 5, 6, 7, 8, 9],
[2, 4, 6, 8, 10, 12, 14, 16, 18],
[3, 6, 9, 12, 15, 18, 21, 24, 27],
[4, 8, 12, 16, 20, 24, 28, 32, 36],
[5, 10, 15, 20, 25, 30, 35, 40, 45],
[6, 12, 18, 24, 30, 36, 42, 48, 54],
[7, 14, 21, 28, 35, 42, 49, 56, 63],
[8, 16, 24, 32, 40, 48, 56, 64, 72],
[9, 18, 27, 36, 45, 54, 63, 72, 81],
[10, 20, 30, 40, 50, 60, 70, 80, 90]]

Lc ile yapabilecekleriniz sizin yaratıcılığınıza kalmış

>>> [i for i in range(3,100,2) if (i%3!=0 and i%5!=0 and i%7!=0)]
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] #asal sayılar.

In [90]: us_al=dict([(i,i**2) for i in range(2,10)]) #dict() ile lc'den aldığımız veriyi bir sözlüğüde aktarabiliyoruz.
In [91]: us_al
Out[91]: {2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

Hiç yorum yok:

Yorum Gönder