İçeriğe geç

blog

Python'da Döngüler

Python’da Tipleri ve Kullanımları

Python programlamada döngüler, bir dizi işlemi tekrar etmek için kullanılır. Python’da en yaygın döngü türleri for döngüsü ve while döngüsüdür. Bu makalede Python’daki döngü yapıları, döngülerde kullanılan önemli komutlar (break, continue gibi) ve yazılım mülakatları ya da LeetCode gibi platformlardaki soru çözümleri için önemli olan konular ele alınacaktır.

1. for Döngüsü

for döngüsü, genellikle iterable (listeler, diziler, stringler gibi) veri yapıları üzerinde gezinmek için kullanılır.

Örnek Kullanım:

Yazılım geliştirme ve LeetCode benzeri sorular içeren algoritma mülakatlarına hazırlanmak için en uygun programlama dili genellikle Python olarak kabul edilir. Bunun birkaç sebebi var. Devam etmeden önce yazılım geliştirme mülakatları ya da competitive programlama için kullanılan en yaygın dillerin özelliklerini sıralayalım.

for eleman in [1, 2, 3, 4]:
print(eleman)

Çıktı:

1
2
3
4

Bu döngü, verilen listedeki her bir elemanı tek tek gezerek yazdırır.

for döngüsünün range() fonksiyonu ile kullanımı:

range() fonksiyonu, belirli bir aralıkta sayılar üretir ve for döngüsü ile birlikte sıkça kullanılır.

Örnek Kullanım:

for i in range(5):
print(i)

Çıktı:

1
2
3
4
5

2. while Döngüsü:

while döngüsü, belirli bir koşul doğru olduğu sürece çalışmaya devam eder. Koşul False olduğunda döngü sona erer.

Örnek Kullanım:

i = 0
while i < 5:
print(i)
i += 1

Çıktı:

0
1
2
3
4

Bu döngü, i değişkeni 5 olana kadar çalışır ve her adımda i bir arttırılır.

3. break ve continue Kullanımı:

break:

Döngüyü tamamen sonlandırır. break ifadesine ulaşıldığında döngü sona erer ve döngünün dışına çıkılır.

Örnek Kullanım:

for i in range(5):
if i == 3:
break
print(i)

Çıktı:

0
1
2

Bu örnekte, i 3 olduğunda döngü break ile sonlanır.

continue:

Döngünün o anki iterasyonunu atlayarak bir sonraki iterasyona (adıma) geçer.

Örnek Kullanım:

for i in range(5):
if i == 3:
continue
print(i)

Çıktı:

0
1
2
4

Bu örnekte, i 3 olduğunda continue ifadesi çalışır ve o iterasyon atlanır.

4. İç İçe Döngüler:

Döngüler, başka bir döngünün içinde kullanılabilir. İç içe döngüler genellikle iki boyutlu veri yapılarıyla (örneğin, matrisler) çalışırken kullanılır.

Örnek Kullanım:

for i in range(3):
for j in range(2):
print(f"i: {i}, j: {j}")

Çıktı:

i: 0, j: 0
i: 0, j: 1
i: 1, j: 0
i: 1, j: 1
i: 2, j: 0
i: 2, j: 1

Bu örnekte, her i değeri için j değeri döngüye girer ve bu şekilde iç içe iki döngü çalıştırılır.

5. İç İçe Döngülerden Çıkış:

İç içe döngülerden çıkmak için break ifadesi tek başına yeterli olmayabilir. Sadece en içteki döngüden çıkış sağlar. İç içe döngülerden tamamen çıkmak için birkaç çözüm yöntemi vardır:

flag Kullanmak:

Bir bayrak (flag) değişkeni kullanılarak iç içe döngülerden çıkılabilir.

Örnek Kullanım:

flag = False
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
flag = True
break
if flag:
break

fonksiyon Kullanmak:

Bir fonksiyon içindeki döngülerden return ile tamamen çıkılabilir.

