String İşlemleri

Metni parçalara ayırmak ve biçimli yazdırmak

Bölüm 3

NotBu bölümde
  • Bir string’in karakterlerine indeksle, parçalarına dilimleyerek erişmek
  • String’in değiştirilemez (immutable) olması: metotlar yeni string döndürür
  • strip(), split(), join(), replace(), upper()/lower(), startswith(), in
  • f-string ile değerleri metne yerleştirmek; :.2f, hizalama, :, ve :.1% biçim belirteçleri
  • Türkçe I/ı, İ/i dönüşümlerinde Python’ın beklenmedik davranışı

String Bir Karakter Dizisidir

Bilgisayarda metinler string (str) türüyle temsil edilir. Bir string, karakterlerden oluşan sıralı bir dizidir; bu yüzden listelerde göreceğimiz indeksleme ve dilimleme kuralları string’lerde de aynen geçerlidir.

İndeksleme ve Dilimleme

Tek tek karakterlere indeksle, bir bölümüne ise dilimleyerek (slicing) erişilir. İndeks 0’dan başlar; negatif indeks sondan sayar. Dilimde başlangıç dâhil, bitiş hariçtir — tıpkı range() gibi.

String Değiştirilemez (Immutable)

Bir string oluşturulduktan sonra içindeki karakterler değişmez. .upper() ve .replace() gibi metotlar var olan metni değiştirmez; yeni bir string döndürür. Sonucu yeniden atamazsak metin değişkeni eski değerini korur.

Bu davranış ileride listelerle karşılaştırıldığında önem kazanacak: listeler yerinde değişir, string’ler değişmez.

String Metotları

String’lerin bir dizi hazır metodu vardır: değerin arkasına nokta koyup çağırdığımız fonksiyonlar. Aşağıdakiler günlük işlerin çoğunu karşılar.

Sık Kullanılan Metotlar

Metot Ne işe yarar Örnek
strip() baştaki/sondaki boşlukları siler " ali ".strip() → "ali"
split(ayrac) metni parçalara ayırıp liste döndürür "ali,80".split(",") → ["ali", "80"]
ayrac.join(liste) listeyi tek stringe birleştirir ", ".join(["a","b"]) → "a, b"
replace(a, b) geçen her a’yı b ile değiştirir "a-b".replace("-", " ") → "a b"
upper() / lower() büyük / küçük harfe çevirir "Ali".upper() → "ALI"
startswith(on_ek) metin verilen önekle mi başlıyor "Ankara".startswith("An") → True
in bir parça metinde geçiyor mu "py" in "python" → True

strip() + split() Örneği

Bir kayıt satırını alanlara ayırmanın standart yolu bu ikilidir. Önce satırın başındaki ve sonundaki boşluklar temizlenir; ardından metin virgüllerden bölünür.

Sayı gibi görünen "85" ve "92" de metindir; hesaplamadan önce int() ile dönüştürülmeleri gerekir. Dosya işlemlerinde okuduğumuz satırları ayrıştırırken bu ikiliyi sıkça kullanacağız.

f-string ile Biçimli Çıktı

Programların çoğu sonunda ekrana bir şey yazar; yazdığımız metnin içine değişkenlerin değerlerini yerleştirmemiz gerekir. Python’da bunun en okunur yolu f-string’dir.

Değerleri Metne Yerleştirme

Bir değişkenin değerini metnin içinde yazdırmanın üç yolu var. İlk ikisi çalışır ama okunması zordur:

  • Tırnağın önündeki f harfi metni bir f-string yapar.
  • {...} içindeki ifade hesaplanır ve sonucu metnin o noktasına yerleştirilir; str() dönüşümü kendiliğinden olur.

Süslü Parantez İçinde İfade

{} içine yalnızca değişken adı değil, herhangi bir ifade yazılabilir: aritmetik, karşılaştırma, metot çağrısı.

Uzun ifadeleri önce bir değişkene atamak okunabilirliği artırır; {} içi kısa kalsın.

Biçim Belirteçleri: Ondalık Basamak

