Ana içeriğe geç

Python filter(): İhtiyacınız Olanı Tutun

Python'un filter() fonksiyonunu kullanarak listelerden veya diğer yinelenebilirlerden öğeleri nasıl çıkaracağınızı öğrenin. filter ile benzer Python araçları arasındaki temel farkları anlayın.
· 7 dk. oku

Yapay Zeka ile Keşfedin

Filtreleme, Python’daki en yaygın görevlerden biridir; bu yüzden Python bunu kolaylaştırır. Verileri filtrelemenin en basit yollarından biri, yerleşik filter() fonksiyonunu kullanmaktır. Adının da açıkça belirttiği gibi, filter() yalnızca belirli bir koşulu (veya koşulları) karşılayan öğeleri çekmenize olanak tanır.

Bu rehber, nasıl çalıştığını, ne zaman kullanılacağını ve diğer filtreleme araçlarıyla nasıl karşılaştırıldığını adım adım anlatır. Keyifli okumalar!

Python filter() Ne Yapar

filter(), bir liste, demet (tuple) veya herhangi bir yinelenebilirden (iterable) öğeleri çeker; ancak yalnızca testinizi geçerlerse. Her öğeyi alan ve True veya False döndüren bir fonksiyon sağlarsınız (buna bazen öngörü [predicate] dendiğini de gördüm). Test geçerse (yani fonksiyonunuz True dönerse) filter() onu tutar. Aksi halde öğeyi atlar. Oldukça kendini anlatan bir yapı, o halde devam edelim.

Python filter() Sözdizimi

Biçimi şöyle:

filter(function, iterable)
  • function: Her bir öğeye uygulamak istediğiniz testi belirtir. Tek argüman almalı ve True veya False döndürmelidir.

  • iterable: Liste, demet, dize veya üzerinden döngü kurulabilen herhangi bir nesneyi sağlar.

filter() çağırdığınızda, doğrudan bir liste veya demet değil, özel bir filter nesnesi döner. Filtrelenmiş sonuçlarla gerçekten çalışmak için genellikle çıktıyı bir listeye veya demete sararsınız. Bu tasarım tercihi filter()’ı verimli kılar, ancak kod yazarken akılda tutulması gereken bir noktadır.

Python filter() Örnekleri

Biraz pratik yapalım.

Özel bir fonksiyonla Python filter()

Kendi yazdığımız bir fonksiyonla filter() kullanalım.

Diyelim ki bir listeden yalnızca çift sayıları tutmak istiyorsunuz:

def is_even(num):
    return num % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
result = filter(is_even, numbers)
print(list(result))

Bu şunu yazdırır:

[2, 4, 6]

is_even fonksiyonunun bir sayının 2’ye bölünüp bölünmediğini nasıl kontrol ettiğine dikkat edin. filter(), her öğeyi test etmek ve testimizi geçenleri tutmak için özel fonksiyonumuzu kullanır.

Lambda fonksiyonlarıyla Python filter()

Elbette, her filtre için tam bir fonksiyon tanımı gerekmez. Bazen filtreleme kuralınız o kadar basit veya tek bir yere özgüdür ki, adlandırılmış bir fonksiyon tanımlamak gereksiz olur.

Aynı çift sayı örneği, ancak bu kez kısa ve yerinde bir test için bir lambda kullanarak:

numbers = [1, 2, 3, 4, 5, 6] 
result = filter(lambda x: x % 2 == 0, numbers) 
print(list(result))

Öncekiyle aynı çıktıyı alırsınız.

filter() ile lambda kullanmak, kodunuzu kısa ve odaklı tutmak istediğinizde özellikle yaygındır. Tek seferlik filtreleme görevleri için çok uygundur; kuralınızı ihtiyacınız olan yerde ifade etmenizi sağlar.

Fonksiyon olarak None ile Python filter()

Bazen boş veya yalancı (falsey) değerleri filter() ile ayıklamak istersiniz. 0, boş dizeler, None veya False gibi; ve bunu özel bir fonksiyon yazmadan yapmak isteriz.

Python bunun için bir püf noktası sunar: filter() içinde fonksiyon argümanını None yaparsanız, filter() Python’un False kabul ettiği tüm öğeleri otomatik olarak kaldırır.

