← Kursa Dön
📄 Text · 18 min

String İşlemleri

String'ler (karakter dizileri) programlamanın belki de en çok kullanılan veri tipidir. Kullanıcı adları, mesajlar, dosya yolları, HTML içerikleri, log kayıtları — hepsi string. Python'un string işleme yetenekleri son derece güçlü ve kullanımı keyifli. Bu derste string'lerin A'dan Z'ye her yönünü öğreneceksin.


String Oluşturma

Python'da string oluşturmanın birden fazla yolu var ve her birinin kendine göre bir kullanım alanı var.

Tek Tırnak ve Çift Tırnak

# Tek tırnak
isim = 'Ali'

# Çift tırnak
soyisim = "Veli"

# İkisi arasında fark yok — hangisini istersen onu kullan
print(type(isim))      # <class 'str'>
print(type(soyisim))   # <class 'str'>
print(isim == 'Ali')   # True

Peki neden iki seçenek var? Çünkü string'in içinde tırnak kullanman gerekebilir:

# String içinde tek tırnak varsa, çift tırnak kullan
mesaj = "Python'da string'ler çok güçlü"

# String içinde çift tırnak varsa, tek tırnak kullan
html = '<div class="container">İçerik</div>'

# Veya kaçış karakteri kullan
mesaj2 = 'Python\'da string\'ler çok güçlü'
html2 = "<div class=\"container\">İçerik</div>"

Üçlü Tırnak (Triple Quotes)

Çok satırlı string'ler için üçlü tırnak kullanılır. Docstring'ler (belgeleme) için de standart yöntem budur.

# Çok satırlı string
siir = """Bir varmış bir yokmuş,
Evvel zaman içinde,
Kalbur saman içinde,
Python öğrenirmiş."""

print(siir)

# Tek tırnaklı üçlü tırnak da olur
baska_metin = '''Bu da
çok satırlı
bir string.'''

# Docstring olarak
def selamla(isim):
    """
    Verilen isimle selamlama mesajı oluşturur.
    
    Args:
        isim: Selamlanacak kişinin adı
    
    Returns:
        Selamlama string'i
    """
    return f"Merhaba, {isim}!"

Boş String

bos = ""
bos2 = ''
bos3 = str()

print(len(bos))     # 0
print(bool(bos))    # False — boş string falsy'dir
print(bos == bos2)  # True

String Immutable'dır

Python'da string'ler immutable (değiştirilemez) nesnelerdir. Bir string oluşturduktan sonra onu doğrudan değiştiremezsin.

Bir kütüphane kitabı gibi düşün. Kitaptaki bir kelimeyi silgiyle silip yenisini yazamazsın. Ama kitabı fotokopi çekip, fotokopide değişiklik yapabilirsin. Python string'leri de böyle — orijinali değiştirmek yerine, değişikliklerle yeni bir string oluşturursun.

mesaj = "Merhaba"

# ❌ Bu hata verir
# mesaj[0] = "m"  # TypeError: 'str' does not support item assignment

# ✅ Yeni bir string oluştur
mesaj = "merhaba"  # Yeni nesne, eski nesne çöpe gider

# ✅ String metodları da yeni string döner
buyuk = mesaj.upper()
print(mesaj)  # merhaba — orijinal değişmedi
print(buyuk)  # MERHABA — yeni string
# id() ile kanıtla
mesaj = "hello"
print(id(mesaj))  # 140234567890

mesaj = mesaj + " world"
print(id(mesaj))  # 140234567999 — farklı id, farklı nesne!

Bu immutability (değiştirilemezlik) bir dezavantaj gibi görünebilir ama aslında avantajları var:

  • Thread-safe: Birden fazla iş parçacığı aynı string'i güvenle paylaşabilir.

  • Hashable: String'ler dictionary key'i veya set elemanı olarak kullanılabilir.

  • Optimizasyon: Python aynı string'i birden fazla yerde kullanabilir (string interning).


