Jose: Merhaba, tekrar hoş geldiniz.
Bu derste filtre hakkında konuşacağız.
Artık jeneratörlerimizi, iteratörlerimizi
ve iterable'larımızı öğrendiğimize göre, bazı eğlenceli
yerleşik fonksiyonlarla başlayabiliriz.
Filtre fonksiyonu Python'da herhangi
bir dosya veya programdan çağırabileceğiniz yerleşik bir
fonksiyondur, yerleşik anlamı budur
ve iki argüman alır.
Filtre işlevinin ilk argümanı
başka bir işlevdir
ve ayrıca bir yinelenebilir alır.
Yani şöyle bir şey, Rolf,
Jose, Randy, Anna ve
Mary gibi bir arkadaş listesi bulalım ve bir tanesini kaçırdığımı
biliyorum.
Şimdi de filtre işlevini
kullanarak yalnızca R harfiyle başlayan arkadaşları
alacağız.
Yani, R ile başlayın, filtre olacak,
bu fonksiyon, şimdi bir fonksiyon ilk
argümanını alıyor, arg
1, doğru veya yanlış döndüren fonksiyon.
Dolayısıyla, bu filtre fonksiyonunun ilk argümanı,
neyi filtrelemek istediğimize bağlı olarak true veya false
döndüren başka bir fonksiyon olmalıdır.
Burada bir fonksiyon tanımlamama izin verin.
R ile başlıyor.
R ile başlayan arkadaş noktasını döndürün.
Arkadaş nokta R ile başlar, buradaki argüman
R ile başlıyorsa doğru, başlamıyorsa yanlış
olacaktır.
Dolayısıyla, filtre fonksiyonunun ilk argümanı
bu R ile başlar fonksiyonu
olmalı ve ikinci argüman bir
yinelenebilir olmalıdır, bunların ne olduğunu
biliyoruz, bu yüzden arkadaşlar bir yinelenebilirdir
çünkü üzerinde yineleyebiliriz,
bu bir listedir ve işte bu, filtre fonksiyonunun neye
benzediği ve ne yaptığı, yalnızca bunun doğru
döndürdüğü öğeleri tutar.
Böylece, filtre fonksiyonu ilk kez
çalıştığında size Rolf'u verecektir, Rolf arkadaşlara
gidecektir, arkadaş R ile başlarsa
true olacaktır, böylece Rolf filtre
fonksiyonu tarafından tutulacaktır.
Sonra tekrar gidecek ve bu sefer Jose ile, Jose R ile başlıyor
yanlış, bu yüzden filtre onu kaldıracak ve görmezden
gelecek ve buradaki her arkadaş için böyle
devam edecek.
İlginç olan şey, filtrenin aslında
bir üreteç döndürmesidir, böylece
biraz daha verimli olur,
listenizi yalnızca tutmak
istediğiniz öğelerle kopyalamak yerine,
sonraki öğeyi çağırmanız gerekir, R öğesiyle başlayın, böylece bir sonraki
kullanılabilir öğeyi elde edersiniz, bu durumda Rolf olacaktır.
Bunu tekrar ve tekrar yaparsanız, Randy'yi alırsınız
ve sonunda daha
önce bahsettiğimiz bu yinelemeyi durdurma istisnasını alırsınız,
bir dizinin veya bir
üretecin veya bir yineleyicinin sonuna
ulaştığınızda bunu işaret
eden şeydir, tamam mı?
Bir for döngüsü yaptığınızda,
for döngüsünün arka planda
yaptığı şey sadece next'i çağırmaktır ve bu stop
yinelemesine ulaşır ulaşmaz for
döngüsü durur ve size bu hatayı
vermez çünkü stop yinelemesi bu anlama
gelecek şekilde tasarlanmıştır ve for
döngüsü, sona ulaştığını bilmek için stop yinelemesini
kullanan bir yapıdır, tamam mı?
Elbette, list of start with R yaparsanız, size üreteçteki
tüm öğelerin bir listesini
verecek, her öğeyi
gözden geçirecek ve yeni bir listeye
koyacaktır.
Şimdi bunu tekrar yaparsanız, ne olacağını
düşünüyorsunuz?
Boş bir liste alacaksınız, buradaki
liste nesnesi bir durdurma yinelemesini yükseltmez, ancak durdurma yinelemesinin
yükseltildiğini görür ve size hiçbir
şey vermez, şimdi size
boş bir liste verir çünkü üreteç
zaten kullanılmıştır ve sonuna ulaştığını
hatırlar, bu yüzden size başka bir şey
veremez.
Bu filtre fonksiyonuna geçmeden önce jeneratörleri,
yineleyicileri ve yinelenebilirleri açıklamamın nedeni bu, tamam mı?
Elbette burada bir parametre alan ve parametre R ile
başladığında geri dönen
bir fonksiyon tanımlamak yerine sadece
bir lamda kullanabilirdik.
Bu lamda fonksiyonu da tamamen aynıdır,
bir parametre alır ve iki nokta üst üste işaretinden
sonra ne döndürdüğünü tanımlarız ve döndürdüğü şey x noktasının
R ile başlamasıdır, dolayısıyla x'in R ile başlayıp başlamadığına bağlı olarak bu doğru
veya yanlıştır.
Kendinizi daha iyi hissettirecekse, friend
parametresini çağırabilirsiniz ve bu şekilde belki
de bu işlevin buradaki arkadaşlar
üzerinde çalışacağı biraz daha net
olur, o zaman artık oradaki işleve
ihtiyacınız kalmaz.
Ayrıca artık ne anlama geldiğini bildiğimiz
için bu yoruma da ihtiyacımız yok.
Buradaki filtre işlevi
buradaki üreteç
ifadesiyle aynıdır, F nokta
R ile başlıyorsa F for F in
friends diyen bu üreteç anlayışı.
Yani bu ikisi birbirinin aynısı, tamam mı?
Burada kendimize bir üreteç ifadesi
bulduk, her arkadaşı yeni bir üretece
koyan bir üreteç anlayışı, ancak yalnızca F R ile başlıyorsa,
bu ikisi aynı, tamam mı?
Hangisi daha hızlı?
Hangisi daha iyi performans gösteriyor?
En azından bu durumda, jeneratör kavrama daha
iyi bir performans sergiliyor.
Bunun nedeni, bu filtrede
bu lamda işlevini oluşturmanız ve oluşturucu ifadesinde
bir lamda işlevi oluşturmanız
gerekmemesidir.
Eğer fonksiyonunuz programınızda başka
bir yerde tanımlıysa, filtre fonksiyonu
daha iyi performans gösterebilir ve ayrıca bazı durumlarda
filtre fonksiyonunun daha
okunaklı olabileceğini düşünüyorum, ancak diğer birçok durumda liste kavramının daha okunaklı
olduğunu düşünüyorum.
Bu yüzden hangisini kullanacağınız
size kalmış, ben normalde kavramaları tercih ediyorum,
ayrıca biraz daha Pythonic.
Bu arada, tam olarak ne olup
bittiğinin anlaşılması için,
bu iki filtre ve bu üretici anlayışı,
tanımlayacağım diğer işlevle
aynıdır.
Bu da buna çok benzeyen,
bir fonksiyon
ve bir yinelenebilir alan ve yinelenebilir
üzerinde yineleme yapan, fonksiyonun doğru dönüp
dönmediğini kontrol eden ve fonksiyon
doğruysa sonunda I değerini veren başka
bir filtre fonksiyonudur.
Şimdi, özel filtreyi burada çağırdığımızı düşünelim.
Lamda arkadaş R ile başlar bu işlevdir,
yinelenebilir arkadaş listemizdir.
Yinelenebilir üzerinde yineleme yaparız, Rolf olan ilk
öğeyi alırız.
Eğer func I, yani friend starts with R doğruysa,
ki doğru, o zaman I, yani Rolf'u
vereceğiz.
Bu fonksiyonda next dediğimizde Rolf'u
alacağız ve dokuzuncu satırdan
sonra duracağız.
Tekrar next dediğimizde,
en başa geri döneceğiz, bu I, bu arada bu Jose,
Jose dizesi, fonksiyonun eşleşip eşleşmediğini
kontrol edeceğiz,
yanlış olacak, bu yüzden hiçbir şey vermeyeceğiz,
durmayacağız, döngünün bir sonraki elemanına geçeceğiz,
Randy'nin R ile başlayıp başlamadığını kontrol
edeceğiz ve öyle, öyle, sonra Randy'yi vereceğiz
ve duracağız.
Bir dahaki sefere next dediğimizde, buraya gideriz
ve Anna'dır, yanlıştır, bu yüzden teslim etmeyiz, devam ederiz,
I is Mary'dir, yanlıştır, bu yüzden teslim etmeyiz,
devam ederiz, sona ulaşırız, bu bir durdurma yinelemesidir,
böylece üreteç nesnesinin sonuna ulaşırız ve bu da bize
sona ulaştığımızı söyleyen başka bir durdurma yinelemesidir.
Umarım bu mantıklıdır, Python'un
ne hakkında olduğunu biraz daha anlamaya başlıyoruz,
bu da verilerin yönetilmesi ve verilerin bir yerden
başka bir yere gönderilmesi ve verim son derece güçlüdür
çünkü hepsini aynı anda bellekte
saklamak zorunda kalmadan değerleri tek tek durdurmanıza
ve oluşturmanıza izin verir.
Her neyse, bu video için bu
kadar, sadece size bu filtre işlevini ve nasıl kullanıldığını
göstermek istedim.
Filtre işlevi diğer birçok programlama
dilinde de mevcuttur, bu nedenle
programlama becerilerinizi geliştirdikçe
ve programlama yolculuğunuza devam ettikçe bunu
her yerde göreceksiniz.
Evet, hepsi bu kadar ve bir sonraki
videoda görüşmek üzere.