Örnek Kullanım:

def ic_ice_dongu():
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
return
print(f"i: {i}, j: {j}")
ic_ice_dongu()

Çıktı:

i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
i: 1, j: 1

6. Döngülerin Sonunda else Kullanımı:

Python’da döngüler, normal bir şekilde sona ererse else bloğu çalıştırılır. Ancak döngü break ifadesi ile sona erdirilirse, else bloğu çalışmaz.

for i in range(5):
if i == 3:
break
print(i)
else:
print("Döngü normal şekilde sona erdi.")

Çıktı:

0
1
2

Bu örnekte break ifadesi kullanıldığı için else bloğu çalışmaz. Ancak break olmadan döngü tamamlanırsa else bloğu devreye girer.

7. LeetCode ve Mülakat Soruları için Öneriler

7.1. LeetCode Sorusu: “Two Sum”

Bu soru, bir dizide iki sayının toplamının belirli bir hedef değeri vereceği iki indeksi bulmayı gerektirir. Döngüler ve koşullu ifadeler sıklıkla kullanılır.

Bu soruyu iç içe döngülerle aşağıdaki şekilde çözebiliriz:

def two_sum(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]

LeetCode Sorusu: “Valid Parentheses”

Bu soruda parantezlerin doğru bir şekilde eşleşip eşleşmediğini kontrol eden bir çözüm yazmanız istenir.

Bu soruyu iç içe döngülerle aşağıdaki şekilde çözebiliriz:

def is_valid(s):
stack = []
par_map = {')': '(', '}': '{', ']': '['}
for char in s:
if char in par_map:
top_element = stack.pop() if stack else '#'
if par_map[char] != top_element:
return False
else:
stack.append(char)
return not stack

8. Sonsuz Döngüler

Bir döngü sonsuza kadar çalışabilir. Bu genellikle koşulun yanlış yazılması veya bilinçli olarak sonsuz bir döngü oluşturulmak istendiğinde gerçekleşir. Genellikle döngünün bir noktasında return veya break kullanılarak döngüden çıkılır.

while True:
print("Bu döngü sonsuza kadar çalışacak.")
break # Döngüyü sonlandırmak için break kullanılır.

9. Optimizasyon İpuçları

Döngü İçerisinde Gereksiz Hesaplamalardan Kaçının: Döngü içerisinde sabit olan hesaplamaları döngü dışında yaparak performansı artırabilirsiniz.

enumerate() Fonksiyonunu Kullanın: Döngüde hem öğeyi hem de indeksini kullanmak için enumerate() fonksiyonunu kullanabilirsiniz.

liste = ['elma', 'armut', 'kiraz']
for indeks, deger in enumerate(liste):
print(indeks, deger)

** Çıktı: **

0 elma
1 armut
2 kiraz

Sonuç:

Python’daki döngü yapıları ve kontrol ifadeleri, algoritma sorularında ve günlük programlama problemlerinde önemli bir yere sahiptir. Bu makalede ele alınan konular, yazılım mülakatlarına hazırlık ve LeetCode gibi platformlarda sorular çözerken faydalı olacaktır. Döngülerde performans optimizasyonu yapmayı, break ve continue gibi ifadelerle program akışını yönetmeyi öğrenmek, daha etkin ve doğru kod yazmanıza yardımcı olacaktır.

Python Counter Sınıfı Kullanımı

Python Counter Sınıfı Kullanımı

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:

from collections import Counter
metin = "python programming"
counter = Counter(metin)
print(counter)

Çıktı:

Counter({'p': 2, 'o': 2, 'g': 2, 'r': 2, 'm': 2, 'n': 1, 'y': 1, 't': 1, 'h': 1, 'i': 1})

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

from collections import Counter
liste = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counter = Counter(liste)
print(counter)

Çıktı:

Counter({4: 4, 3: 3, 2: 2, 1: 1})

2.2. Sözlükten

