PYTHON EĞİTİM SERİSİ · DERS 05 / 16
Bir uygulamaya adımızı yazdığımızı düşünelim.
Başına yanlışlıkla bir boşluk ekliyoruz. Başka bir alana büyük harflerle cevap veriyoruz. Uzun bir açıklama yazdığımızda ise uygulama bunun yalnızca ilk bölümünü gösteriyor.
Bize küçük ayrıntılar gibi görünen bu işlemler, programın metni nasıl işlediğiyle ilgilidir.
Bir program yalnızca sayılarla hesaplama yapmaz. Kullanıcı adları, arama kelimeleri, ürün açıklamaları, dosya adları ve ekrana yazılan mesajlar da programın günlük işinin parçasıdır.
Önceki derslerimizde değişkenlerle bilgi sakladık, operatörlerle işlem yaptık, koşullarla karar verdik ve döngülerle tekrarlanan işleri yönettik. Artık bu bilgileri metinler üzerinde kullanabiliriz.
Bu derste bir metnin uzunluğunu bulmayı, içinden belirli bölümleri almayı, gereksiz boşlukları temizlemeyi ve okunabilir mesajlar oluşturmayı öğreneceğiz. Dersin sonunda da kullanıcının yazdığı bir notu düzenli bir önizlemeye dönüştüren küçük bir program hazırlayacağız.
Örnekleri metin_islemleri.py adında bir dosyada sırayla deneyebilirsiniz. Her kod kutusu ayrı bir örnektir; Çıktı kutularını Python dosyasına eklemeyin. Bilgisayarınızda Python henüz hazır değilse Python kurulumu ve ilk program rehberimizle başlayabilirsiniz.
Python’da metin, yani str nedir?
İlk dersimizde metinleri str veri türüyle tanımıştık. Bir kelimeyi veya cümleyi tırnak içine yazdığımızda metin oluşturabiliriz:
ders = "Python"
mesaj = 'Metinlerle çalışıyorum.'
print(ders)
print(mesaj)Çıktı:
Python
Metinlerle çalışıyorum.Tek ve çift tırnak bu örneklerde aynı işi yapar. Önemli olan, metni hangi tırnakla başlattıysak uygun biçimde kapatmaktır.
Rakamların tırnak içinde bulunması da sonucu değiştirir. "2026" metindir; 2026 ise tam sayıdır. Bu ayrımı ve tür dönüşümlerini Değişkenler ve Veri Türleri dersimizde incelemiştik.
Bir telefon numarasının veya ürün kodunun rakam içermesi, onu mutlaka sayıya dönüştürmemiz gerektiği anlamına gelmez. Hangi işlemi yapacağımızı düşünmeliyiz: Matematiksel hesaplama mı yapacağız, yoksa bilgiyi olduğu gibi saklayıp gösterecek miyiz?
Metin içinde kullanılan bazı işaretler de özel davranır. Örneğin \n, ekrana yazdırılan metinde yeni satır oluşturabilir:
print("Ders: Metin İşlemleri\nDurum: Devam ediyor")Çıktı:
Ders: Metin İşlemleri
Durum: Devam ediyorBuradaki \n ifadesini ekranda iki karakter olarak görmüyoruz; alt satıra geçildiğini görüyoruz. Tırnak ve kaçış işaretlerinin ayrıntıları Python’un metin sabitleri belgesinde açıklanır.
Metnin uzunluğu nasıl bulunur?
Bir not başlığını en fazla 50 karakterle sınırlandırmak veya bir açıklamanın ne kadar uzun olduğunu göstermek isteyebiliriz.
Python’da bunun için yerleşik len() fonksiyonundan yararlanırız:
baslik = "Python dersi"
print(len(baslik))
print(len(""))Çıktı:
12
0İlk metinde aradaki boşluk da uzunluğa dahildir. İkinci örnek ise boş bir metindir; uzunluğu sıfırdır.
Python’un yerleşik fonksiyonlar belgesindeki len() açıklaması, bu fonksiyonun bir nesnedeki öğe sayısını verdiğini belirtir. Burada üzerinde çalıştığımız nesne bir metindir.
Bu bilgiyle bir koşul da yazabiliriz:
baslik = "Python dersi"
if len(baslik) <= 50:
print("Başlık uzunluğu uygun.")
else:
print("Başlığı kısaltmalısınız.")Çıktı:
Başlık uzunluğu uygun.Burada yeni bir karar yapısı öğrenmedik. Daha önce kullandığımız if koşuluna, metnin uzunluğundan elde ettiğimiz bir sayıyı verdik. Yeni bir konuyu önceki bilgilerimizle birleştirmek, programlarımızı adım adım geliştirmemizi sağlar.
Bir ayrıntıyı da aklımızda tutalım: Python metinleri Unicode temellidir. Günlük örneklerde uzunluğu karakter sayısı olarak düşünebiliriz; ancak bazı birleşik harfler ve emojiler, ekranda tek sembol gibi görünmelerine rağmen birden fazla Unicode kod noktasından oluşabilir. len() her zaman gözümüzle saydığımız sembol sayısını vermez. Python’un Unicode rehberi bu ayrımı daha ayrıntılı açıklar.
Metnin belirli bir karakterine nasıl ulaşılır?
Python’da bir metnin içindeki konumlara indeks denir. Saymaya sıfırdan başlarız.
Python kelimesinde P harfinin indeksi 0, y harfinin indeksi 1’dir. Son harf olan n ise 5 numaralı konumdadır.
kelime = "Python"
print(kelime[0])
print(kelime[1])
print(kelime[-1])Çıktı:
P
y
nKöşeli parantez içindeki sayı, hangi konumu istediğimizi belirtir. Negatif indeksler ise sondan ilerlememizi sağlar; -1, son konumdur.
Burada metnin uzunluğuyla son indeksini karıştırmamalıyız. Altı konumluk bir metinde geçerli pozitif indeksler 0’dan 5’e kadar gider.
Aşağıdaki örnek bilerek hatalıdır:
kelime = "Python"
print(kelime[6])Bu kod IndexError hatası verir. Çünkü 6 numaralı konumda bir karakter bulunmaz. Hatalı örneği diğer kodlarla birlikte çalıştırırsanız program o noktada durur; sonraki örneğe geçmeden önce bu satırı kaldırın veya yorum satırı yapın.
Özellikle kullanıcıdan gelen boş metinlerde dikkatli olmalıyız. İlk karakteri almadan önce metnin boş olup olmadığını kontrol edebiliriz:
ad = ""
if ad:
print(ad[0])
else:
print("Henüz bir ad girilmedi.")Çıktı:
Henüz bir ad girilmedi.Boş metin, bu koşulda yanlış kabul edilir. Böylece olmayan bir konuma erişmeye çalışmadan önce karar vermiş oluruz.
Dilimleme: Metnin bir bölümünü almak
Bazen tek bir harf yerine kelimenin başlangıcını, sonunu veya belirli bir bölümünü almak isteriz. Bunun için dilimleme, yani slicing kullanılır.
Temel yazım şöyledir: metin[başlangıç:bitiş].
Başlangıç konumu alınır; bitiş konumu alınmaz. Önce bir örnek görelim:
kelime = "Python"
print(kelime[0:2])
print(kelime[2:5])
print(kelime[:3])
print(kelime[-2:])Çıktı:
Py
tho
Pyt
on[0:2], 0 ve 1 numaralı konumları alır. [:3] ifadesinde başlangıcı yazmadığımız için metnin başından ilerleriz. [-2:] ise sondan ikinci konumdan başlayıp sona kadar gider.
Dilimlemeyi bir notun önizlemesini hazırlamak için kullanabiliriz:
not_metni = "Bugün Python ile metin işlemlerini öğreniyorum."
print(not_metni[:12])Çıktı:
Bugün PythonBu işlem ilk 12 konumu alır. Ancak kelimelerin nerede bittiğini anlamaya çalışmaz. Kesme noktası başka bir metinde kelimenin ortasına denk gelebilir; uygulamamızın ne göstermesini istediğine göre ayrıca karar vermemiz gerekir.
Dilimlemede bitişi metnin uzunluğundan büyük vermek, tek bir geçersiz indekse erişmekle aynı davranmaz. Örneğin "Python"[:100], mevcut metnin tamamını verir. Bu nedenle kısa önizlemeler hazırlarken metnin kısa olması tek başına hata oluşturmaz. İndeksleme ve dilimleme kuralları Python’un ifadeler belgesinde yer alır.
Metot nedir ve metinler neden yerinde değişmez?
Metin üzerinde belirli bir işlem yapan hazır araçlara ulaşmak için çoğu zaman nokta kullanırız. Örneğin mesaj.strip() yazdığımızda, mesaj metnine ait strip metodunu çağırırız.
len(mesaj) ile mesaj.strip() yazımları arasındaki farkı görüyorsunuz. İlkinde yerleşik bir fonksiyona metni veriyoruz. İkincisinde metne ait bir metodu kullanıyoruz. Metot çağrısının sonundaki parantezleri unutmamalıyız.
Bir başka temel özellik de metinlerin değiştirilemez, yani immutable olmasıdır. Bir metnin tek bir konumuna doğrudan yeni değer atayamayız.
Aşağıdaki örnek de bilerek hatalıdır:
kelime = "python"
kelime[0] = "P"Bu işlem TypeError verir. Bunun yerine istediğimiz metin değerini oluşturup değişkene yeniden atayabiliriz:
kelime = "python"
kelime = "P" + kelime[1:]
print(kelime)Çıktı:
PythonBurada dilimleme ve birleştirme kullandık. Ardından kelime ismini yeni metin değerine bağladık. İlk karakterin yerinde değiştirilmesiyle yeni metnin değişkene atanması farklı işlemlerdir. Python’un tasarım açıklamalarında metinlerin bu özelliği ele alınır.
Bu farkı öğrenmek özellikle metotları kullanırken işimize yarayacak. Bir metodun sonucunu saklamak istiyorsak, döndürdüğü değeri kullanmalıyız.
Gereksiz boşlukları temizlemek ve harfleri dönüştürmek
Kullanıcıdan aldığımız bilgileri işlerken ilk karşılaşacağımız sorunlardan biri, metnin başındaki veya sonundaki gereksiz boşluklardır.
strip(): Başlangıç ve sondaki boşluklar
ad = " Deniz Kaya "
temiz_ad = ad.strip()
print("[" + temiz_ad + "]")
print("[" + ad + "]")Çıktı:
[Deniz Kaya]
[ Deniz Kaya ]strip(), burada başlangıç ve sondaki boşlukları kaldırır. İki kelimenin arasındaki boşluk korunur. Eski ad değerinin de kendiliğinden değişmediğini görüyoruz. Sonucu aynı değişkende tutmak istersek ad = ad.strip() yazabiliriz.
lower() ve upper(): Harf dönüşümü
cevap = " EVET "
ders_kodu = "pt-05"
print(cevap.strip().lower())
print(ders_kodu.upper())Çıktı:
evet
PT-05lower() küçük, upper() büyük harfe dönüştürür. strip().lower() zincirinde önce temizlenen metin, ardından harf dönüşümünün sonucu kullanılır.
Bu yaklaşım örnekteki EVET cevabını karşılaştırmayı kolaylaştırır. Ancak harf dönüşümünü bütün dillere uygun bir ad düzeltme sistemi gibi düşünmemeliyiz. Örneğin Python’da "IŞIK".lower() sonucu işik olur; Türkçe yazımda beklenen ışık değildir. Bu nedenle kişi adlarını gelişigüzel dönüştürmek yerine girildikleri biçimi korumak daha uygun olabilir. casefold() da tek başına Türkçeye özgü harf dönüşümü çözümü sayılmamalıdır.
Metotların davranışları Python’un metin metotları belgesinde açıklanır. Temizleme ile bilginin anlamını değiştirmeyi birbirinden ayırmak, gerçek uygulamalarda önemli bir alışkanlıktır.

