koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da Filtre (Filter)

filter, bazı ölçütlere göre, bir sıralı yapıdaki (liste gibi) öğeleri atmak/tutmak için kullanılır. Önce örneklere bakalım:

isimler = ['Fred', 'Wilma', 'Barney']

def uzun_isimler(isimler):
    return len(isimler) > 5
list(filter(uzun_isimler, isimler))
# Çıktı: ['Barney']

[isim for isim in isimler if len(isim) > 5] # eşdeğer liste üreteci
# Çıktı: ['Barney']
from itertools import ifilter
ifilter(uzun_isimler, isimler)       # generator (python 3.x filter yapısına benzer)
# Çıktı: <itertools.ifilter at 0x4197e10>
list(ifilter(long_name, names)) # filter ve liste'ye eş değer
# Çıktı: ['Barney']

(isim for isim in isimler if len(isim) > 5) # generator'e eşdeğer
# Çıktı: <generator object <genexpr> at 0x0000000003FD5D38>
# python 2.x versionları için future_builtin fonksyionu ile:

from future_builtins import filter
filter(uzun_isimler, isimler)       # itertools.ifilter ile aynı
# Çıktı: <itertools.ifilter at 0x3eb0ba8>
filter(uzun_isimler, isimler)        # generator döndürür
# Çıktı: <filter at 0x1fc6e443470>
list(filter(long_name, names))  # cast to list
# Çıktı: ['Barney']

(isim for isim in isimler if len(isim) > 5) # generator deyimine eşdeğer
# Çıktı: <generator object <genexpr> at 0x000001C6F49BF4C0>

Sözdizimi 

  • filter(fonksiyon, yinelenebilir)
  • itertools.ifilter(fonksiyon, yinelenebilir)
  • future_builtins.filter(fonksiyon, yinelenebilir)
  • itertools.ifilterfalse(fonksiyon, yinelenebilir)
  • itertools.filterfalse(fonksiyon, yinelenebilir)

Parametre 

  • fonksiyon | koşulu belirleyen ve filtreleme için kimlik işlevini kullanan çağrılabilir (yalnızca konumsal)
  • yinelenebilir | filtre uygulanacak yinelenebilir (yalnızca konumsal)

Çoğu durumda filter‘a göre bir liste üreteci veya generator ifadesi daha okunabilir, daha güçlü ve daha verimli olabilir.

Kısa devre kontrolü olarak filter

filter (python 3.x) ve ifilter (python 2.x) bir generatör döndürür, böylece or veya and gibi bir kısa test oluştururken çok kullanışlı olabilirler: 

# gerçek ugulamalarda tavsiye edilmez ama örnek açısından yararlı:
from itertools import ifilter as filter
from future_builtins import filter

100’den küçük ilk öğeyi bulmak için:

araba_dukkani = [('Toyota', 1000), ('lastik', 80), ('Porsche', 5000)]

def kucuk_degeri_bul(isim_deger_tuple):
    print('Kontrol {0}, {1}$'.format(*isim_deger_tuple)
    return isim_deger_tuple[1] < 100

next(filter(kucuk_degeri_bul, araba_dukkani))

# Print: Kontrol Toyota, 1000$
#        Kontrol lastik, 80$
# Çıktı: ('lastik', 80)

next işlevi, bir sonraki (bu durumda ilk) öğeyi verir. Kısa devre dememizin sebebi budur.

Fonksiyonsuz Filtre Uygulama

İşlev parametresi yerine None kimlik işlevi de kullanılabilir. Böylece None değeri olan tüm öğeler atılır – 0’a dikkat: 

list(filter(None, [1, 0, 2, [], '', 'a']))  # 0, [] ve '' atar   
# Çıktı: [1, 2, 'a']
[i for i in [1, 0, 2, [], '', 'a'] if i] # eşdeğer liste üreteci 
(i for i in [1, 0, 2, [], '', 'a'] if i) # eşdeğer generator deyimi

filterfalse ve ifilterfalse işlevleri

itertools-modulü içinde filter’a tamamlayıcı olarak düşünebileceğimiz bir işlev daha bulunur vardır: 

from itertools import ifilterfalse as filterfalse
from itertools import filterfalse

tam olarak filter generatörü gibi çalışır, ancak yalnızca False öğeleri tutar:

# işlevsiz kullanım (None):
list(filterfalse(None, [1, 0, 2, [], '', 'a']))  # 1, 2, 'a' yı kaldırır
# Çıktı: [0, [], '']

İşlevli kullanım 

isimler = [‘Fred’, ‘Wilma’, ‘Barney’]

def uzun_isimler(isimler):
	return len(isimler) > 5

list(filterfalse(uzun_isimler, isimler)) # Çıktıt: [‘Fred’, ‘Wilma’]

.next ile kısa devre kullanımı

araba_dukkani = [('Toyota', 1000), ('lastik', 80), ('Porsche', 5000)]
def kucuk_deger_bul(isim_deger_tuple):
    print('Kontrol {0}, {1}$'.format(*isim_deger_tuple)
    return isim_deger_tuple[1] < 100
next(filterfalse(kucuk_deger_bul, araba_dukkani))
# Print: Kontrol Toyota, 1000$
# Çıktı: ('Toyota', 1000)

Eşdeğer bir generatör deyimi

araba_dukkani = [('Toyota', 1000), ('lastik', 80), ('Porsche', 5000)] 
generator = (oge for oge in araba_dukkani if not oge[1] < 100)
next(generator)

Temel map, itertools.imap, ve future_builtins map kullanımı

Python yerleşik işlevleri arasında, map, işlevsel programlama için kullanılan en basit metottur. map() bir yinelemedeki her öğeye belirtilen bir işlevi uygular:

isimler = ['Fred', 'Wilma', 'Barney']
map(len, isimler)  # map Python 3.x'te bir class (sınıf); bu sınıfın objeleri yinelenebilir
# Çıktı: <map object at 0x00000198B32E2CF8>

Python 3 uyumlu mapfuture_builtins modülüne de dahildir

from future_builtins import map  
map(len, isimler)                  
# Çıktı: <itertools.imap instance at 0x3eb0a20>

Alternatif olarak, Python 2’de bir generatör almak için itertools ile gelen imap kullanabilirsiniz

map(len, isimler)   # map() liste döndürür
# Çıktı: [4, 5, 6]

from itertools import imap
imap(len, isimler)  # itertools.imap() generator döndürür 
# Çıktı: <itertools.imap at 0x405ea20>

Python 2 ve 3 arasındaki farkları kaldırmak için sonuç listeye dönüştürülebilir: 

list(map(len, isimler))
# Çıktı: [4, 5, 6]

map() eşdeğer bir liste üreteci veya generatör ifadesi ile değiştirilebilir:

[len(oge) for oge in isimler] # Python 2.x map() kullanımına eşdeğer
# Çıktı: [4, 5, 6]

(len(oge) for oge in isimler) # Python 3.x map() kullanımına eşdeğer
# Çıktı: <generator object <genexpr> at 0x00000195888D5FC0>

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top