Örnek:

items = [0, 1, '', 'hello', [], [2, 3], None, False, True] 
result = filter(None, items) 
print(list(result))

Bu şunu yazdırır:

[1, 'hello', [2, 3], True]

Metin verilerini filtreleme

Şimdi filter()’ı pratik, günlük bir probleme uygulayalım. Elinizde bir kelime listesi olduğunu ve yalnızca ‘a’ ile başlayanları istediğinizi varsayalım. Metin işlerken bu tür hedefli filtreleme sık sık karşınıza çıkar.

words = ['apple', 'banana', 'apricot', 'cherry', 'avocado'] 
result = filter(lambda word: word.startswith('a'), words) 
print(list(result))

Şunu alırsınız:

['apple', 'apricot', 'avocado']

Birden çok koşulla filtreleme

Bazen filtreleme ölçütleriniz daha karmaşık hale gelir. Ya birkaç koşulu birden sağlayan öğelere ihtiyacınız olursa? Bunu bir lambda ile şöyle yapabilirsiniz. Bu örnekte hem çift hem de 10’dan büyük sayıları buluyoruz.

numbers = [4, 10, 12, 15, 20, 23, 28] 
result = filter(lambda x: x % 2 == 0 and x > 10, numbers) 
print(list(result))

Bu şunu yazdırır:

[12, 20, 28]

(Daha da fazla koşul olsaydı, açıklık için lambdadan adlandırılmış bir fonksiyona geçmeyi düşünürdüm.)

filter() ve Liste Üretimi (List Comprehension)

Liste üretimleri de öğe seçmenin popüler bir yoludur. Her iki yaklaşım da verileri filtrelemenize olanak tanır, ancak her birinin kendine özgü bir tarzı vardır.

İşte çift sayı örneği yine, bu kez bir liste üretimi kullanarak:

numbers = [1, 2, 3, 4, 5, 6] 
result = [x for x in numbers if x % 2 == 0] 
print(result)
[2, 4, 6]

Hem filter() hem de liste üretimleri işi görür. Liste üretimleri, özellikle kural kısa ve basitse, basit filtreler için genellikle daha okunabilirdir.

Öte yandan, filter() fonksiyonlarla zaten çalışıyorsanız veya birden çok işleme adımını art arda bağlamak istiyorsanız iyi çalışır.

Daha İleri Kullanımlar

Biraz daha ilginç örnekler bulalım:

Diğer yinelenebilirlerle filter()

Listelerde yaptığımız gibi, filter() herhangi bir yinelenebilirle de çalışır; demetler, kümeler — hatta üreteç ifadeleri ile. Bu iyi bir bilgidir çünkü verileriniz her zaman liste biçiminde olmayabilir.

Bir demeti nasıl filtreleyebileceğiniz şöyle:

numbers = (10, 15, 20, 25, 30) 
result = filter(lambda x: x > 20, numbers) 
print(tuple(result))

Bu şunu yazdırır:

(25, 30)

Sonuçları doğrudan kullanmanız gerektiğinde, filter nesnesini istediğiniz türe (liste, demet vb.) dönüştürmeyi unutmayın.

Az önce üreteçlerden de bahsetmiştim; tam olsun diye, üreteçlerle filtrelemeye bir örnek de göstereyim:

numbers = (x for x in range(10))
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))

Bu bir üreteçtir çünkü şu satır: numbers = (x for x in range(10)) bir üreteç nesnesi oluşturur. (Tembeldir ve tüm değerleri bir kerede üretmez.)

Son satır: print(list(result)), tembel filter nesnesini bir listeye dönüştürerek değerlendirmeyi zorlar.

filter()’ı map() ile birleştirme

Hem filtrelemek hem de dönüştürmek istediğinizde ne olur? Örneğin, bir listedeki yalnızca çift sayıların karesini almak gibi?

Python, filter() ve map()’i birleştirmenize izin vererek bunu kolaylaştırır. Önce filter() istediğiniz öğeleri seçer, ardından map() her birine başka bir fonksiyon uygular.

Uygulaması şöyle:

numbers = [1, 2, 3, 4, 5, 6] 
evens = filter(lambda x: x % 2 == 0, numbers) 
squared = map(lambda x: x ** 2, evens) 
print(list(squared))

