
BÖLÜM 7 — Metnin Derinliği: Bir String Aslında Nedir?
Bu bölümün temel sorusu
Birinci derste string'i "tırnak içindeki yazı" olarak tanımladık ve geçtik. Ama bir string, aslında bir liste gibi davranabiliyorsa (indekslenebiliyorsa) ne demek bu? Metin, Python için tam olarak nedir?
🎯 Bölümün Öğrenme Hedefleri
Bu bölümün sonunda öğrenci;
- bir string'in aslında karakterlerden oluşan sıralı bir dizi olduğunu ve bunun listeyle neden bu kadar benzer davrandığını,
- dilimlemenin (slicing) hangi problemi çözdüğünü,
- yaygın string metotlarının (".split()", ".join()", ".replace()", ".strip()") hangi ihtiyaçtan doğduğunu,
- string'lerin neden değiştirilemez (immutable) olduğunu ve bunun demetlerle olan bağlantısını,
- f-string'in eski biçimlendirme yöntemlerine göre hangi sorunu çözdüğünü
📌 Geçen Bölümde Neler Öğrendik?
6.derste demet, sözlük ve kümelerle listenin yetersiz kaldığı durumları çözmeyi öğrendik. Bu bölümde ilginç bir bağlantı kuracağız: string'ler, aslında Bölüm 5-6'da öğrendiğimiz "sıralı, indekslenebilir ama değiştirilemez" bir veri yapısına çok benziyor — tıpkı bir demet gibi.
7.1. Her Şey Bir Sorunla Başladı
Birinci derste 'print("Merhaba")' yazdığımızda, "Merhaba" ifadesini tek bir bütün gibi düşündük. Ama gerçek hayatta metinle çalışırken ihtiyaçlarımız çok daha karmaşıktır:- Bir kullanıcı adının sadece ilk 3 harfini almak istersen?
- Bir cümleyi kelimelere ayırıp tek tek işlemek istersen?
- Bir metindeki fazladan boşlukları temizlemek istersen?
- Birden fazla değişkeni tek bir cümle içine güzelce yerleştirmek istersen?
7.2. Büyük Fikir: Bir String Aslında Bir Karakter Dizisidir
kelime = "Python"print(kelime[0]) # P
print(kelime[1]) # y
print(kelime[5]) # n[/code]
Bu, beşinci dersteki liste indekslemesine çok tanıdık geliyor değil mi? Bu tesadüf değil Python'da bir string, aslında karakterlerden oluşan sıralı bir dizidir . "Python" kelimesi, Python'un gözünde şuna benzer:
Kod:
Index: 0 1 2 3 4 5
Karakter: P y t h o nBİLGİ
💡 Büyük Fikir: Beşinci derste öğrendiğimiz index mantığı (0'dan başlama, negatif index ile sondan sayma) string'ler için de birebir geçerlidir:
Kod:
print(kelime[-1]) # n (son karakter)
print(len(kelime)) # 6 (6 karakter)7.3. Dilimleme (Slicing): Bir Parçayı Almak
Peki tek bir karakter değil de bir aralık almak istersek?Kod:
kelime = "Python"
print(kelime[0:3]) # Pyt
print(kelime[2:5]) # tho
print(kelime[:4]) # Pyth -- başlangıç belirtilmezse baştan başlar
print(kelime[3:]) # hon -- bitiş belirtilmezse sona kadar giderDERSTE
🤔 Neden "kelime[0:3]" "Pyt" Veriyor, "Pyth" Değil?
Bunu dördüncü dersteki "range()" mantığıyla birleştirelim, hatırlarsanız "range(1, 6)" de 6'yı hariç tutuyordu. Dilimleme de aynı kurala uyar: başlangıç dahil, bitiş hariç. "kelime[0:3]" demek "0. index'ten başla, 3. index'e gelmeden dur" demektir yani 0, 1, 2. index'leri alır (P, y, t).
Bu tutarlılık tesadüf değil, Python'da "range()", liste dilimleme ve string dilimleme aynı "başlangıç dahil, bitiş hariç" kuralını paylaşır. Bir yerde öğrendiğinde, her yerde işine yarar.
Adım (step) ile dilimleme:
"[::-1]" özellikle çok kullanılan bir kalıptır, adımı -1 yaparak baştan sona değil, sondan başa gitmesini sağlar, bu da string'i tersine çevirir.
Bunu dördüncü dersteki "range()" mantığıyla birleştirelim, hatırlarsanız "range(1, 6)" de 6'yı hariç tutuyordu. Dilimleme de aynı kurala uyar: başlangıç dahil, bitiş hariç. "kelime[0:3]" demek "0. index'ten başla, 3. index'e gelmeden dur" demektir yani 0, 1, 2. index'leri alır (P, y, t).
Bu tutarlılık tesadüf değil, Python'da "range()", liste dilimleme ve string dilimleme aynı "başlangıç dahil, bitiş hariç" kuralını paylaşır. Bir yerde öğrendiğinde, her yerde işine yarar.
Adım (step) ile dilimleme:
Kod:
print(kelime[::2]) # Pto -- ikişer ikişer atla
print(kelime[::-1]) # nohtyP -- string'i ters çevirir!7.4. String'ler Neden Değiştirilemez (Immutable)?
Kod:
kelime = "Python"
kelime[0] = "J" # HATA! 'str' object does not support item assignmentDERSTE
🤔 Peki Bir String'i Nasıl "Değiştiririz"?
Aslında değiştirmeyiz yeni bir string oluştururuz :
Aslında değiştirmeyiz yeni bir string oluştururuz :
PHP Kod:
kelime = "Python"
yeni_kelime = "J" + kelime[1:]
print(yeni_kelime) # Jython
7.5. String Metotları: Yaygın İhtiyaçlara Hazır Çözümler
".upper()" ".lower()" büyük/küçük harfe çevirme:PHP Kod:
isim = "ahmet"
print(isim.upper()) # AHMET
print(isim.lower()) # ahmet (zaten küçüktü)
.strip() baştaki ve sondaki boşlukları temizleme:
PHP Kod:
girdi = " Ahmet "
print(girdi.strip()) # "Ahmet" (baş ve son boşluklar gitti)
.replace() bir parçayı başka bir şeyle değiştirme:
PHP Kod:
cumle = "Python zor bir dildir"
yeni_cumle = cumle.replace("zor", "kolay")
print(yeni_cumle) # Python kolay bir dildir
.split() bir string'i parçalayıp liste yapma:
PHP Kod:
cumle = "elma armut muz"
kelimeler = cumle.split()
print(kelimeler) # ['elma', 'armut', 'muz']
Virgülle ayrılmış bir metni de parçalayabilirsin:
PHP Kod:
veri = "Ahmet,25,İstanbul"
parcalar = veri.split(",")
print(parcalar) # ['Ahmet', '25', 'İstanbul'][php]
[kirmizi].join()[/kirmizi] — [kirmizi].split()[/kirmizi]'in tersi, bir listeyi tek bir string'de birleştirme:
[php]kelimeler = ["Python", "öğreniyorum"]
cumle = " ".join(kelimeler)
print(cumle) # Python öğreniyorum[php]
[bilgicik][b]🤔 [kirmizi].join()[/kirmizi]'i Neden [kirmizi]" "[/kirmizi] Üzerinden Çağırıyoruz, [kirmizi]kelimeler[/kirmizi] Üzerinden Değil?[/b]
Bu, yeni başlayanların garipsediği bir sözdizimidir. Mantığı şöyle: [kirmizi].join()[/kirmizi], listedeki elemanları [kirmizi]hangi karakterle[/kirmizi] birleştireceğini bilmek zorunda, bu yüzden metot, [kirmizi]"birleştirici"[/kirmizi] olan string'e [kirmizi](" ")[/kirmizi] ait, birleştirilecek listeye değil. [kirmizi]" ".join(kelimeler)[/kirmizi] cümlesini [sari]"boşluk karakteriyle, şu listeyi birleştir"[/sari] diye okuyabilirsiniz.[/sari][/bilgicik]
[baslik]7.6. f-string: Metin İçine Değer Yerleştirmenin Modern Yolu[/baslik]
Birinci derste f-string'e kısaca değinmiştik, şimdi neden var olduğunu tam anlayalım.
[php]isim = "Ahmet"
yas = 25[php]
İkinci derste öğrendiğimiz gibi, string ile sayıyı [sari]+[/sari] ile birleştiremiyoruz bunun için tip dönüşümü gerekiyordu:
[php]print("Adım " + isim + ", yaşım " + str(yas))
Bu çalışır ama okunması zor ve yazması yorucudur ayrıca her değişken için + ve str() eklemen gerekir. f-string bu sorunu çözer:
PHP Kod:
print(f"Adım {isim}, yaşım {yas}")
# Çıktı: Adım Ahmet, yaşım 25
BİLGİ
🤔 Neden f Harfi?
f, format 'ın kısaltmasıdır Python'a "bu string'i biçimlendireceğim, içindeki süslü parantezlere dikkat et" demenin yoludur. f-string olmadan Python, {isim} ifadesini olduğu gibi (düz metin olarak) yazdırırdı.
f, format 'ın kısaltmasıdır Python'a "bu string'i biçimlendireceğim, içindeki süslü parantezlere dikkat et" demenin yoludur. f-string olmadan Python, {isim} ifadesini olduğu gibi (düz metin olarak) yazdırırdı.
7.7. Hepsini Birleştirelim ve Küçük Bir Örnek
PHP Kod:
girdi = " Ahmet,25,İstanbul "
temiz_girdi = girdi.strip() # baş/son boşlukları temizle
parcalar = temiz_girdi.split(",") # virgülden parçala
isim = parcalar[0]
yas = int(parcalar[1]) # Bölüm 2'deki tip dönüşümü
sehir = parcalar[2]
print(f"{isim}, {yas} yaşında ve {sehir}'de yaşıyor.")
# Çıktı: Ahmet, 25 yaşında ve İstanbul'de yaşıyor.
Bu küçük örnekte, ham (ve biraz "kirli") bir metin girdisini alıp, temizleyip, parçalayıp, anlamlı parçalara ayırıp, sonunda okunabilir bir cümleye dönüştürdük. Bu, gerçek dünyadaki veri işlemenin neredeyse tamamının özünü oluşturur.
⚠️ Kavram Yanılgıları
❌ Yanlış düşünce: " 'kelime[0] = 'J' yazarak bir string'in ilk harfini değiştirebilirim, tıpkı listede olduğu gibi."✅ Daha doğru düşünce: String'ler değiştirilemezdir (immutable) bir önceki dersteki demetler gibi. Bir string'i "değiştirmek" istediğinde aslında yeni bir string oluşturursun.
❌ Yanlış düşünce: " 'kelime[0:3]' ifadesi 0, 1, 2, 3. index'leri (4 karakter) verir."
✅ Daha doğru düşünce: Dilimleme başlangıç dahil, bitiş hariç çalışır. 'kelime[0:3]' sadece 0, 1, 2. index'leri (3 karakter) verir. Bu, 'range()' ile aynı kuralı paylaşır.
❌ Yanlış düşünce: " '.split()' ve '.join()' birbirinden bağımsız, ilgisiz iki fonksiyondur."
✅ Daha doğru düşünce: Birbirinin tam tersidir '.split()' bir string'i parçalayıp liste yapar, '.join()' bir listeyi birleştirip string yapar. Bu ikisini bir çift olarak düşünmek hatırlamayı kolaylaştırır.
👨🏫 Öğretmen Notu
String'ler anlatılırken en büyük fırsat, bunu tamamen izole bir konu gibi değil, daha önce öğrenilen liste ve demet bilgisiyle bağlantılı olarak sunmaktır. Önerilen sıra:- String'in aslında bir karakter dizisi olduğu, beşinci dersteki liste indekslemesiyle birebir karşılaştırılarak gösterilir.
- Dilimleme, dördüncü dersteki "range()" mantığıyla ("başlangıç dahil, bitiş hariç") açıkça ilişkilendirilir, bu tekrar, kuralın tesadüfi değil tutarlı bir tasarım olduğunu gösterir.
- String'in neden değiştirilemez olduğu, altıncı dersteki demet mantığıyla bağlanır.
- String metotları, her biri için "bu hangi gerçek sorunu çözüyor" sorusuyla (kullanıcı girdisi temizleme, veri parçalama) somutlaştırılır.
- f-string, ikinci dersteki tip uyumsuzluğu sorununa ('+' ile string/sayı birleştirememe) doğrudan bir çözüm olarak sunulur.
✍️ Uygulama Soruları ve Cevapları
Soru 1: "Merhaba Dünya" string'inin son 5 karakterini dilimleme kullanarak al.PHP Kod:
metin = "Merhaba Dünya"
print(metin[-5:])
# Çıktı: Dünya
Soru 2: Bir kullanıcı adının başındaki/sonundaki boşlukları temizleyip, tamamını küçük harfe çeviren kodu yaz.
PHP Kod:
kullanici_adi = " Ahmet123 "
temiz = kullanici_adi.strip().lower()
print(temiz)
# Çıktı: ahmet123
Soru 3: "kedi,köpek,kuş" string'ini virgülden parçalayıp bir listeye çevir.
PHP Kod:
hayvanlar = "kedi,köpek,kuş"
liste = hayvanlar.split(",")
print(liste)
# Çıktı: ['kedi', 'köpek', 'kuş']
Soru 4: Aşağıdaki kod neden hata verir?
PHP Kod:
kelime = "Merhaba"
kelime[0] = "M"[php]
[kirmizi]Cevap:[/kirmizi] String'ler değiştirilemezdir (immutable). Var olan bir string'in belirli bir index'ine yeni bir karakter atanamaz; bunun yerine yeni bir string oluşturulması gerekir.
[yesil]Soru 5:[/yesil] [mavi]isim = "Zeynep"[/mavi] ve [mavi]puan = 92[/mavi] değişkenlerini kullanarak f-string ile "Zeynep 92 puan aldı" cümlesini oluştur.
[php]isim = "Zeynep"
puan = 92
print(f"{isim} {puan} puan aldı")
# Çıktı: Zeynep 92 puan aldı
📌 Şu Ana Kadar Neler Öğrendik?
- Bir string'in aslında karakterlerden oluşan sıralı bir dizi olduğu ve listeyle aynı index mantığını paylaştığı
- Dilimlemenin ("[başlangıç:bitiş]") başlangıç dahil, bitiş hariç çalıştığı "range()" ile aynı kural
- String'lerin neden değiştirilemez olduğu ve string metotlarının aslında hep yeni bir string döndürdüğü
- ".upper()", ".lower()", ".strip()", ".replace()" metotlarının hangi gerçek sorunları çözdüğü
- ".split()" ile ham metni listeye, ".join()" ile listeyi tekrar metne çevirebildiğimiz
- f-string'in, ikinci dersteki string/sayı birleştirme sorununu nasıl daha okunabilir çözdüğü
📌 Bu Derste Çıkarılacak En Önemli Sonuç
String bir formülle başlamadı, İlk derste "tırnak içindeki yazı" olarak tanıdığımız bu veri tipi, aslında 5-6.derste öğrendiğimiz liste ve demet mantığının bir karışımıdır: listeler gibi indekslenebilir ve dilimlenebilir, demetler gibi değiştirilemez. Python'da yeni bir konu genelde tamamen yeni bir kural getirmez daha önce öğrendiğin kuralları yeni bir bağlamda tekrar kullanır. Bu yüzden önceki bölümleri iyi anlamak, sonraki bölümleri çok daha kolay hâle getirir.📝 Bölümün Kısa Özeti
String'ler, karakterlerden oluşan sıralı ve değiştirilemez (immutable) veri dizileridir, bu yüzden hem liste gibi indekslenebilir/dilimlenebilir hem de demet gibi değiştirilemezler. Dilimleme ("[a:b]") başlangıç dahil, bitiş hariç çalışır. String metotları (".upper()", ".strip()", ".replace()", ".split()", ".join()") orijinal string'i değiştirmez, her zaman yeni bir string ya da liste döndürür. f-string ('f"{degisken}"'), değişkenleri metin içine okunabilir ve otomatik tip dönüşümlü bir şekilde yerleştirmenin modern yoludur.
Bir String Aslında Nedir? (Python 7.Ders)