Değişkenden sonra : ile bir biçim belirteci (format specifier) yazılabilir. .2f → sabit noktalı (f), 2 ondalık basamak.

:.2f mi, round() mu?

İkisi de “iki basamak” gösterir ama farklı şeyler yapar. :.2f yalnızca yazımı biçimlendirir, değer değişmez. round() ise yeni bir sayı döndürür.

Ekrana yazdırırken :.2f, değerle hesaplamaya devam edecekseniz round() kullanın.

Biçim Belirteçleri: Genişlik ve Hizalama

Tablo gibi hizalı çıktı için genişlik ve hizalama belirteçleri kullanılır. :<10 sola, :>10 sağa, :^10 ortaya hizalar; sayı toplam genişliktir. Belirteçler birleştirilebilir: :>8.2f.

Döngü + f-string ikilisi hizalı çıktı için yeterlidir; ek kütüphane gerekmez.

Diğer Yararlı Belirteçler

Sık karşılaşacağınız birkaç belirteç daha:

Binlik ayracı İngilizce kurala göre virgüldür; Türkçe yazım isteniyorsa sonucu .replace(",", ".") ile dönüştürebilirsiniz.

f-string’de Sık Hatalar

En sinsi hata, f önekini unutmaktır: Python hata vermez, metni olduğu gibi yazar.

  • Çıktıda { görüyorsanız önce f önekine bakın.
  • Biçim belirteci türle uyumlu olmalı: f"{ad:.2f}" bir ValueError verir, çünkü ad bir metindir.

Türkçe Karakterlerde Dikkat

upper() ve lower() Türkçe Bilmez

Python’ın upper()/lower() metotları Unicode kurallarına göre çalışır; Türkçeye özgü yerel ayar (locale) kurallarını uygulamaz. Özellikle I/ı ve İ/i çiftlerinde beklemediğiniz sonuçlar alabilirsiniz.

Bu tür karşılaştırmalarda .lower()’ın her durumda “doğru” sonucu vereceğini varsaymayın; bu sorun ileride tekrar karşımıza çıkacak.

Alıştırmalar

Tahmin Et, Sonra Çalıştır

Her hücre için önce çıktıyı tahmin edin, sonra çalıştırıp tahmininizi kontrol edin.




Fiş Satırı

Bir ürünün KDV dâhil tutarını iki ondalık basamakla, Toplam: etiketiyle yazdırın. Sonra fiyatı 399.9, KDV’yi 0.10 yapıp yeniden çalıştırın.

Ek: :.2f’yi silip çalıştırın; farkı açıklayın.


  • Toplam: {toplam:.2f} TL — :.2f sayıyı iki ondalık basamakla yazar: 250 TL ve %20 için 300.00, 399.9 TL ve %10 için 439.89.
  • Belirteci kaldırırsanız 300.0 ve 439.89000000000004 gibi değerler görürsünüz. Ondalıklı sayılar bellekte tam olarak tutulamadığı için kuyruktaki o küçük sapma zaten oradadır; :.2f yalnızca yazımı düzenleyip onu gizler, sayının kendisine dokunmaz. Sayıyı gerçekten yuvarlamak isterseniz round() kullanılır.

Kendini Sına

Her soruda önce kendi cevabınızı seçin, sonra cevap anahtarındaki gerekçeleri okuyun; yanlış şıklar bu konuda gerçekten yapılan hatalardan seçildi.

Soru 1

metin = "python"
metin.upper()
print(metin)
  • A. PYTHON
  • B. Python
  • C. python
  • D. Hata verir
  • E. None

Doğru: C. upper() yeni bir string döndürür, metin’i değiştirmez; sonuç atanmadığı için kaybolur. A sonucun atandığını varsayar. B capitalize() ile karıştırır. D yanlış: metodu çağırıp sonucu kullanmamak hata değildir. E print(metin.upper()) değil print(metin) yazıldığını gözden kaçırır.

Soru 2

satir = " Ada Yılmaz,80,90 \n"
print(satir.strip().split(","))
  • A. ['Ada', 'Yılmaz', '80', '90']
  • B. ['Ada Yılmaz', 80, 90]
  • C. Ada Yılmaz 80 90
  • D. ['Ada Yılmaz', '80', '90']
  • E. [' Ada Yılmaz', '80', '90 \n']

Doğru: D. strip() baştaki/sondaki boşluk ve \n’i siler, split(",") virgülden böler; parçalar string kalır. A boşluktan da böldüğünü sanır. B sayıların kendiliğinden int olduğunu varsayar. C liste değil düz metin yazar. E strip() yapılmadığını varsayar.

Soru 3

puan = 87.456
print(f"Not: {puan:.1f}")
  • A. Not: {puan:.1f}
  • B. Not: 87
  • C. Not: 87.4
  • D. Not: 87.5
  • E. Not: 87.456

Doğru: D. .1f bir ondalığa yuvarlar: 87.456 → 87.5. A f önekinin unutulduğu durumun çıktısıdır. B int() ya da :.0f olsaydı doğruydu. C yuvarlamak yerine kesildiğini varsayar. E belirtecin yok sayıldığını varsayar.

Soru 4

ad = "Ali"
print("Merhaba {ad}!")
  • A. Merhaba Ali!
  • B. Merhaba {ad}!
  • C. NameError
  • D. Merhaba ad!
  • E. SyntaxError

Doğru: B. f öneki yok; {ad} sıradan metindir ve olduğu gibi yazılır. A f-string sanır. C/E hata beklenir ama Python burada hata vermez — bu yüzden sinsi bir hatadır. D süslü parantezlerin atılıp adın kaldığını varsayar.

Soru 5

tutar = 2 / 3
a = f"{tutar:.2f}"
b = round(tutar, 2)
print(type(a).__name__, type(b).__name__)
  • A. float float
  • B. str str
  • C. str float
  • D. float str
  • E. int float

Doğru: C. f-string her zaman str üretir; round() sayı döndürür. A :.2f’nin sayıyı yuvarladığını sanır. B round()’un metin döndürdüğünü sanır. D ikisini ters çevirir. E round(x, 2)’nin tamsayı verdiğini sanır (yalnızca round(x) int verir).

Kod Yazma

" Deniz Kaya , 19 , Samsun " biçimindeki bir kayıt satırını alıp Deniz Kaya (19) - Samsun biçiminde yazdıran kodu yazın. Parçalardaki fazla boşlukları temizleyin.

kayit = "  Deniz Kaya , 19 , Samsun  "
ad, yas, sehir = kayit.strip().split(",")
print(f"{ad.strip()} ({yas.strip()}) - {sehir.strip()}")

split(",") virgülden böler ama parçaların kenarındaki boşlukları bırakır; her parçaya ayrıca strip() gerekir.

Özet ve Kazanımlar

Tek Sayfa Özet

  • String karakter dizisidir: s[i] indeks, s[a:b] dilim.
  • String değiştirilemez; upper() gibi metotlar yeni string döndürür, sonucu atayın.
  • strip() kenar boşluklarını siler, split() parçalara ayırır, join() birleştirir.
  • f-string: f"...{ifade}..."; {x:.2f} iki ondalık, {x:>8} sağa hizalı 8 genişlik, {x:,} binlik, {x:.1%} yüzde.
  • :.2f yazımı biçimlendirir, round() yeni sayı döndürür.
  • f unutulursa hata çıkmaz, {ad} olduğu gibi yazılır.
  • lower()/upper() Türkçe I/ı, İ/i kuralını bilmez.

Bu Bölümü Bitiren Öğrenci

  • Bir string’in istenen karakterine ve parçasına indeks/dilim ile erişir.
  • Metot çağrısının string’i değiştirmediğini açıklar ve sonucu doğru biçimde atar.
  • Bir kayıt satırını strip() + split() ile alanlara ayırır.
  • f-string ile değerleri ve ifadeleri metne yerleştirir; ondalık, hizalama ve binlik belirteçlerini kullanır.
  • :.2f ile round() arasındaki farkı örnekle gösterir.
  • Türkçe büyük/küçük harf dönüşümünde lower()’a güvenilemeyecek durumu tanır.
Başa dön