Metin içinde arama ve değiştirme
Bir açıklamada belirli bir kelimenin geçip geçmediğini kontrol etmek veya ayırıcı işaretini değiştirmek isteyebiliriz.
mesaj = "Python ile küçük araçlar yazıyorum."
print("Python" in mesaj)
print("python" in mesaj)
print("Java" not in mesaj)Çıktı:
True
False
Truein ile parça ararız; eşleşme harf büyüklüğüne duyarlıdır. Bu kontrolün tam kelime araması yapmadığını da unutmayalım: "py" in "python" doğrudur. İhtiyacımızın bir metin parçasını bulmak mı, yoksa bağımsız kelimeyi bulmak mı olduğunu düşünmeliyiz.
Belirli bir başlangıç veya sonu kontrol etmek için startswith() ve endswith() kullanılabilir:
dosya_adi = "ders05.py"
print(dosya_adi.startswith("ders"))
print(dosya_adi.endswith(".py"))Çıktı:
True
TrueBu örnekte dosyanın yalnızca adına baktık. Bir dosya adının .py ile bitmesi, içeriğinin doğru veya güvenli Python kodu olduğunu kanıtlamaz.
replace() ise metindeki eşleşen parçaları değiştirmemizi sağlar:
ders_kodu = "PT-05"
yeni_kod = ders_kodu.replace("-", "_")
print(yeni_kod)
print(ders_kodu)Çıktı:
PT_05
PT-05Sonucu yeni_kod değişkenine atadık. Bu küçük örnek, bir metni temizlerken özgün bilgiyi ayrıca saklayabileceğimizi de gösterir. Kullanıcıdan gelen veride her boşluğu veya işareti silmek yerine, hangi değişikliğin gerçekten gerekli olduğunu belirlemeliyiz.
f-string ile okunabilir mesajlar hazırlamak
Bir metnin içinde değişken değerlerini göstermek istediğimizde, çok sayıda parçayı + ile birleştirmek zamanla zorlaşabilir. Üstelik metinle sayıyı doğrudan + kullanarak birleştiremeyiz.
Bu durumda f-string kullanabiliriz. Metnin başına f ekler, yerleştireceğimiz değerleri süslü parantez içine yazarız:
ad = "Deniz"
tamamlanan_ders = 4
print(f"Merhaba {ad}, {tamamlanan_ders} dersi tamamladın.")Çıktı:
Merhaba Deniz, 4 dersi tamamladın.{ad} ve {tamamlanan_ders} alanları çalıştırma sırasında ilgili değerlerle doldurulur. Sayıyı önce elle metne çevirmemiz gerekmez.
Başlangıçtaki f harfini unutursak bu yerleştirme yapılmaz:
ad = "Deniz"
print("Merhaba {ad}")Çıktı:
Merhaba {ad}Bu örnek bir sözdizimi hatası vermez. Program çalışır ama beklediğimiz mesaj oluşmaz. Bu yüzden yalnızca programın hata vermemesine değil, çıktının amacımıza uygunluğuna da bakmalıyız.
Süslü parantez içinde küçük bir ifade de kullanılabilir:
tamamlanan = 4
toplam = 16
print(f"İlerleme: {tamamlanan}/{toplam}")
print(f"Kalan ders: {toplam - tamamlanan}")Çıktı:
İlerleme: 4/16
Kalan ders: 12Python’un f-string rehberi, değer ve ifadelerin metin içine yerleştirilmesini anlatır. Daha karmaşık hesaplamaları önce ayrı değişkenlerde yapmak ise kodun okunmasını kolaylaştırabilir.
Sayıları belirli biçimde göstermek
Bir oranı iki ondalık basamakla göstermek için biçim belirteci kullanabiliriz:
oran = 2 / 3 * 100
print(f"Tamamlama: %{oran:.2f}")Çıktı:
Tamamlama: %66.67Buradaki :.2f, sayıyı sabit noktalı biçimde, ondalık kısmında iki basamakla gösterir. Değişkenin içindeki sayıyı değiştirmez; ekrana hazırlanacak gösterimi belirler. Bu örnek Türkçe bölgesel sayı biçimlendirmesi uygulamaz, dolayısıyla ondalık ayırıcı olarak nokta görürüz.
Biçimlendirme seçeneklerinin tamamını ezberlememiz gerekmiyor. İhtiyaç duydukça Python’un biçimlendirme kurallarına bakabiliriz.
Önceki dersle bağlantı: Bir metinde döngü kurmak
Bir metnin konumlarını tek tek yazmamız gerekmez. Döngüler dersinde öğrendiğimiz for yapısıyla metnin üzerinden ilerleyebiliriz:
etiket = "PT05"
for karakter in etiket:
print(karakter)Çıktı:
P
T
0
5Bu örnekte karakter değişkeni her turda metnin sıradaki konumundaki değeri alır. Döngünün içine bir koşul ekleyerek yalnızca ilgilendiğimiz parçaları sayabiliriz:
metin = "Python ile metin"
bosluk_sayisi = 0
for karakter in metin:
if karakter == " ":
bosluk_sayisi += 1
print(f"Boşluk sayısı: {bosluk_sayisi}")Çıktı:
Boşluk sayısı: 2Örneğimiz normal boşluk karakterini sayar; sekme veya yeni satır gibi bütün boşluk türlerini kapsadığını varsaymamalıyız. İstediğimiz işlemi açık tanımlamak, doğru sonucu değerlendirmemizi kolaylaştırır.
Burada bir sayaç, bir döngü ve bir koşul birlikte çalıştı. Koşullu İfadeler dersimizdeki karar mantığını da kullanmış olduk. Python’un for döngüsü açıklaması, metin gibi diziler üzerinde ilerlemeyi gösterir.
Küçük uygulama: Not önizleme aracı
Şimdi öğrendiklerimizi tek programda birleştirelim.
Amacımız kullanıcıdan bir not başlığı, not metni ve etiket almak. Başlangıç ve sondaki boşlukları temizleyecek, boş başlık veya içerik geldiğinde uyarı göstereceğiz. Başlığı 50 konumla sınırlandıracak; uzun notların yalnızca ilk 80 konumunu önizlemede göstereceğiz.
Bu program notları diske kaydetmez. Şimdilik terminalde bir önizleme hazırlıyoruz; dosyaya kalıcı kayıt konusuna serinin ilerleyen derslerinde geleceğiz.
not_onizleme.py adında yeni bir dosya oluşturup aşağıdaki kodu ekleyin:
baslik = input("Not başlığı: ").strip()
icerik = input("Not metni: ").strip()
etiket = input("Etiket (örnek: python): ").strip().lower()
if not baslik or not icerik:
print("Başlık ve not metni boş bırakılamaz.")
elif len(baslik) > 50:
print("Başlık en fazla 50 karakter olmalı.")
else:
if not etiket:
etiket = "python"
onizleme = icerik[:80]
if len(icerik) > 80:
onizleme += "..."
print("\nNOT ÖNİZLEMESİ")
print(f"Başlık: {baslik}")
print(f"Etiket: #{etiket}")
print(f"Uzunluk: {len(icerik)}")
print(f"Önizleme: {onizleme}")Programı çalıştırınca başlık için Metin işlemleri, içerik için Bugün strip ve f-string öğrendim., etiket için PYTHON yazalım. Girdilerin başına veya sonuna birkaç boşluk ekleyerek temizleme adımını da deneyebiliriz.
Bu girdilerle sonuç bölümü şöyle görünür:
NOT ÖNİZLEMESİ
Başlık: Metin işlemleri
Etiket: #python
Uzunluk: 33
Önizleme: Bugün strip ve f-string öğrendim.Programı adım adım okuyalım. İlk üç satırda aldığımız bilgileri temizliyoruz. Başlık ve not içeriğinin harflerini koruyor, örnekteki etiketi küçük harfe çeviriyoruz. Etiket alanı için de kullandığımız harf dönüşümünün Türkçeye özgü kurallar uygulamadığını hatırlayalım.
Ardından eksik bilgi ve başlık uzunluğu kontrol ediliyor. Boş etiket geldiğinde varsayılan olarak python kullanılıyor. İçeriğin uzunluğu 80’i aştığında önizlemeye üç nokta ekleniyor; özgün icerik değeri ise korunuyor.
Son satırlarda f-string ile düzenli bir sonuç oluşturuyoruz. Girişlerin temizlenmesi, karar verilmesi ve sonucun gösterilmesi ayrı adımlar hâlinde okunabiliyor.
Bu yapıyı küçük değişikliklerle bir ürün açıklaması, görev notu veya ders özeti önizlemesinde de kullanabiliriz. Önce metin üzerinde hangi değişikliğe ihtiyaç duyduğumuzu belirlemek, sonra uygun aracı seçmek daha sağlıklı bir yaklaşımdır.
Şimdi sıra sizde: Üç küçük alıştırma
Örnekleri kopyalayıp çalıştırmak başlangıç için yararlıdır. Asıl öğrenme, küçük bir değişiklik istediğimizde hangi satıra dokunacağımızı düşünürken gerçekleşir.
1. Cevap kontrolü: " EVET " metnini temizleyip küçük harfe dönüştürün. Sonucu evet ile karşılaştırarak uygun bir mesaj yazdırın. Önce strip(), ardından lower() kullanmanın etkisini ayrı ayrı gözlemleyin.
2. Ders kodu: "pt-05" değerini PT_05 biçimine dönüştürün. Büyük harfe çevirme ve değiştirme işlemlerini tek zincirde yapmayı deneyin; ardından aynı işlemi iki ayrı satırda yazın. Hangisini daha kolay okuyorsunuz?
3. Uzun önizleme: Not uygulamasına 80’den uzun bir metin girin. Sonucun üç noktayla bittiğini kontrol edin. Sonra tam 80 uzunluğunda bir metin deneyin. Aynı metni hem icerik hem onizleme olarak yazdırarak özgün verinin kesilmediğini görün.
Çalışmanızda özellikle boş metni, yalnızca boşluk içeren girdiyi ve sınıra tam eşit uzunluktaki değeri deneyin. Bir programın yalnızca normal bir örnekte çalışması, bütün beklediğimiz durumları doğru ele aldığı anlamına gelmez.
Bu dersin sonunda ne öğrendik?
Metinlerle çalışırken önce hangi bilgiyi sakladığımızı ve hangi dönüşüme ihtiyaç duyduğumuzu düşünmeliyiz.
Bir metnin uzunluğunu ölçebilir, konumlarına erişebilir, belirli bir bölümünü alabilir ve metotlarla istediğimiz sonucu oluşturabiliriz. Boşluk temizleme, harf dönüşümü ve parça değiştirme işlemleri farklı ihtiyaçlara cevap verir. Sonucu değişkene atamakla özgün metni korumak arasında bilinçli seçim yapabiliriz.
f-string ise değişkenleri ve küçük ifadeleri okunabilir mesajlara dönüştürmemizi kolaylaştırır. Böylece programın içindeki bilgiyi, onu kullanacak kişinin anlayabileceği bir biçimde gösterebiliriz.
Bu derste tek bir metin üzerinde çalıştık. Bir sonraki dersimizde aynı programda birden fazla notu, ürünü veya sayıyı nasıl düzenleyebileceğimize bakacağız: Ders 06 — Listeler ve Demetler.
PYTHON EĞİTİM SERİSİ · DERS 05 / 16
Yeni rehberleri kaçırmayın
Yeni teknoloji rehberleri ve pratik çözümler e-postanıza gelsin.