İndeksleme ve Dilimleme

String'ler, karakter dizileridir. Her karaktere bir indeks (sıra numarası) ile erişebilirsin.

İndeksleme

metin = "Python"
#        P  y  t  h  o  n
#        0  1  2  3  4  5    (pozitif indeks)
#       -6 -5 -4 -3 -2 -1   (negatif indeks)

print(metin[0])    # P — ilk karakter
print(metin[1])    # y
print(metin[5])    # n — son karakter
print(metin[-1])   # n — sondan birinci
print(metin[-2])   # o — sondan ikinci
print(metin[-6])   # P — sondan altıncı = ilk karakter

Negatif indeksler sondan saymaya başlar. -1 her zaman son karakter. Bu, özellikle string'in uzunluğunu bilmeden son karakterlere erişmek istediğinde çok kullanışlı.

# Sınır dışı erişim hata verir
# print(metin[10])  # IndexError: string index out of range

# Uzunluğu kontrol et
print(len(metin))  # 6

Dilimleme (Slicing)

Dilimleme, string'in bir bölümünü almak için kullanılır. Söz dizimi: string[başlangıç:bitiş:adım]

metin = "Python Programlama"

# Temel dilimleme [başlangıç:bitiş]
# başlangıç dahil, bitiş hariç!
print(metin[0:6])     # Python
print(metin[7:18])    # Programlama
print(metin[7:])      # Programlama (sonuna kadar)
print(metin[:6])      # Python (baştan)

# Negatif indekslerle
print(metin[-11:])    # Programlama
print(metin[:-12])    # Python

# Adım (step) ile
print(metin[::2])     # Pto rgalm (her ikinci karakter)
print(metin[::3])     # Ph ral

# String'i ters çevir
print(metin[::-1])    # amalmargorP nohtyP

💡 İpucu: Dilimleme asla IndexError vermez. Sınır dışına çıksan bile Python sessizce uygun sonucu döner. "abc"[0:100]"abc", "abc"[10:20]"". Bu, indekslemeden farklıdır — tek karakter erişiminde sınır dışı hata verir.

# Dilimleme güvenlidir
metin = "kısa"
print(metin[0:100])   # kısa — hata yok
print(metin[100:200]) # "" — boş string, hata yok

# Ama indeksleme değil
# print(metin[100])   # IndexError!

Dilimleme Pratikleri

url = "https://www.example.com/sayfa"

# Protokolü al
protokol = url[:5]
print(protokol)  # https

# Domain'i al
domain_baslangic = url.index("www")
domain_bitis = url.index(".com") + 4
domain = url[domain_baslangic:domain_bitis]
print(domain)  # www.example.com

# Son n karakteri al
dosya = "rapor_2024.pdf"
uzanti = dosya[-4:]
print(uzanti)  # .pdf

# İlk ve son karakteri at
metin = "[önemli mesaj]"
temiz = metin[1:-1]
print(temiz)  # önemli mesaj

String Metodları

Python string'leri 40'tan fazla yerleşik metoda sahip. En çok kullanılanları görelim.

Büyük/Küçük Harf Metodları

metin = "merhaba DÜNYA"

print(metin.upper())       # MERHABA DÜNYA
print(metin.lower())       # merhaba dünya
print(metin.title())       # Merhaba Dünya
print(metin.capitalize())  # Merhaba dünya
print(metin.swapcase())    # MERHABA dünya

# Kontrol metodları
print("BÜYÜK".isupper())    # True
print("küçük".islower())    # True
print("Başlık".istitle())   # True

strip() — Boşluk Temizleme

metin = "   merhaba dünya   "

print(metin.strip())    # "merhaba dünya" (iki taraf)
print(metin.lstrip())   # "merhaba dünya   " (sol taraf)
print(metin.rstrip())   # "   merhaba dünya" (sağ taraf)

# Belirli karakterleri de temizleyebilirsin
url = "///sayfa///"
print(url.strip("/"))  # "sayfa"