Bir sözlüğü Counter sınıfına vererek de bir sayaç oluşturulabilir.

from collections import Counter
sozluk = {'elma': 3, 'armut': 2, 'kiraz': 5}
counter = Counter(sozluk)
print(counter)

Çıktı:

Counter({'kiraz': 5, 'elma': 3, 'armut': 2})

2.3. Anahtar-Değer Çiftleri ile

Counter, anahtar-değer çiftleri ile doğrudan da oluşturulabilir:

counter = Counter(elma=3, armut=2, kiraz=5)
print(counter)

Çıktı:

Counter({'kiraz': 5, 'elma': 3, 'armut': 2})

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.

counter = Counter(a=2, b=3, c=1)
print(list(counter.elements()))

Çıktı:

['a', 'a', 'b', 'b', 'b', 'c']

3.2. most_common()

Bu metod, en yaygın öğeleri ve frekanslarını sıralı bir şekilde döndürür.

counter = Counter('mississippi')
print(counter.most_common(2)) # En yaygın 2 öğeyi döndürür

Çıktı:

[('i', 4), ('s', 4)]

3.3. subtract()

Bu metod, sayacın öğelerinden çıkartma yapar. Bir iterable veya başka bir Counter nesnesi kullanılabilir.

counter = Counter(a=4, b=2, c=0, d=-2)
counter.subtract(Counter(a=1, b=2, c=3, d=1))
print(counter)

Çıktı:

Counter({'a': 3, 'c': -3, 'd': -3, 'b': 0})

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:

counter1 = Counter(a=3, b=1)
counter2 = Counter(a=1, b=2, c=1)
print(counter1 + counter2)

Çıktı:

Counter({'a': 4, 'b': 3, 'c': 1})

4.2. Çıkarma

İki Counter’ı çıkararak öğelerin frekanslarını fark alabilirsiniz:

print(counter1 - counter2)

Çıktı:

Counter({'a': 2})

4.3. Kesişim (min)

İki Counter’ın kesişimi, her öğenin minimum frekansını alır:

print(counter1 & counter2)

Çıktı:

Counter({'a': 1, 'b': 1})

4.4. Birleşim (max)

İki Counter’ın birleşimi, her öğenin maksimum frekansını alır:

print(counter1 | counter2)

Çıktı:

Counter({'a': 3, 'b': 2, 'c': 1})

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

metin = "python is great and python is dynamic"
kelimeler = metin.split()
counter = Counter(kelimeler)
print(counter.most_common(2)) # En yaygın iki kelime

Çıktı:

[('python', 2), ('is', 2)]

5.2. Oylama Sonuçlarını Hesaplama

oylar = ['A', 'B', 'A', 'C', 'B', 'A']
counter = Counter(oylar)
print(counter)

Çıktı:

Counter({'A': 3, 'B': 2, 'C': 1})

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 Özelliğinin Kullanımı

Python yield Özelliği

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:

def sayilar():
for i in range(5):
yield i
gen = sayilar()
for num in gen:
print(num)

Çıktı:

0
1
2
3
4

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:

def buyuk_liste():
for i in range(10**6):
yield i
gen = buyuk_liste()

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:

def say():
print("Başlıyor")
yield 1
print("Devam ediyor")
yield 2
print("Bitiyor")
gen = say()
print(next(gen)) # Başlıyor ve 1 döner
print(next(gen)) # Devam ediyor ve 2 döner

Çıktı:

Başlıyor
1
Devam ediyor
2
Bitiyor

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:

def karisik():
yield 1
yield 2
return "Bitti"
yield 3 # Bu kısım çalışmaz
gen = karisik()
print(next(gen))
print(next(gen))
print(next(gen)) # StopIteration hatası

Çıktı:

1
2
StopIteration: Bitti

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:

def sonsuz_sayilar():
i = 0
while True:
yield i
i += 1
gen = sonsuz_sayilar()
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 2

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:

def alt_jeneratör():
yield 1
yield 2
def ana_jeneratör():
yield from alt_jeneratör()
yield 3
for deger in ana_jeneratör():
print(deger)

Çıktı:

1
2
3

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.

Python Veri Yapıları - String

Python ile String Manipülasyonu

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.

str1 = "Merhaba"
str2 = "Dünya"
sonuc = str1 + " " + str2
print(sonuc) # Çıktı: Merhaba Dünya

Bir string içinde belirli bir alt string’in olup olmadığı aşağıdaki şekilde kontrol edilir.

text = "Python programlama"
bulunan = "program" in text
print(bulunan) # Çıktı: True

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.

text = "Merhaba"
print(text.upper()) # Çıktı: MERHABA
print(text.lower()) # Çıktı: merhaba

4. Başlangıç/Bitiş Kontrolü (startswith, endswith)

Bir string’in belirli bir kelimeyle başlayıp başlamadığı veya bitip bitmediği şu şekilde kontrol edilir.

text = "Python programlama"
print(text.startswith("Python")) # Çıktı: True
print(text.endswith("lama")) # Çıktı: True

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.

text = "Python,Java,C++"
diller = text.split(",")
print(diller) # Çıktı: ['Python', 'Java', 'C++']

6. Dizeyi Birleştirme (Joining)

Liste halindeki string’lerin tek bir string halinde birleştirilmesi aşağıdaki gibidir.

diller = ['Python', 'Java', 'C++']
birlesmis = ", ".join(diller)
print(birlesmis) # Çıktı: Python, Java, C++

7. Karakter Değiştirme (Replacing)

Bir string içinde belirli karakterlerin başka karakterlerle değiştirilmesi şu şekilde yapılır.

text = "Merhaba Dünya"
yeni_text = text.replace("Dünya", "Python")
print(yeni_text) # Çıktı: Merhaba Python

8. Boşlukları Kırpma (Stripping)

String’in başındaki veya sonundaki boşlukların kaldırılması aşağıdaki gibidir.

text = " Merhaba "
print(text.strip()) # Çıktı: Merhaba
print(text.lstrip()) # Sadece baştaki boşlukları kaldırır
print(text.rstrip()) # Sadece sondaki boşlukları kaldırır

9. Dilimleme (Slicing)

String’in belirli bir kısmının seçilmesi şu şekilde yapılır.

text = "Python Programlama"
print(text[0:6]) # Çıktı: Python
print(text[7:]) # Çıktı: Programlama

10. Formatlama (Formatting)

String’lere değişken yerleştirerek dinamik içerik oluşturma aşağıdaki gibidir.

isim = "Ahmet"
yas = 25
mesaj = f"{isim} {yas} yaşında."
print(mesaj) # Çıktı: Ahmet 25 yaşında.

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.

text = "Python"
for karakter in text:
print(karakter)
# Çıktı:
# P
# y
# t
# h
# o
# n

12. Karakter Dizini Bulma (Finding Index)

Bir karakterin veya alt string’in dizini (indeksi) bulunabilir.

text = "Merhaba Dünya"
index = text.find("Dünya")
print(index) # Çıktı: 8

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.

text = "Merhaba Merhaba"
sayim = text.count("Merhaba")
print(sayim) # Çıktı: 2

14. Baş Harfleri Büyük Yapma (Capitalize, Title)

String’in ilk harfini veya her kelimenin baş harfini büyük yapabilirsiniz.

text = "python programlama"
print(text.capitalize()) # Çıktı: Python programlama
print(text.title()) # Çıktı: Python Programlama

15. String Ters Çevirme (Reversing a String)

String’i ters çevirebilirsiniz.

text = "Python"
ters = text[::-1]
print(ters) # Çıktı: nohtyP

16. Karakterleri Unicode veya ASCII Koduna Çevirme

ord fonksiyonu bir karakterin Unicode kodunu verirken, chr fonksiyonu bir sayıyı Unicode karakterine çevirir.

