10. Kalitim ve Cok Bicimlilik

Java’nin Temelleri

Ismail Kirbas

2026

10. Kalitim ve Cok Bicimlilik

---
title: String İşlemleri ve Metin Problemleri
description: String sınıfı metodları, metin manipulasyonu ve karakter işlemlerini öğrenin
keywords: string, metin, karakter, Python, programlama
author: Teknik Kitap Yazarı
date: 2024
---

Bölüm 10: String Islemleri ve Metin Problemleri

10.1 Giriş

Programlamada metin işlemleri, en sık karşılaşılan ve en önemli konulardan biridir. Kullanıcı girdilerini işleme, dosya okuma/yazma, veri temizleme ve metin tabanlı algoritmalar geliştirme gibi birçok alanda string işlemleri kritik rol oynar.

Bu bölümde, Python’daki str sınıfının sunduğu zengin metodları, metin manipulasyonu tekniklerini ve karakter işlemlerini adım adım inceleyeceksiniz. Temel string işlemlerinden başlayarak, gelişmiş metin problemlerinin çözümüne kadar geniş bir yelpazede bilgi edineceksiniz.

💡 Pedagojik Not: Bu bölümdeki her konuyu, verilen kod örneklerini kendi bilgisayarınızda çalıştırarak pekiştirmeniz önerilir. Gerçek dünya problemlerinde string işlemleri sıklıkla kullanıldığından, bu konulara hakim olmak programlama becerilerinizi önemli ölçüde geliştirecektir.

10.2 String Sınıfı ve Temel Metodlar

String Oluşturma ve İlk Değer Atama