dosya = "rapor.txt\n"
print(dosya.strip())   # "rapor.txt" — \n de temizlenir

strip() kullanıcı girdisi temizlemede çok yaygın. Kullanıcı formda isim girerken başına/sonuna boşluk koymuş olabilir — strip() ile temizlersin.

split() ve join()

split() bir string'i parçalara ayırır, join() parçaları birleştirir. Birbirlerinin tersidir.

# split — string'i listeye çevir
cumle = "Python çok güzel bir dil"
kelimeler = cumle.split()
print(kelimeler)  # ['Python', 'çok', 'güzel', 'bir', 'dil']

# Belirli bir ayraçla
tarih = "2024-01-15"
parcalar = tarih.split("-")
print(parcalar)  # ['2024', '01', '15']

# CSV verisi
satir = "Ali,25,İstanbul"
alanlar = satir.split(",")
print(alanlar)  # ['Ali', '25', 'İstanbul']

# Maksimum bölme sayısı
metin = "bir-iki-üç-dört"
print(metin.split("-", 2))  # ['bir', 'iki', 'üç-dört']
# join — listeyi string'e çevir
kelimeler = ['Python', 'çok', 'güzel']

print(" ".join(kelimeler))     # Python çok güzel
print("-".join(kelimeler))     # Python-çok-güzel
print(", ".join(kelimeler))    # Python, çok, güzel
print("".join(kelimeler))      # Pythonçokgüzel

# Dosya yolu oluşturma
parcalar = ["home", "user", "documents", "rapor.txt"]
yol = "/".join(parcalar)
print(yol)  # home/user/documents/rapor.txt

⚠️ Dikkat: join() sadece string listesiyle çalışır. Sayı listesini birleştirmek istiyorsan önce string'e çevir: ", ".join(str(x) for x in [1, 2, 3])"1, 2, 3".

replace() — Değiştirme

metin = "Python 2 harika, Python 2 hızlı"

# Tüm eşleşmeleri değiştir
yeni = metin.replace("Python 2", "Python 3")
print(yeni)  # Python 3 harika, Python 3 hızlı

# Sadece ilk n eşleşmeyi değiştir
yeni2 = metin.replace("Python 2", "Python 3", 1)
print(yeni2)  # Python 3 harika, Python 2 hızlı

# Karakter silme
metin = "  M e r h a b a  "
temiz = metin.replace(" ", "")
print(temiz)  # Merhaba

find() ve index() — Arama

metin = "Python programlama dili"

# find — bulamazsa -1 döner
print(metin.find("programlama"))  # 7
print(metin.find("Java"))         # -1

# index — bulamazsa ValueError verir
print(metin.index("programlama"))  # 7
# print(metin.index("Java"))      # ValueError!

# Sağdan arama
print(metin.rfind("a"))  # 21 (son 'a')

# Belirli bir aralıkta arama
print(metin.find("o", 5))  # 15 (5. indeksten itibaren ara)

count() — Sayma

metin = "Python programlama, Python geliştirme, Python öğrenme"

print(metin.count("Python"))  # 3
print(metin.count("p"))       # 2 (küçük p)
print(metin.count("P"))       # 3 (büyük P)

# Belirli aralıkta sayma
print(metin.count("Python", 10))  # 2 (10. indeksten sonra)

startswith() ve endswith()

dosya = "rapor_2024.pdf"

print(dosya.startswith("rapor"))   # True
print(dosya.endswith(".pdf"))      # True
print(dosya.endswith(".txt"))      # False

# Birden fazla seçenekle (tuple)
print(dosya.endswith((".pdf", ".doc", ".txt")))  # True

# URL kontrolü
url = "https://example.com"
if url.startswith(("http://", "https://")):
    print("Geçerli URL")

Kontrol Metodları