karakter = 'A'
ascii_degeri = ord(karakter)
print(ascii_degeri) # Çıktı: 65
sayi = 66
karakter = chr(sayi)
print(karakter) # Çıktı: B

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.

text = "Python123"
print(text.isalpha()) # Çıktı: False (sadece harf değil)
print(text.isdigit()) # Çıktı: False (sadece rakam değil)
print(text.isalnum()) # Çıktı: True (harf ve rakamlardan oluşuyor)

18. Doldurma (Padding)

Bir string’in başına veya sonuna belirli bir karakter ekleyerek uzunluğunu sabitleyebilirsiniz.

text = "Python"
text_sol = text.ljust(10, '*') # Çıktı: Python****
text_sag = text.rjust(10, '-') # Çıktı: ----Python
text_ortala = text.center(10, '=') # Çıktı: ==Python==
print(text_sol, text_sag, text_ortala)

19. İçerik Değiştirme ile Tersine Çevirme

String içinde belirli bir karakter dizisini tersine çevirmek için dilimleme kullanabilirsiniz.

text = "Merhaba Dünya"
degistirilen = text.replace("Dünya", "Python"[::-1])
print(degistirilen) # Çıktı: Merhaba nohtyP

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.

text = "Merhaba Dünya"
cevirici = str.maketrans("aeiou", "12345")
yeni_text = text.translate(cevirici)
print(yeni_text) # Çıktı: M2rh1b1 D5ny1

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.

text = "Python"
for karakter in text:
print(karakter)
# Çıktı:
# P
# y
# t
# h
# o
# n

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.

text = "Python"
i = 0
while i < len(text):
print(text[i])
i += 1
# Çıktı:
# P
# y
# t
# h
# o
# n

3. enumerate fonksiyonunu kullanarak gezme

enumerate fonksiyonu, hem karakterin hem de indeksin gezilmesi için kullanılır.

text = "Python"
for i, karakter in enumerate(text):
print(f"İndeks {i}: {karakter}")
# Çıktı:
# İndeks 0: P
# İndeks 1: y
# İndeks 2: t
# İndeks 3: h
# İndeks 4: o
# İndeks 5: n

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.

text = "Python"
it = iter(text)
while True:
try:
karakter = next(it)
print(karakter)
except StopIteration:
break
# Çıktı:
# P
# y
# t
# h
# o
# n

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.

text = "Python"
# Her karakteri büyük harfe çevirip yazdırma
list(map(lambda x: print(x.upper()), text))
# Çıktı:
# P
# Y
# T
# H
# O
# N

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.

text = "Python"
# Her karakteri ters sırayla bir listeye koyma
ters_karakterler = [karakter for karakter in text[::-1]]
print(ters_karakterler) # Çıktı: ['n', 'o', 'h', 't', 'y', 'P']

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 Veri Yapıları - Dictionary

Python’da Dictionary(Sözlük) Veri Yapısı:

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:

  1. Dictionary’e Eleman Atama
  2. Dictionary Elemanlarını Gezme
  3. Dictionary İndeks Kullanarak Gezme
  4. Dictionary’de Bir Anahtarın Varlığını Kontrol Etme
  5. items() Fonksiyonunun Kullanımı
  6. 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.

my_dict = {"apple": 1, "banana": 2}
my_dict["apple"] = 3 # Mevcut 'apple' anahtarının değeri güncellenir
my_dict["cherry"] = 5 # Yeni bir anahtar-değer çifti eklenir
print(my_dict) # Çıktı: {'apple': 3, 'banana': 2, 'cherry': 5}

b. Eleman Silme

del anahtar kelimesi veya pop() metodu kullanılarak belirli bir anahtar silinebilir.

# 'banana' anahtarını silme
del my_dict["banana"]
print(my_dict) # Çıktı: {'apple': 3, 'cherry': 5}
# 'apple' anahtarını pop ile silme
value = my_dict.pop("apple")
print(my_dict) # Çıktı: {'cherry': 5}
print("Silinen değerin değeri:", value) # Çıktı: Silinen değerin değeri: 3

