Python’un collections modülünde yer alan Counter sınıfı, sayım yapma işlemini kolaylaştıran bir veri yapısıdır. Özellikle bir iterable (örneğin listeler, stringler vb.) içerisindeki öğelerin frekansını hızlıca bulmak için kullanılır. Counter sınıfının çıktısı bir sözlüktür(dictionary). İçine string veya herhangi bir liste gönderdiğimizde liste içindeki her bir elemanın frekansını hesaplar ve sonuç olarak bir dictionary döndürür. Mülakatlar esnasında ilgili soruda bir dizi ve listenin elemanlarının frekansını bulmak için tekerleği yeniden icat etmeden Counter sınıfını kullanıp kullanamayacağınızı başta sorabilir ve bu sınıfı kullanarak soruyla ilgili diğer kısımları implement ederken zaman kazanabilirsiniz. Bu sınıfın zaman ve bellek karmaşıklığı O(n)’dir.
1. Counter Nedir?
Counter, bir iterable içerisindeki öğelerin kaç kez tekrarlandığını saymak için kullanılan bir sınıftır. Bir sözlük gibi çalışır; anahtarlar iterable içerisindeki öğeler olurken, değerler ise bu öğelerin kaç kez tekrarlandığını gösterir.
Örnek Kullanım:
Çıktı:
Bu örnekte, Counter sınıfı her harfi sayar ve frekansını verir.
2. Counter Oluşturma
Counter sınıfı birkaç farklı yolla oluşturulabilir:
2.1. Liste, String veya Diğer Iterable Üzerinden
Çıktı:
2.2. Sözlükten
Bir sözlüğü Counter sınıfına vererek de bir sayaç oluşturulabilir.
Çıktı:
2.3. Anahtar-Değer Çiftleri ile
Counter, anahtar-değer çiftleri ile doğrudan da oluşturulabilir:
Çıktı:
3. Counter Sınıfının Temel Metotları
3.1. elements()
Counter’daki her öğeyi, sayısı kadar tekrar eden bir iterator döndürür.
Çıktı:
3.2. most_common()
Bu metod, en yaygın öğeleri ve frekanslarını sıralı bir şekilde döndürür.
Çıktı:
3.3. subtract()
Bu metod, sayacın öğelerinden çıkartma yapar. Bir iterable veya başka bir Counter nesnesi kullanılabilir.
Çıktı:
4. Counter ile Aritmetik İşlemler
Counter sınıfı aritmetik işlemleri destekler. İki Counter nesnesi arasında toplama, çıkarma, kesişim (min), birleşim (max) gibi işlemler yapılabilir.
4.1. Toplama
İki Counter’ı toplayarak her öğenin frekanslarını birleştirebilirsiniz:
Çıktı:
4.2. Çıkarma
İki Counter’ı çıkararak öğelerin frekanslarını fark alabilirsiniz:
Çıktı:
4.3. Kesişim (min)
İki Counter’ın kesişimi, her öğenin minimum frekansını alır:
Çıktı:
4.4. Birleşim (max)
İki Counter’ın birleşimi, her öğenin maksimum frekansını alır:
Çıktı:
5. Gerçek Dünya Kullanım Alanları
Counter sınıfı, birçok gerçek dünya probleminde kullanılabilir. Örneğin, bir metindeki harflerin veya kelimelerin frekansını bulma, bir anketten en popüler yanıtları toplama gibi işlemler için oldukça faydalıdır.
5.1. Bir Metindeki Kelime Frekansını Bulma
Çıktı:
5.2. Oylama Sonuçlarını Hesaplama
Çıktı:
Sonuç
Python’un Counter sınıfı, öğelerin frekanslarını hızlı ve etkili bir şekilde saymak için kullanışlı bir araçtır. Aritmetik işlemler, kesişim ve birleşim gibi özellikler sayesinde veri analizi ve istatistiksel işlemler için oldukça uygundur. Günlük programlama problemlerinde sıkça kullanılabilecek bu veri yapısı, özellikle büyük veri setlerinde oldukça faydalıdır.
Python’da yield anahtar kelimesi, fonksiyonların değer üretip duraklatılmasını sağlayan ve bu sayede bir iterator yaratan bir yapıdır. yield anahtar kelimesi, fonksiyonları birer jeneratöre dönüştürerek her çağrıldığında bir değer döndüren ve durduğu yerden devam edebilen fonksiyonlar oluşturur.
yield ile Fonksiyonlar
Normal bir fonksiyonda return ifadesi kullanıldığında, fonksiyon bir değer döndürür ve biter. Ancak yield kullanıldığında, fonksiyon bir değer döndürür ve kaldığı yerden çalışmaya devam eder. Jeneratörler, belleği daha verimli kullanmak için tercih edilir çünkü tüm sonuçları aynı anda bellekte tutmak yerine ihtiyaca göre üretirler.
Örnek:
Çıktı:
Bu örnekte, yield her bir adımda bir sayı üretir ve duraklatır.
yield ve Jeneratörlerin Avantajları
Jeneratörler, büyük veri setleriyle çalışırken veya hesaplamaları adım adım yapmak istendiğinde avantaj sağlar. Büyük bir listeyi veya veriyi bellekte tutmak yerine, yield kullanarak sadece gerekli olan veriler üretilebilir.
Bellek Verimliliği:
Bu sayede milyonlarca öğe aynı anda bellekte tutulmaz, sadece gerekli olan öğe üretilir.
Jeneratörlerin Durumu Korumak
Jeneratörler, kaldıkları yeri hatırlama yeteneğine sahiptir. Yani yield kullanılarak duraklatılan fonksiyon, bir sonraki çağrıda kaldığı yerden devam eder.
Örnek:
Çıktı:
Burada fonksiyon her yield ifadesinde duraklar ve sonraki next() çağrısı ile kaldığı yerden devam eder.
yield ve return Farkı
return, bir fonksiyonun çalışmasını sonlandırırken yield, fonksiyonu duraklatır ve daha sonra kaldığı yerden devam etmesini sağlar. Aynı fonksiyon içinde hem yield hem return kullanılabilir, ancak return, jeneratörün sonunu belirtir.
Örnek:
Çıktı:
return ifadesi çalıştığında jeneratör sona erer ve sonraki yield çalışmaz.
Sonsuz Jeneratörler
yield, sonsuz döngülerde de kullanılabilir. Bu şekilde bir jeneratör, talep üzerine sınırsız sayıda değer üretebilir.
Örnek:
Bu örnekte, while True döngüsü ile jeneratör sonsuz bir şekilde sayı üretmeye devam eder.
yield from
Python 3.3 ile birlikte gelen yield from ifadesi, başka bir jeneratörden değerleri doğrudan delege etmek için kullanılır. Bu, özellikle jeneratörler arasında değerleri zincirlemek için kullanışlıdır.
Örnek:
Çıktı:
Bu örnekte, yield from, alt_jeneratör fonksiyonundaki değerleri doğrudan ana jeneratöre delege eder.
Sonuç
yield anahtar kelimesi, Python’da jeneratörler oluşturmanın en temel yoludur. Jeneratörler, belleği verimli kullanarak büyük veri setleriyle çalışmak veya sonsuz veri akışlarını işlemek için oldukça faydalıdır. Ayrıca yield ile fonksiyonların duraklatılıp kaldığı yerden devam etmesi sağlanabilir, bu da onları güçlü bir araç haline getirir.
String, Python’da metin verilerini temsil eden bir veri tipidir. Bir string, tek tırnak (’ ’) veya çift tırnak (” ”) içerisinde yazılarak oluşturulur. String’ler üzerinde çeşitli işlemler yapılabilir; bu makalede, string manipülasyonu için yaygın kullanılan 20 örnek ve döngü ile karakterleri gezmek için 7 farklı yöntem ele alınacaktır.
1. Birleştirme (Concatenation)
İki veya daha fazla string’in birleştirilmesi aşağıdaki şekilde yapılır.
2. Alt String Arama (Substring Search)
Bir string içinde belirli bir alt string’in olup olmadığı aşağıdaki şekilde kontrol edilir.
3. Büyük/Küçük Harf Dönüştürme
String’in tamamen büyük veya küçük harflere dönüştürülmesi aşağıdaki gibi yapılır.
Bir string’in belirli bir kelimeyle başlayıp başlamadığı veya bitip bitmediği şu şekilde kontrol edilir.
5. Parçalama (Splitting)
String’in belirli bir karaktere veya boşluğa göre parçalara ayrılması aşağıdaki şekilde yapılır.
6. Dizeyi Birleştirme (Joining)
Liste halindeki string’lerin tek bir string halinde birleştirilmesi aşağıdaki gibidir.
7. Karakter Değiştirme (Replacing)
Bir string içinde belirli karakterlerin başka karakterlerle değiştirilmesi şu şekilde yapılır.
8. Boşlukları Kırpma (Stripping)
String’in başındaki veya sonundaki boşlukların kaldırılması aşağıdaki gibidir.
9. Dilimleme (Slicing)
String’in belirli bir kısmının seçilmesi şu şekilde yapılır.
10. Formatlama (Formatting)
String’lere değişken yerleştirerek dinamik içerik oluşturma aşağıdaki gibidir.
Elbette, string manipülasyonunda daha fazla örnek ve işlem ekleyebilirim. Karakterleri gezme ve diğer string işlemleriyle ilgili bazı ek örnekler:
11. Karakterleri Gezme (Iterating Over Characters)
Bir string’in karakterlerini tek tek gezmek için for döngüsü kullanabilirsiniz.
12. Karakter Dizini Bulma (Finding Index)
Bir karakterin veya alt string’in dizini (indeksi) bulunabilir.
find metodu karakteri bulamazsa -1 döner.
13. Sayma (Counting)
Bir string içinde belirli bir karakterin veya alt string’in kaç kez geçtiğini sayabilirsiniz.
14. Baş Harfleri Büyük Yapma (Capitalize, Title)
String’in ilk harfini veya her kelimenin baş harfini büyük yapabilirsiniz.
15. String Ters Çevirme (Reversing a String)
String’i ters çevirebilirsiniz.
16. Karakterleri Unicode veya ASCII Koduna Çevirme
ord fonksiyonu bir karakterin Unicode kodunu verirken, chr fonksiyonu bir sayıyı Unicode karakterine çevirir.
17. String İçinde Karakter Seti Kontrolü (isalpha, isdigit, isalnum)
Bir string’in sadece harflerden, sayılardan veya alfanumerik karakterlerden oluşup oluşmadığını kontrol edebilirsiniz.
18. Doldurma (Padding)
Bir string’in başına veya sonuna belirli bir karakter ekleyerek uzunluğunu sabitleyebilirsiniz.
19. İçerik Değiştirme ile Tersine Çevirme
String içinde belirli bir karakter dizisini tersine çevirmek için dilimleme kullanabilirsiniz.
20. Çoklu Değiştirme (Maketrans ve Translate)
Bir string’in karakterlerini topluca değiştirmek için str.maketrans ve translate yöntemlerini kullanabilirsiniz.
String’deki Karakterleri Gezmek(Iteration) için Kullanılabilecek Yöntemler:
1. Karakterleri Gezme (Iterating Over Characters)
Bir string’in karakterlerinin tek tek gezilmesi şu şekilde yapılır.
2. While Döngüsü ile Gezme
while döngüsüyle string’in uzunluğunu kontrol ederek indeks bazlı gezinti şu şekilde yapılır.
3. enumerate fonksiyonunu kullanarak gezme
enumerate fonksiyonu, hem karakterin hem de indeksin gezilmesi için kullanılır.
4. İteratör (Iterator) Kullanarak Karakter Gezme
String’ler iteratörler olarak davranır, bu nedenle iter() ve next() ile gezinti şu şekilde yapılır.
5. Lambda ve map Fonksiyonu ile Gezme
lambda ve map fonksiyonlari yardimiyla karakter dizisini gezerken ayni zamanda istediğimiz formata dönüştürebilir, filtreleyebiliriz. Aşağıda map örneği verilmiştir.
6. List Comprehension ile Gezme
Liste ifadeleri (list comprehension) [ ve ] karakterleri arasına döngü ifadesi konulmasıyla yapılan özel bir işlemdir. Aşağıda ters_karakterlerin bir dizi olduğunu sonradan gelen ifadenin [ ve ] arasında olmasından anlıyoruz.
Bu makalede, Python ile karakter dizisi(string manipülasyonu) ve string’de yer alan karakterlerin nasıl gezilebileceğini göstermeye çalıştım. Her bir yöntemin farklı kullanım alanları ve avantajları bulunmaktadır. İhtiyacınıza göre uygun olan yöntemi seçerek string işlemlerinizi gerçekleştirebilirsiniz.
Python’da dictionary (sözlük), anahtar-değer çiftlerini saklayan ve veri arama, ekleme ve silme işlemleri için optimize edilmiş bir veri yapısıdır. Bu makalede, dictionary veri yapısı ile ilgili temel işlemler ve kullanım örnekleri ele alınacaktır:
Dictionary’e Eleman Atama
Dictionary Elemanlarını Gezme
Dictionary İndeks Kullanarak Gezme
Dictionary’de Bir Anahtarın Varlığını Kontrol Etme
items() Fonksiyonunun Kullanımı
Dictionary İşlemlerinin Zaman ve Bellek Karmaşıklıkları (Complexıty)
1. Dictionary’e Eleman Atama
Dictionary’ye eleman atama işlemi, belirli bir anahtara değer atama veya yeni anahtar-değer çifti ekleme şeklinde olabilir.
a. Belirli Bir Anahtara Değer Atama
Var olan bir anahtarın değerini güncelleyebilir veya yeni bir anahtar-değer çifti ekleyebilirsiniz.
b. Eleman Silme
del anahtar kelimesi veya pop() metodu kullanılarak belirli bir anahtar silinebilir.
2. Dictionary Elemanlarını Gezme
Dictionary üzerinde gezinti yapmak için for döngüsü kullanılabilir.
Python dictionary veri yapısında indeks kavramı doğrudan yoktur, ancak anahtar-değer çiftlerini belirli bir sıra ile dolaşabilirsiniz.
4. Dictionary’de Bir Anahtarın Varlığını Kontrol Etme
Dictionary’de bir anahtarın olup olmadığını kontrol etmek için in anahtar kelimesi kullanılabilir.
5. items() Fonksiyonunun Kullanımı
items() metodu, dictionary içindeki anahtar-değer çiftlerini bir tuple olarak döner.
a. Başlangıç İndeksini Belirleyerek Gezme
Anahtar-değer çiftlerini enumerate ile birlikte kullanarak gezinebilirsiniz.
6. Dictionary İşlemlerinin Zaman ve Bellek Karmaşıklıkları
Python’daki dictionary veri yapısı, hash tabanlı bir yapı olduğundan çoğu işlem ortalama O(1) zaman karmaşıklığına sahiptir. Ancak en kötü durum karmaşıklığı O(n) olabilir.
Zaman Karmaşıklığı
Ekleme (Atama): O(1) amortize, O(n) en kötü durum (hash çakışması veya yeniden boyutlandırma gerekirse)
Silme (del, pop()): O(1) amortize, O(n) en kötü durum
Okuma (Anahtara göre değer okuma): O(1) amortize, O(n) en kötü durum
Yazma (Anahtara göre değer yazma): O(1) amortize, O(n) en kötü durum
Anahtarın varlığını kontrol etme (in): O(1) amortize, O(n) en kötü durum
Yer (bellek) karmaşıklığı
Python dictionary, eklenen her anahtar-değer çifti için hash tablosunda bir giriş tutar. Bu nedenle bellek kullanımı, eleman sayısına ve anahtarların hash tablosundaki dağılımına bağlı olarak değişir. O(n) olarak kabul edilebilir.
Sonuç
Bu makalede, Python’da dictionary veri yapısında eleman atama, elemanları gezme, indeks kullanarak dolaşma, bir anahtarın varlığını kontrol etme ve items() fonksiyonunun nasıl kullanılacağı üzerinde duruldu. Dictionary, anahtar-değer çiftleriyle çalışmayı kolaylaştıran ve Python programlamada sıkça kullanılan güçlü bir veri yapısıdır.
Bu makalede listelere birden fazla yöntemle eleman atama, liste elemanlarını gezme ve enumerate fonksiyonunu kullanma konularını adım adım ele alacağız:
Diziye Eleman Atama
Dizi Elemanlarını İterasyonla Gezme
Dizi İndekslerini Kullanarak Gezme
enumerate Fonksiyonunun Kullanımı
1. Diziye Eleman Atama
Diziye eleman atama işlemi, belirli bir indekse değer atama veya yeni eleman ekleme/silme şeklinde olabilir.
a. Belirli Bir İndekse Eleman Atama
Bir dizinin belirli bir indeksine yeni bir değer atayarak mevcut değeri güncelleyebilirsiniz.
b. Yeni Eleman Ekleme
Listeye eleman eklemek için append veya insert metotları kullanılabilir.
c. Eleman Silme
pop metodu ile belirli bir indeksteki eleman silinebilir veya remove metodu ile belirtilen değer listeden çıkarılabilir.
2. Dizi Elemanlarını İterasyonla Gezme
Liste elemanlarını gezmek için for döngüsü sıkça kullanılır.
a. Doğrudan Eleman Gezme
Listede elemanları doğrudan gezerek işlemler yapabilirsiniz.
b. Elemanların Toplamını Bulma
Dizi elemanlarını iterasyonla gezerken başka işlemler de yapabilirsiniz, örneğin toplamını hesaplama:
3. Dizi İndekslerini Kullanarak Gezme
Listeyi iterasyonla gezerken indeksi kullanmanız gerekebilir. Bunu range fonksiyonuyla yapabilirsiniz.
Bu yöntem, hem indeks hem de değer üzerinde işlem yapmak gerektiğinde kullanışlıdır.
4. enumerate Fonksiyonunun Kullanımı
enumerate fonksiyonu, bir listeyi iterasyonla gezerken her elemanın indeksini ve değerini aynı anda elde etmeyi sağlar.
Bu yöntem, indeks ve değerin aynı anda gerekli olduğu durumlarda hem daha okunabilir hem de daha Pythonic bir çözümdür.
a. Başlangıç İndeksini Belirleme
enumerate fonksiyonuna ikinci bir argüman vererek başlangıç indeksini belirleyebilirsiniz.
Sonuç
Bu makalede, Python’da dizilere eleman atama, dizi elemanlarını iterasyonla gezme, indeksleri kullanarak gezme ve enumerate fonksiyonunun nasıl kullanılacağı üzerinde duruldu. Bu temel işlemler, dizilerle etkili bir şekilde çalışmak için önemli olup, Python programlamada sıkça karşımıza çıkar.