Python’da string oluşturmanın birden fazla yolu vardır. En yaygın yöntem, tek tırnak (') veya çift tırnak (") kullanmaktır.

📘 Önemli Bilgi: String’ler Python’da immutable (değişmez) veri tipleridir. Bir string oluşturulduktan sonra içeriği değiştirilemez. Değişiklik yapmak istediğinizde yeni bir string oluşturmanız gerekir.

## 10.3 String oluşturma örnekleri
isim = "Ahmet"  # Çift tırnak ile
metin = 'Merhaba Dünya'  # Tek tırnak ile
bos_string = ""  # Boş string
cok_satirli = """Bu bir
çok satırlı
string örneğidir."""

print(f"İsim: {isim}")
print(f"Metin: {metin}")
print(f"Boş mu?: {len(bos_string) == 0}")
print(f"Çok satırlı: {cok_satirli}")

Çıktı:

İsim: Ahmet
Metin: Merhaba Dünya
Boş mu?: True
Çok satırlı: Bu bir
çok satırlı
string örneğidir.

String Uzunluğu ve İndeksleme

String’ler, karakter dizileri olduğu için indekslenebilirler. Python’da indeksleme 0’dan başlar ve negatif indeksler sondan başa doğru sayar.

💡 İpucu: Negatif indeksleme, bir string’in sonundan itibaren karakterlere erişmek için oldukça kullanışlıdır. Örneğin, metin[-1] her zaman son karakteri verir.

metin = "Python Programlama"

## 10.4 Uzunluk
print(f"Uzunluk: {len(metin)}")

## 10.5 Pozitif indeksleme
print(f"İlk karakter (0): '{metin[0]}'")
print(f"3. karakter (2): '{metin[2]}'")

## 10.6 Negatif indeksleme
print(f"Son karakter (-1): '{metin[-1]}'")
print(f"Sondan 3. karakter (-3): '{metin[-3]}'")

Çıktı:

Uzunluk: 19
İlk karakter (0): 'P'
3. karakter (2): 't'
Son karakter (-1): 'a'
Sondan 3. karakter (-3): 'm'

String Dilimleme (Slicing)

Dilimleme, bir string’in belirli bir bölümünü almak için kullanılır. [başlangıç:bitiş:adım] formatında kullanılır.

⚠️ Dikkat: Dilimleme işleminde bitiş indeksi dahil değildir. Yani metin[0:5] ifadesi 0, 1, 2, 3, 4. indeksleri alır, 5. indeksi almaz.

metin = "Merhaba Dünya"

## 10.7 Temel dilimleme
print(f"İlk 7 karakter: '{metin[:7]}'")  # 'Merhaba'
print(f"5. karakterden sonra: '{metin[5:]}'")  # 'ba Dünya'

## 10.8 Adım kullanarak
print(f"Her 2. karakter: '{metin[::2]}'")
print(f"Ters çevrilmiş: '{metin[::-1]}'")

## 10.9 Negatif indekslerle dilimleme
print(f"Son 5 karakter: '{metin[-5:]}'")
print(f"2. indeksten 8. indekse: '{metin[2:8]}'")

Çıktı:

İlk 7 karakter: 'Merhaba'
5. karakterden sonra: 'ba Dünya'
Her 2. karakter: 'MraaDny'
Ters çevrilmiş: 'aynaD übahreM'
Son 5 karakter: 'Dünya'
2. indeksten 8. indekse: 'rhaba '

10.10 String Metin Manipülasyon Metodları

Büyük/Küçük Harf Dönüşümleri

Python, metinlerin büyük/küçük harf durumlarını değiştirmek için çeşitli metodlar sunar.

📘 Önemli Bilgi: casefold() metodu, lower() metodundan daha agresif bir küçük harf dönüşümü yapar. Özellikle Almanca ‘ß’ gibi özel karakterler için kullanışlıdır.

metin = "pYthon prOgramlama DİLİ"

## 10.11 Temel dönüşümler
print(f"Orijinal: {metin}")
print(f"Büyük harf: {metin.upper()}")
print(f"Küçük harf: {metin.lower()}")
print(f"Başlık formatı: {metin.title()}")
print(f"İlk harf büyük: {metin.capitalize()}")

## 10.12 Swapcase - büyük/küçük harf değiştirme
print(f"Swapcase: {metin.swapcase()}")

## 10.13 Casefold - özel karakterler için
ozel_metin = "STRASSE"
print(f"Lower: {ozel_metin.lower()}")
print(f"Casefold: {ozel_metin.casefold()}")

Çıktı:

Orijinal: pYthon prOgramlama DİLİ
Büyük harf: PYTHON PROGRAMLAMA DİLİ
Küçük harf: python programlama dili
Başlık formatı: Python Programlama Dili
İlk harf büyük: Python programlama dili
Swapcase: PyTHON PRoGRAMLAMA dili
Lower: strasse
Casefold: strasse

Boşluk ve Karakter Temizleme

Metinlerdeki gereksiz boşlukları ve özel karakterleri temizlemek için çeşitli metodlar bulunur.

💡 İpucu: strip() metodu varsayılan olarak boşluk karakterlerini temizler. İsteğe bağlı olarak hangi karakterlerin temizleneceğini belirtebilirsiniz.

## 10.14 Boşluk temizleme
metin = "   Merhaba Dünya   "
print(f"Strip: '{metin.strip()}'")
print(f"Lstrip: '{metin.lstrip()}'")
print(f"Rstrip: '{metin.rstrip()}'")

## 10.15 Özel karakter temizleme
metin2 = "***Merhaba***"
print(f"* strip: '{metin2.strip('*')}'")

## 10.16 Replace ile karakter değiştirme
metin3 = "Merhaba Dünya"
print(f"Replace: '{metin3.replace('a', 'e')}'")

## 10.17 translate() ile toplu dönüşüm
tablo = str.maketrans({'a': 'e', 'ı': 'i', 'o': 'ö'})
print(f"Translate: '{metin3.translate(tablo)}'")

Çıktı:

Strip: 'Merhaba Dünya'
Lstrip: 'Merhaba Dünya   '
Rstrip: '   Merhaba Dünya'
* strip: 'Merhaba'
Replace: 'Merhebe Dünye'
Translate: 'Merhebe Dünye'

Bölme ve Birleştirme İşlemleri

Metinleri parçalara ayırmak ve birleştirmek için kullanılan metodlar, veri işleme süreçlerinde sıklıkla kullanılır.

⚠️ Dikkat: split() metodu varsayılan olarak tüm boşluk karakterlerine (space, tab, newline) göre böler. Belirli bir karaktere göre bölmek için parametre vermelisiniz.

## 10.18 Split - bölme işlemi
metin = "elma,armut,muz,çilek"
meyveler = metin.split(",")
print(f"Virgülle bölünmüş: {meyveler}")

## 10.19 Birden fazla ayırıcı ile split
metin2 = "elma;armut|muz,çilek"
import re
print(f"Regex ile bölme: {re.split('[;|,]', metin2)}")

## 10.20 Join - birleştirme işlemi
birlesik = " - ".join(meyveler)
print(f"Birleştirilmiş: '{birlesik}'")

## 10.21 Partition ve rpartition
telefon = "+90-555-123-4567"
print(f"Partition: {telefon.partition('-')}")
print(f"Rpartition: {telefon.rpartition('-')}")

Çıktı:

Virgülle bölünmüş: ['elma', 'armut', 'muz', 'çilek']
Regex ile bölme: ['elma', 'armut', 'muz', 'çilek']
Birleştirilmiş: 'elma - armut - muz - çilek'
Partition: ('+90', '-', '555-123-4567')
Rpartition: ('+90-555-123', '-', '4567')

10.22 String Arama ve Kontrol Metodları

İçerik Kontrol Metodları

Bir string’in belirli bir desenle başlayıp başlamadığını, belirli bir karakter veya kelimeyi içerip içermediğini kontrol etmek için kullanılır.

📘 Önemli Bilgi: in operatörü, bir string’in başka bir string içinde olup olmadığını kontrol eder. Bu işlem büyük/küçük harf duyarlıdır.

metin = "Python programlama dili Python ile yazılım geliştirme"

## 10.23 Başlangıç ve bitiş kontrolü
print(f"'Python' ile başlıyor mu?: {metin.startswith('Python')}")
print(f"'geliştirme' ile bitiyor mu?: {metin.endswith('geliştirme')}")

## 10.24 İçerik kontrolü
print(f"'Java' metinde var mı?: {'Java' in metin}")
print(f"'Python' metinde var mı?: {'Python' in metin}")

## 10.25 Sayma işlemi
print(f"'Python' kaç kez geçiyor?: {metin.count('Python')}")
print(f"'a' harfi kaç kez geçiyor?: {metin.count('a')}")

Çıktı:

'Python' ile başlıyor mu?: True
'geliştirme' ile bitiyor mu?: True
'Java' metinde var mı?: False
'Python' metinde var mı?: True
'Python' kaç kez geçiyor?: 2
'a' harfi kaç kez geçiyor?: 5

Bulma ve İndeks Metodları

Bir alt string’in konumunu bulmak için kullanılan metodlar. find() ve index() arasındaki fark, hata durumunda nasıl davrandıklarıdır.

💡 İpucu: find() metodu, aranan değer bulunamazsa -1 döndürür. index() metodu ise ValueError hatası fırlatır. Güvenli arama için find() tercih edilmelidir.

metin = "Merhaba Dünya, Merhaba Evren"

## 10.26 find() metodu
print(f"İlk 'Merhaba' indeksi: {metin.find('Merhaba')}")
print(f"Son 'Merhaba' indeksi: {metin.rfind('Merhaba')}")
print(f"Bulunamayan kelime: {metin.find('Selam')}")  # -1 döner

## 10.27 index() metodu
print(f"İlk 'Dünya' indeksi: {metin.index('Dünya')}")

try:
    metin.index('Selam')
except ValueError as e:
    print(f"Hata: {e}")

## 10.28 Belirli bir indexten sonra arama
print(f"10. indexten sonra 'Merhaba': {metin.find('Merhaba', 10)}")

Çıktı:

İlk 'Merhaba' indeksi: 0
Son 'Merhaba' indeksi: 16
Bulunamayan kelime: -1
İlk 'Dünya' indeksi: 8
Hata: substring not found
10. indexten sonra 'Merhaba': 16

Karakter Tipi Kontrolleri

Bir string’in tamamen harflerden, rakamlardan veya belirli karakter tiplerinden oluşup oluşmadığını kontrol eder.

⚠️ Dikkat: isnumeric(), isdigit() ve isdecimal() metodları arasında ince farklar vardır. isnumeric() en geniş kapsamlıdır ve Roma rakamlarını, kesirleri de içerir.

testler = ["Python3", "12345", "   ", "Merhaba", "3.14"]

print("Karakter Tipi Kontrolleri:")
print("-" * 50)

for test in testler:
    print(f"'{test}' -> ", end="")
    print(f"alpha: {test.isalpha()}, ", end="")
    print(f"digit: {test.isdigit()}, ", end="")
    print(f"alnum: {test.isalnum()}, ", end="")
    print(f"space: {test.isspace()}")

## 10.29 Özel durumlar
print("\nÖzel Durumlar:")
print(f"'Ⅻ' (Roma rakamı) isnumeric: {'Ⅻ'.isnumeric()}")
print(f"'Ⅻ' (Roma rakamı) isdigit: {'Ⅻ'.isdigit()}")
print(f"'²' (üst simge) isdigit: {'²'.isdigit()}")
print(f"'²' (üst simge) isnumeric: {'²'.isnumeric()}")

Çıktı:

Karakter Tipi Kontrolleri:
--------------------------------------------------
'Python3' -> alpha: False, digit: False, alnum: True, space: False
'12345' -> alpha: False, digit: True, alnum: True, space: False
'   ' -> alpha: False, digit: False, alnum: False, space: True
'Merhaba' -> alpha: True, digit: False, alnum: True, space: False
'3.14' -> alpha: False, digit: False, alnum: False, space: False

Özel Durumlar:
'Ⅻ' (Roma rakamı) isnumeric: True
'Ⅻ' (Roma rakamı) isdigit: False
'²' (üst simge) isdigit: True
'²' (üst simge) isnumeric: True

10.30 String Biçimlendirme ve Formatlama

f-string Kullanımı

Python 3.6 ile gelen f-string’ler, string biçimlendirmenin en modern ve okunabilir yoludur.

📘 Önemli Bilgi: f-string’ler çalışma zamanında değerlendirilir ve içlerinde herhangi bir Python ifadesi kullanılabilir.

isim = "Ali"
yas = 25
maas = 5250.50

## 10.31 Temel kullanım
print(f"Ad: {isim}, Yaş: {yas}, Maaş: {maas:.2f} TL")

## 10.32 Hizalama ve dolgu
print(f"Sağa hizalı: '{isim:>10}'")
print(f"Sola hizalı: '{isim:<10}'")
print(f"Ortala: '{isim:^10}'")
print(f"Dolgulu: '{isim:*^10}'")

## 10.33 İfade kullanımı
print(f"10 yıl sonra yaş: {yas + 10}")
print(f"İsmin uzunluğu: {len(isim)}")

## 10.34 Tarih formatlama
from datetime import datetime
bugun = datetime.now()
print(f"Bugün: {bugun:%d.%m.%Y}")
print(f"Saat: {bugun:%H:%M}")

Çıktı:

Ad: Ali, Yaş: 25, Maaş: 5250.50 TL
Sağa hizalı: '        Ali'
Sola hizalı: 'Ali       '
Ortala: '   Ali   '
Dolgulu: '***Ali****'
10 yıl sonra yaş: 35
İsmin uzunluğu: 3
Bugün: 15.01.2024
Saat: 14:30

format() Metodu

f-string’lerden önceki dönemde en yaygın kullanılan biçimlendirme yöntemiydi. Esnek ve güçlüdür.

💡 İpucu: format() metodu, özellikle biçimlendirme şablonlarının dışarıdan alındığı durumlarda kullanışlıdır.

## 10.35 Konumsal parametreler
print("{} {} {} yılında doğdu.".format("Ahmet", "1980", "İstanbul"))

## 10.36 Sıra belirterek
print("{2} {0} {1} yılında doğdu.".format("Ahmet", "1980", "İstanbul"))

## 10.37 Anahtarlı parametreler
print("{ad} {soyad} - {meslek}".format(
    ad="Ayşe", soyad="Yılmaz", meslek="Mühendis"))

## 10.38 Sözlük ile kullanım
kisi = {"ad": "Mehmet", "yas": 30, "sehir": "Ankara"}
print("Ad: {ad}, Yaş: {yas}, Şehir: {sehir}".format(**kisi))

## 10.39 Sayı formatlama
sayi = 1234.5678
print("Ondalık: {:.2f}".format(sayi))
print("Bilimsel: {:.2e}".format(sayi))
print("Yüzde: {:.1%}".format(0.85))

Çıktı:

Ahmet 1980 İstanbul yılında doğdu.
İstanbul Ahmet 1980 yılında doğdu.
Ayşe Yılmaz - Mühendis
Ad: Mehmet, Yaş: 30, Şehir: Ankara
Ondalık: 1234.57
Bilimsel: 1.23e+03
Yüzde: 85.0%

% Operatörü ile Eski Tip Formatlama

C dili benzeri bu formatlama yöntemi, eski Python kodlarında hala görülebilir.

⚠️ Dikkat: Bu yöntem günümüzde önerilmemektedir. Yeni projelerde f-string veya format() metodu kullanılmalıdır.

isim = "Veli"
not_ort = 85.6789

## 10.40 Temel kullanım
print("Öğrenci: %s, Not ortalaması: %.2f" % (isim, not_ort))

## 10.41 Sayı formatlama
print("Sayı: %+d" % 42)
print("Ondalık: %.3f" % 3.14159)
print("Ondalık: %8.2f" % 3.14159)

## 10.42 Farklı tipler
print("Hex: %x" % 255)
print("Oct: %o" % 255)
print("Bilimsel: %e" % 1234.5678)

Çıktı:

Öğrenci: Veli, Not ortalaması: 85.68
Sayı: +42
Ondalık: 3.142
Ondalık:     3.14
Hex: ff
Oct: 377
Bilimsel: 1.234568e+03

10.43 Gelişmiş String İşlemleri ve Problem Çözme

Düzenli İfadelerle String İşleme

Düzenli ifadeler (regex), metin işleme konusunda çok güçlü bir araçtır. Karmaşık desenleri kolayca tanımlayıp metin içinde arayabilirsiniz.

📘 Önemli Bilgi: Düzenli ifadeler öğrenmesi biraz zaman alsa da, metin işleme konusunda size inanılmaz bir güç kazandırır. Özellikle veri temizleme ve doğrulama işlemlerinde vazgeçilmezdir.

import re

## 10.44 Temel desen eşleştirme
metin = "Telefon: 555-123-4567, E-posta: test@ornek.com"

telefon_deseni = r'\d{3}-\d{3}-\d{4}'
eposta_deseni = r'\w+@\w+\.\w+'

telefon = re.search(telefon_deseni, metin)
eposta = re.search(eposta_deseni, metin)

print(f"Bulunan telefon: {telefon.group() if telefon else 'Bulunamadı'}")
print(f"Bulunan e-posta: {eposta.group() if eposta else 'Bulunamadı'}")

## 10.45 Metin temizleme
kirli_metin = "Merhaba!! Bu bir *** test ## metnidir."
temiz = re.sub(r'[^\w\s]', '', kirli_metin)
print(f"Temizlenmiş: {temiz}")

## 10.46 Tüm eşleşmeleri bulma
metin2 = "[email1@test.com, email2@test.com, email3@test.com]"
emailler = re.findall(r'\w+@\w+\.\w+', metin2)
print(f"Tüm e-postalar: {emailler}")

## 10.47 Gruplama
tarih_metni = "Bugün 15-01-2024"
desen = r'(\d{2})-(\d{2})-(\d{4})'
match = re.search(desen, tarih_metni)
if match:
    print(f"Gün: {match.group(1)}, Ay: {match.group(2)}, Yıl: {match.group(3)}")

Çıktı:

Bulunan telefon: 555-123-4567
Bulunan e-posta: test@ornek.com
Temizlenmiş: Merhaba Bu bir  test  metnidir
Tüm e-postalar: ['email1@test.com', 'email2@test.com', 'email3@test.com']
Gün: 15, Ay: 01, Yıl: 2024

String Kodlama ve Karakter Setleri

Farklı karakter kodlamaları arasında dönüşüm yapmak, özellikle dosya işlemleri ve ağ programlamada önemlidir.

💡 İpucu: Günümüzde metin işlemlerinde UTF-8 kodlaması standarttır. ASCII sadece İngilizce karakterler için uygundur.

metin = "Merhaba Dünya 🌍"

## 10.48 Encoding (karakter -> byte)
utf8_bytes = metin.encode('utf-8')
print(f"UTF-8 bytes: {utf8_bytes}")
print(f"Byte sayısı: {len(utf8_bytes)}")

## 10.49 Decoding (byte -> karakter)
cozulmus = utf8_bytes.decode('utf-8')
print(f"Çözülmüş: {cozulmus}")

## 10.50 Farklı kodlamalar
latin1_bytes = metin.encode('latin-1', errors='replace')
print(f"Latin-1: {latin1_bytes}")

## 10.51 ASCII kontrolü
try:
    metin.encode('ascii')
except UnicodeEncodeError as e:
    print(f"ASCII'ye dönüştürülemez: {e}")

## 10.52 Byte string işlemleri
byte_metin = b'Python'
print(f"Byte string: {byte_metin}")
print(f"Byte'dan string'e: {byte_metin.decode('utf-8')}")

Çıktı:

UTF-8 bytes: b'Merhaba D\xc3\xbcnya \xf0\x9f\x8c\x8d'
Byte sayısı: 17
Çözülmüş: Merhaba Dünya 🌍
Latin-1: b'Merhaba D\xfcnya ?'
ASCII'ye dönüştürülemez: 'ascii' codec can't encode character '\xfc' in position 9: ordinal not in range(128)
Byte string: b'Python'
Byte'dan string'e: Python

String Performans İpuçları

Büyük metinlerle çalışırken performans önemli bir faktördür. Doğru yöntemleri kullanmak, uygulamanızın hızını önemli ölçüde etkileyebilir.

⚠️ Dikkat: String birleştirme işlemlerinde + operatörü yerine join() metodu kullanmak, özellikle çok sayıda birleştirme işleminde çok daha verimlidir.

import time

## 10.53 Performans testi fonksiyonu
def performans_testi():
    # Kötü performans - + operatörü
    baslangic = time.time()
    sonuc = ""
    for i in range(10000):
        sonuc += str(i)
    bitis = time.time()
    print(f"+ operatörü: {bitis - baslangic:.4f} saniye")
    
    # İyi performans - join() metodu
    baslangic = time.time()
    parcalar = [str(i) for i in range(10000)]
    sonuc = "".join(parcalar)
    bitis = time.time()
    print(f"join() metodu: {bitis - baslangic:.4f} saniye")
    
    # Liste comprehension ile join
    baslangic = time.time()
    sonuc = "".join(str(i) for i in range(10000))
    bitis = time.time()
    print(f"Generator ile join: {bitis - baslangic:.4f} saniye")

performans_testi()

## 10.54 Büyük metinlerde arama performansı
buyuk_metin = "a" * 1000000 + "b" + "a" * 1000000

## 10.55 in operatörü
baslangic = time.time()
print(f"'b' var mı?: {'b' in buyuk_metin}")
print(f"in operatörü: {time.time() - baslangic:.4f} saniye")

## 10.56 find metodu
baslangic = time.time()
print(f"'b' indeksi: {buyuk_metin.find('b')}")
print(f"find metodu: {time.time() - baslangic:.4f} saniye")

Çıktı:

+ operatörü: 0.0023 saniye
join() metodu: 0.0008 saniye
Generator ile join: 0.0010 saniye
'b' var mı?: True
in operatörü: 0.0001 saniye
'b' indeksi: 1000000
find metodu: 0.0001 saniye

Pratik Problem Çözümleri

String işlemleriyle ilgili yaygın problemlerin çözümlerini inceleyelim.

💡 İpucu: Bu problemler, iş görüşmelerinde sıkça sorulan sorulardır. Her birini kendi başınıza çözmeye çalışarak pratik yapabilirsiniz.

```python ## 10.57 Palindrom kontrolü def palindrom_mu(metin): ““” Bir metnin palindrom olup olmadığını kontrol eder. Palindrom: Tersinden okunuşu aynı olan metin (örn: kabak, ada) ““” # Boşlukları ve noktalama işaretlerini temizle metin = ’’.join(c.lower() for c in metin if c.isalnum()) return metin == metin[::-1]

print(“Palindrom Kontrolü:”) print(f”‘kabak’ palindrom mu?: {palindrom_mu(‘kabak’)}“) print(f”‘Merhaba’ palindrom mu?: {palindrom_mu(‘Merhaba’)}“) print(f”‘Ey Edip Adana’da pide ye’ palindrom mu?: {palindrom_mu(‘Ey Edip Adana'da pide ye’)}“)

10.58 Anagram tespiti

def anagram_mi(kelime1, kelime2): ““” İki kelimenin anagram olup olmadığını kontrol eder. Anagram: Harfleri yeniden düzenlenerek oluşturulmuş kelime ““” return sorted(kelime1.lower().replace(” “,”“)) == sorted(kelime2.lower().replace(” “,”“))

print(“Kontrolü:”) print(f”‘elma’ ve ‘lame’ anagram mı?: {anagram_mi(‘elma’, ‘lame’)}“) print(f”‘kitap’ ve ‘katip’ anagram mı?: {anagram_mi(‘kitap’, ‘katip’)}“) print(f”‘Roma’ ve ‘amor’ anagram mı?: {anagram_mi(‘Roma’, ‘amor’)}“)

10.59 Basit metin sıkıştırma (Run-length encoding)

def metin_sikistir(metin): ““” Tekrarlanan