2. Dictionary Elemanlarını Gezme

Dictionary üzerinde gezinti yapmak için for döngüsü kullanılabilir.

a. Anahtarları Gezme

Anahtarları iterasyonla dolaşarak işlemler yapabilirsiniz.

my_dict = {"apple": 3, "banana": 2, "cherry": 5}
for key in my_dict:
print(key)
# Çıktı: apple, banana, cherry (her satırda bir anahtar)

b. Değerleri Gezme

values() metodu ile değerleri dolaşabilirsiniz.

for value in my_dict.values():
print(value)
# Çıktı: 3, 2, 5 (her satırda bir değer)

3. Dictionary İndeks Kullanarak Gezme

Python dictionary veri yapısında indeks kavramı doğrudan yoktur, ancak anahtar-değer çiftlerini belirli bir sıra ile dolaşabilirsiniz.

keys = list(my_dict.keys())
for i in range(len(keys)):
key = keys[i]
print(f"Index {i}: {key} -> {my_dict[key]}")
# Çıktı:
# Index 0: apple -> 3
# Index 1: banana -> 2
# Index 2: cherry -> 5

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.

my_dict = {"apple": 3, "banana": 2, "cherry": 5}
# 'banana' anahtarının varlığını kontrol etme
if "banana" in my_dict:
print("banana anahtarı sözlükte mevcut.")
else:
print("banana anahtarı sözlükte mevcut değil.")
# 'grape' anahtarının varlığını kontrol etme
if "grape" not in my_dict:
print("grape anahtarı sözlükte mevcut değil.")
# Çıktı:
# banana anahtarı sözlükte mevcut.
# grape anahtarı sözlükte mevcut değil.

5. items() Fonksiyonunun Kullanımı

items() metodu, dictionary içindeki anahtar-değer çiftlerini bir tuple olarak döner.

for key, value in my_dict.items():
print(f"{key}: {value}")
# Çıktı:
# apple: 3
# banana: 2
# cherry: 5

a. Başlangıç İndeksini Belirleyerek Gezme

Anahtar-değer çiftlerini enumerate ile birlikte kullanarak gezinebilirsiniz.

for index, (key, value) in enumerate(my_dict.items(), start=1):
print(f"Index {index}: {key} -> {value}")
# Çıktı:
# Index 1: apple -> 3
# Index 2: banana -> 2
# Index 3: cherry -> 5

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.

Python Veri Yapıları - Diziler

Python’da Dizi Veri Yapısı:

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:

  1. Diziye Eleman Atama
  2. Dizi Elemanlarını İterasyonla Gezme
  3. Dizi İndekslerini Kullanarak Gezme
  4. 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.

arr = [10, 20, 30, 40]
arr[1] = 25 # 1. indeksteki 20 değeri 25 olarak güncellenir
print(arr) # Çıktı: [10, 25, 30, 40]

b. Yeni Eleman Ekleme

Listeye eleman eklemek için append veya insert metotları kullanılabilir.

# Listeye sona eleman ekleme
arr.append(50)
print(arr) # Çıktı: [10, 25, 30, 40, 50]
# Belirli bir indekse eleman ekleme
arr.insert(2, 35)
print(arr) # Çıktı: [10, 25, 35, 30, 40, 50]

c. Eleman Silme

pop metodu ile belirli bir indeksteki eleman silinebilir veya remove metodu ile belirtilen değer listeden çıkarılabilir.

# İndekse göre eleman silme
arr.pop(2) # 2. indeksdeki 35 değeri silinir
print(arr) # Çıktı: [10, 25, 30, 40, 50]
# Değere göre eleman silme
arr.remove(40)
print(arr) # Çıktı: [10, 25, 30, 50]

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.