Bu şunu yazdırır:

[4, 16, 36]

filter() ve map()’i ardışık bağlayarak, önce önem verdiğiniz öğeleri seçip sonra gerektiği gibi dönüştürerek net ve okunabilir veri işleme hatları kurabilirsiniz. Kendi çalışmalarınızda bu deseni kullanma fırsatları olacaktır.

Dikkat Edilmesi Gerekenler

filter() ne kadar kullanışlı olsa da, insanların yaptığı bazı hatalar vardır:

  • filter() bir liste değil, bir filter nesnesi döndürür. Sonuçları hemen görmeyi beklerseniz bu sizi şaşırtabilir. Sonuçları görmek veya yeniden kullanmak istiyorsanız her zaman bir listeye (veya demete) sarın.

  • filter() aynı anda yalnızca bir yinelenebilirle çalışır. Birden çok listeye dayalı olarak filtrelemek istiyorsanız, onları zip ile birleştirmeniz veya başka bir yaklaşım kullanmanız gerekir.

  • filter() tembeldir. Verileri, onu bir listeye veya demete dönüştürmeden ya da üzerinde döngü kurmadan gerçekten işlemez. Hata ayıklarken bu davranışı aklınızda bulundurun.

Sonuç

Gördüğünüz gibi, Python’un filter() fonksiyonu, yalnızca önemli olanları çekerek verileri hızlıca temizlemenin bir yolunu sunar. filter(), ister tek seferlik bir lambda yazıyor olun ister adlandırılmış bir fonksiyon bağlıyor olun, işinize yarar. 

filter()’ı nasıl kullanacağınız konusunda net değilseniz veya bunun yeterince basit olduğunu düşünüp öğrenmeye devam etmek istiyorsanız, yardımcı olacak harika kaynaklarımız var. Şu beceri yolumuzu öneririm: Python Programming Fundamentals beceri yolu. 

Josef Waples

Yazar

Josef Waples

Bilimsel dergilerde yayımlanan araştırma makalelerine katkıları olan bir veri bilimi yazarı ve editörüyüm. Özellikle lineer cebir, istatistik, R ve benzeri konularla ilgileniyorum. Aynı zamanda epey satranç da oynarım! 

Python Filter SSS

Python filter() fonksiyonu ne yapar?

filter() fonksiyonu bir fonksiyon ve bir yinelenebilir alır ve yalnızca testi geçen öğelerle yeni bir yinelenebilir döndürür. Test fonksiyonu, tutmak istediğiniz öğeler için True, atlamak istedikleriniz için False döndürmelidir.

Neden filter() sonucunu list() veya tuple() ile sarmalamam gerekiyor?

filter() bir yineleyici olan bir filter nesnesi döndürür. Filtrelenen sonuçları görüntülemek veya yeniden kullanmak için genellikle list() veya tuple() kullanarak bunu bir listeye ya da demete dönüştürürsünüz. Bu adım, yazdırma, hata ayıklama veya sonucu başka fonksiyonlara geçirmek için gereklidir.

Özel bir fonksiyon yazmadan filter() kullanabilir miyim?

Evet. Kısa, tek seferlik testler için bir lambda fonksiyonu kullanabilir veya fonksiyon argümanı olarak None geçirerek 0, '', None ve False gibi tüm "yalancı" değerleri otomatik olarak kaldırabilirsiniz.

filter(), liste üretimlerine göre nasıl bir karşılaştırma sunar?

Hem filter() hem de liste üretimleri verileri filtrelemenize izin verir, ancak basit koşullar için liste üretimleri genellikle daha okunabilirdir. filter(), mantığı fonksiyonlar aracılığıyla yeniden kullanırken veya map() gibi araçlarla zincirlerken kullanışlıdır.

filter() ile birden fazla koşul uygulayabilir miyim?

Kesinlikle. Test fonksiyonunuz veya lambdanız içinde mantıksal operatörleri kullanarak birden çok koşulu birleştirebilirsiniz. Mantık karmaşıklaştığında, kodu okunabilir tutmak için çoğu zaman adlandırılmış bir fonksiyon kullanmak daha iyidir.

Konular

İlgili