# isdigit — sadece rakam mı?
print("12345".isdigit())    # True
print("123.45".isdigit())   # False (nokta rakam değil)
print("12 34".isdigit())    # False (boşluk rakam değil)

# isalpha — sadece harf mi?
print("Python".isalpha())   # True
print("Python3".isalpha())  # False

# isalnum — harf veya rakam mı?
print("Python3".isalnum())  # True
print("Python 3".isalnum()) # False (boşluk)

# isspace — sadece boşluk karakteri mi?
print("   ".isspace())      # True
print(" \t\n".isspace())    # True

zfill() ve center()

# Sıfır doldurma
print("42".zfill(5))     # 00042
print("3.14".zfill(7))   # 003.14

# Ortalama
print("Python".center(20))         # '       Python       '
print("Python".center(20, "-"))    # '-------Python-------'
print("Python".ljust(20, "."))     # 'Python..............'
print("Python".rjust(20, "."))     # '..............Python'

splitlines()

metin = """Birinci satır
İkinci satır
Üçüncü satır"""

satirlar = metin.splitlines()
print(satirlar)
# ['Birinci satır', 'İkinci satır', 'Üçüncü satır']

for i, satir in enumerate(satirlar, 1):
    print(f"{i}. {satir}")

expandtabs()

metin = "İsim\tYaş\tŞehir"
print(metin.expandtabs(15))
# İsim           Yaş            Şehir

f-string Detaylı

Python 3.6 ile gelen f-string'ler, string formatlama için en modern ve en okunaklı yöntemdir.

Temel Kullanım

isim = "Ali"
yas = 25

# f-string
print(f"Merhaba, {isim}! {yas} yaşındasın.")

# Eski yöntemler (karşılaştırma için)
print("Merhaba, {}! {} yaşındasın.".format(isim, yas))  # format()
print("Merhaba, %s! %d yaşındasın." % (isim, yas))       # % operatörü

İfadeler (Expressions)

f-string içinde her türlü Python ifadesi kullanabilirsin:

x = 10
y = 3

print(f"{x} + {y} = {x + y}")        # 10 + 3 = 13
print(f"{x} * {y} = {x * y}")        # 10 * 3 = 30
print(f"Karesi: {x ** 2}")            # Karesi: 100
print(f"{'Tek' if x % 2 else 'Çift'}")  # Çift

# Metod çağrısı
isim = "python"
print(f"{isim.upper()}")              # PYTHON
print(f"{isim.title()}")              # Python

# Fonksiyon çağrısı
import math
print(f"π ≈ {math.pi:.4f}")          # π ≈ 3.1416
print(f"√2 ≈ {math.sqrt(2):.4f}")    # √2 ≈ 1.4142

Format Specifiers

# Genişlik ve hizalama
isim = "Ali"
print(f"|{isim:<10}|")   # |Ali       | (sola hizalı)
print(f"|{isim:>10}|")   # |       Ali| (sağa hizalı)
print(f"|{isim:^10}|")   # |   Ali    | (ortalı)
print(f"|{isim:*^10}|")  # |***Ali****| (yıldızla doldur)

# Sayı formatlama
sayi = 1234567.89
print(f"{sayi:,.2f}")    # 1,234,567.89
print(f"{sayi:>15,.2f}") #   1,234,567.89

# Yüzde
oran = 0.856
print(f"{oran:.1%}")     # 85.6%

# Sayı sistemleri
x = 255
print(f"{x:b}")   # 11111111
print(f"{x:o}")   # 377
print(f"{x:x}")   # ff
print(f"{x:#x}")  # 0xff

Çok Satırlı f-string

isim = "Ali"
yas = 25
sehir = "İstanbul"

bilgi = (
    f"İsim: {isim}\n"
    f"Yaş: {yas}\n"
    f"Şehir: {sehir}"
)
print(bilgi)

Debugging: = Specifier (Python 3.8+)

x = 42
y = "merhaba"
z = [1, 2, 3]