arr = [10, 20, 30, 40, 50]
for num in arr:
print(num)
# Çıktı: 10, 20, 30, 40, 50 (her satırda bir sayı)

b. Elemanların Toplamını Bulma

Dizi elemanlarını iterasyonla gezerken başka işlemler de yapabilirsiniz, örneğin toplamını hesaplama:

total = 0
for num in arr:
total += num
print("Toplam:", total) # Çıktı: Toplam: 150

3. Dizi İndekslerini Kullanarak Gezme

Listeyi iterasyonla gezerken indeksi kullanmanız gerekebilir. Bunu range fonksiyonuyla yapabilirsiniz.

arr = [10, 20, 30, 40, 50]
for i in range(len(arr)):
print(f"Index {i}: {arr[i]}")
# Çıktı:
# Index 0: 10
# Index 1: 20
# Index 2: 30
# Index 3: 40
# Index 4: 50

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.

arr = [10, 20, 30, 40, 50]
for index, value in enumerate(arr):
print(f"Index {index}: {value}")
# Çıktı:
# Index 0: 10
# Index 1: 20
# Index 2: 30
# Index 3: 40
# Index 4: 50

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.

for index, value in enumerate(arr, start=1):
print(f"Index {index}: {value}")
# Çıktı:
# Index 1: 10
# Index 2: 20
# Index 3: 30
# Index 4: 40
# Index 5: 50

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.

Python Yazılım Mülakatları için Neden İdealdir?

Yazılım geliştirme ve LeetCode benzeri sorular içeren algoritma mülakatlarına hazırlanmak için en uygun programlama dili genellikle Python olarak kabul edilir. Bunun birkaç sebebi var. Devam etmeden önce yazılım geliştirme mülakatları ya da competitive programlama için kullanılan en yaygın dillerin özelliklerini sıralayalım.

1 - Python:

  • Avantajları:

    • Kolay ve hızlı yazılım geliştirme: Python, basit ve okunabilir bir sözdizimine sahiptir. Algoritmalar ve veri yapıları üzerinde hızlıca odaklanmanızı sağlar.
    • Kapsamlı kütüphaneler: Python, özellikle veri yapıları ve algoritmalar için geniş kütüphanelere sahiptir (örneğin: collections, heapq gibi modüller).
    • Geniş topluluk ve kaynaklar: Python, LeetCode gibi platformlarda çok yaygın kullanılır ve diğer kullanıcıların çözümlerinden faydalanma imkanı sunar.
    • Kısa Kod: Python sözdizimi oldukça güçlü ve daha az kod satırıyla daha çok iş yapmanızı sağlayan bir programlama dilidir. Programla mülakatları zamana karşı bir yarış içerir. Bazı mülakatlarda iki adet Leetcode medium seviyesindeki soruyu 45-50 dakika gibi bir sürece çözmeniz beklenebilir. Bu noktada Python diğer programlama dillerinden öne sıyrılır. Buna ek olarak standart kütüphanesinde sağladığı temel veri yapıları (list, dictionary, graph, stack, queue, heap vb) sayesinde ilgili veri yapısını yeniden tasarlamaya gerek kalmadan hızlıca problem çözümüne geçmenize imkan sunar. Bu sebeple özellikle mülakatlar için en uygun programlama dilidir.
  • Dezavantajları:

    • Python çok kanallı programlamada (multi-threding) ve hız konusunda biraz eksik kalsa da bu durum mülakatlar için bir dezavantaj oluşturmaz. Eğer bir programlama yarışmasına katılıp en hızlı çalışan kodu yazmak gibi bir amacınız varsa bunun için C++ ve Java’ya göre bir nebze dezavantajlıdır. Ama mülakatlarda çok kısa sürede çözüm üretip bu çözümü tahtada yazmanız gerektiği durumda Python her açıdan en kullanışlı programlama dilidir.

2 - C++:

  • Avantajları:

    • Hız: Python’dan daha hızlı çalışan bir dildir. Bu yüzden büyük veri kümeleri ve zaman kısıtlamalarının önemli olduğu durumlarda C++ tercih edilebilir.
    • STL (Standart Şablon Kütüphanesi): C++’ın STL’i (Standard Template Library), özellikle veri yapıları ve algoritma fonksiyonları açısından çok güçlüdür.
    • Derinlemesine kontrol: Bellek yönetimi ve optimizasyon konusunda daha fazla kontrol sağlar. Büyük şirketlerde teknik mülakatlarda da sıkça karşılaşabilirsiniz.
  • Dezavantajları:

    • Ortaya çıkan kodun uzunluğu programlama mülakatları açısından sorun oluşturur. Unutmayın mülakatlarda zaman her şeydir.

3 - Java:

  • Avantajları:

    • Kurumsal düzeyde yaygın: Java, büyük kurumsal projelerde yaygın olarak kullanıldığından bazı firmaların mülakatlarında tercih edilebilir.
    • Veri yapıları: Java’da veri yapıları ve algoritmalar için geniş sınıf kütüphaneleri bulunur (örneğin: ArrayList, HashMap gibi).
    • Performans ve hız: Java, Python’dan daha hızlıdır ancak C++’dan biraz daha yavaştır.
  • Dezavantajları:

    • Tıpkı C++ gibi bir algoritma implement etmek Java’da yazdığımız kod, okunabilirlik olarak Python ve C++‘a göre daha iyi olsa da özellikle Python ile karşılaştığında oldukça uzundur. Ortaya çıkan kodun uzunluğu programlama mülakatlarındaki zaman kısıtı açısından sorun oluşturur.

4 - C#:

  • Avantajları: C# Avantaj ve dezavantaj olarak Java’ya benzerlik gösterir.

    • Kurumsal düzeyde yaygın: C#, büyük kurumsal projelerde yaygın olarak kullanıldığından bazı firmaların mülakatlarında tercih edilebilir.
    • Veri yapıları: C#’da veri yapıları ve algoritmalar için geniş sınıf kütüphaneleri bulunur (örneğin: ArrayList, HashMap gibi).
    • Performans ve hız: C#, Python’dan daha hızlıdır ancak genellikle C++’dan biraz daha yavaştır.
  • Dezavantajları:

    • Tıpkı C++ gibi bir algoritma implement etmek için C#‘da yazdığımız kod, okunabilirlik olarak Python ve C++‘a göre daha iyi olsa da özellikle Python ile karşılaştığında oldukça uzundur. Mülakatlarda kod yazılan sürenin kısa olması, soru üzerinde tartışmak için kalan süreyi uzatır. Bir başka deyişle ortaya çıkan kodun uzunluğu programlama mülakatlarındaki zaman kısıtı açısından sorun oluşturur.

Genel Değerlendirme:

Eğer bir algoritma yarışmasına katılıyorsanız sorunun çözümü için yazdığınız programın sistem kaynaklarını ne kadar tükettiği ve ne kadar kısa sürede çalıştığı gibi etmenler de oldukça önemlidir. Bu tarz algoritma yarışmalarında genelde C++ ve Java programlama dilleri daha çok tercih edilir. Yine algoritmanızın doğruluğu kadar yazdığınız kodun performans gerektiren Kurumsal uygulamalar geliştirmek için C++, C# ve Java dilleri Python’a göre daha avantajlıdır.

Ancak amaç yazılım mülakatlarını başarılı bir şekilde atlatmaksa, hem sağladığı kütüphanelerin genişliği açısından hem de kod yazmak için harcadığınız eforun daha az olmasi kullanımı açısından Python bunun için biçilmiş kaftandır. Kodunuzu Python’da hızlıca implement edebildiğiniz için mülakat sırasında düşünmeniz ve sizi değerlendiren eden kişiye soruyu açıklaybilmeniz için daha çok zamana sahip olursunuz. Bu da Python programlama dilini rakiplerine göre bir adım öne çıkarır.