# = ile değişken adını ve değerini birlikte göster
print(f"{x = }")    # x = 42
print(f"{y = }")    # y = 'merhaba'
print(f"{z = }")    # z = [1, 2, 3]

# İfadelerle de çalışır
print(f"{x * 2 = }")         # x * 2 = 84
print(f"{len(z) = }")        # len(z) = 3
print(f"{y.upper() = }")     # y.upper() = 'MERHABA'

Bu özellik debug ederken çok zaman kazandırır. print(f"x = {x}") yazmak yerine print(f"{x = }") yazabilirsin.

Süslü Parantez Gösterme

f-string içinde literal { veya } göstermek istersen, ikişer kullan:

print(f"Sözlük: {{'a': 1}}")  # Sözlük: {'a': 1}
print(f"Küme: {{1, 2, 3}}")   # Küme: {1, 2, 3}

String Karşılaştırma ve in Operatörü

Karşılaştırma

String'ler leksikografik (sözlük) sırasına göre karşılaştırılır. Her karakter Unicode değerine göre karşılaştırılır.

print("apple" < "banana")   # True (a < b)
print("apple" < "apricot")  # True (3. karakter: p < r)
print("ABC" < "abc")        # True (A=65, a=97)

# Büyük/küçük harf duyarsız karşılaştırma
s1 = "Python"
s2 = "python"
print(s1 == s2)                # False
print(s1.lower() == s2.lower()) # True

in Operatörü — Alt String Arama

metin = "Python programlama dili"

print("Python" in metin)      # True
print("Java" in metin)        # False
print("python" in metin)      # False (büyük-küçük harf duyarlı)
print("program" in metin)     # True (alt string arama)

# not in
print("Java" not in metin)    # True

# Koşulda kullanım
email = "ali@example.com"
if "@" in email and "." in email:
    print("Geçerli e-posta formatı")

Üyelik Kontrolü Deseni

# Yasaklı kelime kontrolü
yasak_kelimeler = ["spam", "reklam", "dolandırıcılık"]
mesaj = "Bu bir reklam mesajıdır"

for kelime in yasak_kelimeler:
    if kelime in mesaj.lower():
        print(f"Yasaklı kelime bulundu: {kelime}")
        break

Raw String (r"...")

Raw string'lerde ters eğik çizgi (\) kaçış karakteri olarak yorumlanmaz. Bu, özellikle regex (düzenli ifadeler) ve Windows dosya yolları için çok kullanışlı.

# Normal string — kaçış karakterleri yorumlanır
print("Satır 1\nSatır 2")    # İki satır
print("Tab\taralık")          # Tab aralığı
print("C:\new\folder")        # \n yeni satır olarak yorumlanır!

# Raw string — kaçış karakterleri yok
print(r"Satır 1\nSatır 2")   # Satır 1\nSatır 2
print(r"Tab\taralık")         # Tab\taralık
print(r"C:\new\folder")       # C:\new\folder
# Windows dosya yolları
# ❌ Sorunlu
yol = "C:\Users\new_user\documents"
# \U, \n, \d kaçış karakteri olarak yorumlanabilir

# ✅ Raw string ile güvenli
yol = r"C:\Users\new_user\documents"

# Regex'te çok kullanılır
import re
# \d+ "bir veya daha fazla rakam" demek
pattern = r"\d+"
sonuc = re.findall(pattern, "Fiyat: 42 TL, KDV: 8 TL")
print(sonuc)  # ['42', '8']

Yaygın Kaçış Karakterleri

print("Yeni satır: birinci\nikinci")
print("Tab: bir\tiki\tüç")
print("Ters eğik: \\")
print("Tek tırnak: \'")
print("Çift tırnak: \"")
print("Null karakter: \0")
print("Unicode: \u00e9")  # é
print("Unicode: \U0001F600")  # 😀

String Çarpma ve Birleştirme

Birleştirme (Concatenation)

ad = "Ali"
soyad = "Yılmaz"

# + operatörü ile
tam_isim = ad + " " + soyad
print(tam_isim)  # Ali Yılmaz

# += ile
mesaj = "Merhaba"
mesaj += " Dünya"
print(mesaj)  # Merhaba Dünya

⚠️ Dikkat: Döngü içinde string birleştirme (+=) performans açısından kötüdür. Her birleştirmede yeni bir string nesnesi oluşturulur. Çok sayıda string birleştirmen gerekiyorsa join() kullan:

# ❌ Yavaş — her adımda yeni string oluşur
sonuc = ""
for i in range(10000):
    sonuc += str(i) + ", "

# ✅ Hızlı — tek seferde birleştir
sonuc = ", ".join(str(i) for i in range(10000))

Çarpma (Multiplication)

String'i bir sayı ile çarparak tekrarlayabilirsin:

print("-" * 40)        # ----------------------------------------
print("Ha" * 3)        # HaHaHa
print("ABC " * 4)      # ABC ABC ABC ABC 

# Pratik kullanımlar
def baslik(metin, genislik=40, karakter="="):
    bosluk = genislik - len(metin) - 2
    sol = bosluk // 2
    sag = bosluk - sol
    return f"{karakter * sol} {metin} {karakter * sag}"

print(baslik("RAPOR"))
# ================= RAPOR =================

Otomatik Birleştirme (Implicit Concatenation)

Yan yana yazılan string literalleri otomatik birleştirilir:

# Otomatik birleştirme — sadece literaller için çalışır
mesaj = "Merhaba " "Dünya"
print(mesaj)  # Merhaba Dünya

# Uzun string'leri bölmek için kullanışlı
url = ("https://www.example.com"
       "/api/v2"
       "/users?page=1")
print(url)  # https://www.example.com/api/v2/users?page=1

encode/decode — Karakter Kodlama

String'ler bellekte Unicode olarak saklanır. Dosyaya yazarken veya ağ üzerinden gönderirken belirli bir kodlamaya (encoding) çevirmek gerekir.

Temel Kavram

# String → bytes (encode)
metin = "Merhaba Dünya"
baytlar = metin.encode("utf-8")
print(baytlar)       # b'Merhaba D\xc3\xbcnya'
print(type(baytlar)) # <class 'bytes'>

# bytes → String (decode)
geri = baytlar.decode("utf-8")
print(geri)          # Merhaba Dünya

Farklı Kodlamalar

metin = "Türkçe karakterler: ş, ğ, ü, ö, ç, ı"

# UTF-8 (en yaygın, önerilen)
utf8 = metin.encode("utf-8")
print(f"UTF-8: {len(utf8)} byte")

# Latin-5 (ISO 8859-9, Türkçe)
latin5 = metin.encode("iso-8859-9")
print(f"Latin-5: {len(latin5)} byte")

# ASCII — Türkçe karakterleri desteklemez
try:
    ascii_bytes = metin.encode("ascii")
except UnicodeEncodeError as e:
    print(f"Hata: {e}")

Hata Yönetimi

metin = "Merhaba 🌍"

# strict (varsayılan) — hata versin
# metin.encode("ascii")  # UnicodeEncodeError

# ignore — atlasın
print(metin.encode("ascii", errors="ignore"))
# b'Merhaba '

# replace — ? ile değiştirsin
print(metin.encode("ascii", errors="replace"))
# b'Merhaba ?'

# xmlcharrefreplace — XML karakter referansı
print(metin.encode("ascii", errors="xmlcharrefreplace"))
# b'Merhaba &#127757;'

Günlük programlamada çoğunlukla UTF-8 kullanırsın ve encode/decode ile fazla uğraşmazsın. Ama dosya okuma, API çağrısı veya web scraping yaparken bu bilgi çok işine yarar.


String Formatlama Yöntemleri Karşılaştırması

Python'da string formatlama için üç yöntem var. Tarihi sırasıyla:

isim = "Ali"
yas = 25

# 1. % operatörü (C tarzı, eski)
print("Merhaba, %s! %d yaşındasın." % (isim, yas))

# 2. format() metodu (Python 2.6+)
print("Merhaba, {}! {} yaşındasın.".format(isim, yas))
print("Merhaba, {0}! {1} yaşındasın. {0} hoşgeldin.".format(isim, yas))
print("Merhaba, {isim}! {yas} yaşındasın.".format(isim=isim, yas=yas))

# 3. f-string (Python 3.6+, önerilen)
print(f"Merhaba, {isim}! {yas} yaşındasın.")

💡 İpucu: Yeni kod yazıyorsan her zaman f-string kullan. Daha okunabilir, daha hızlı ve daha Pythonic. Eski yöntemleri sadece eski kodları okurken anlamak için bilmen yeterli.


Pratik Örnekler

E-posta Doğrulama (Basit)

def email_gecerli_mi(email):
    """Basit e-posta format kontrolü"""
    if " " in email:
        return False
    if email.count("@") != 1:
        return False
    
    kullanici, domain = email.split("@")
    
    if len(kullanici) == 0:
        return False
    if "." not in domain:
        return False
    if len(domain.split(".")[-1]) < 2:
        return False
    
    return True

testler = [
    "ali@example.com",
    "test@test",
    "@example.com",
    "ali veli@test.com",
    "ali@@test.com",
]

for email in testler:
    sonuc = "✅" if email_gecerli_mi(email) else "❌"
    print(f"{sonuc} {email}")

Kelime Sayacı

def kelime_istatistik(metin):
    """Metin istatistikleri hesapla"""
    kelimeler = metin.split()
    karakterler = len(metin)
    kelime_sayisi = len(kelimeler)
    cumle_sayisi = metin.count(".") + metin.count("!") + metin.count("?")
    benzersiz = len(set(k.lower().strip(".,!?;:") for k in kelimeler))
    
    print(f"Karakter sayısı: {karakterler}")
    print(f"Kelime sayısı:   {kelime_sayisi}")
    print(f"Cümle sayısı:    {cumle_sayisi}")
    print(f"Benzersiz kelime: {benzersiz}")
    
    if kelime_sayisi > 0:
        ort = karakterler / kelime_sayisi
        print(f"Ort. kelime uzunluğu: {ort:.1f}")

metin = "Python çok güzel bir dil. Python öğrenmek kolay. Herkes Python öğrenmeli!"
kelime_istatistik(metin)

Basit Şablon Motoru

def sablon_uygula(sablon, **degiskenler):
    """Basit şablon motoru — {degisken} yerine değer koy"""
    sonuc = sablon
    for anahtar, deger in degiskenler.items():
        sonuc = sonuc.replace("{" + anahtar + "}", str(deger))
    return sonuc

sablon = """
Sayın {isim},

{tarih} tarihli siparişiniz #{siparis_no} hazırlanmıştır.
Toplam tutar: ₺{tutar}

Teşekkür ederiz.
"""

mesaj = sablon_uygula(
    sablon,
    isim="Ali Yılmaz",
    tarih="2024-01-15",
    siparis_no=12345,
    tutar="249.90"
)
print(mesaj)

Özet

  • String'ler immutable'dır — bir string'i değiştiremezsin, yerine yeni bir string oluşturursun.

  • İndeksleme (s[0], s[-1]) tek karakter, dilimleme (s[1:3], s[::-1]) alt string verir.

  • `split()` ve `join()` birbirlerinin tersidir — string'i listeye çevir, listeyi string'e çevir.

  • f-string en modern ve önerilen formatlama yöntemidir — f"{degisken:.2f}" gibi format specifiers ile güçlü.

  • `in` operatörü alt string araması yapar — "Python" in metin gibi.

  • Raw string (`r"..."`) kaçış karakterlerini yoksayar — regex ve dosya yolları için kullan.