String işlemleri

Programlarda birçok veri sayı değildir: adlar, e-posta adresleri, ürün kodları, şehir adları, dosya adları ve kullanıcı mesajları metin olarak tutulur. Python’da metin değerlerine string denir, türleri str’dir.

Bu hafta bir string’in karakterlerine erişmeyi, parçalarını almayı, metni temizlemeyi ve basit kontroller yapmayı öğreneceğiz. String metotlarını ezberlemeniz gerekmez. Metni adım adım dönüştürüp her adımın sonucuna bakmanız yeter.

Bu sayfadaki kod hücreleri kendiliğinden çalışmaz. Her hücrede önce çıktıyı tahmin edin, sonra Run Code düğmesine basın. Kodu değiştirip yeniden çalıştırabilir, Start Over ile ilk hâline döndürebilirsiniz.

Bu bölümün kapsamı

NoteSınavda sorulur
  • İndeks ve negatif indeksle karaktere erişim
  • Dilimlemede başlangıcın dâhil, bitişin hariç olması
  • String’in değiştirilemez olması ve metotların yeni string döndürmesi
  • strip(), lower(), upper() ve Türkçe I / İ sınırı
  • in, startswith() ve endswith() denetimlerinin farkı
  • split() ve join() ile parçalama ve birleştirme
  • f-string ile biçimlendirme ve :.2f davranışı
  • Düzenli ifadeler (re modülü)
  • Unicode normalleştirme biçimleri
  • casefold() davranışının ayrıntıları

Bu başlıklar konunun devamıdır. İleride karşınıza çıkar, ama bu derste ezberlemeniz beklenmiyor.

Kulübün kayıt listesini nasıl temizlerdiniz?

Okulda bir kulüp çevrim içi bir formla üye topluyor. Her öğrenci adını, öğrenci numarasını ve e-posta adresini yazıyor, aralarına virgül koyuyor. Formdan gelen liste şöyle:

Işıl Kaya,2406044,[email protected]
Deniz Yılmaz, 2306012 ,[email protected]
Ali Can,2506101,[email protected]
IŞIL KAYA ,2406044,[email protected]

Kulüp başkanı bu listeyi her hafta elle düzenliyor:

  • Her satırı ad, numara ve e-posta diye üç parçaya ayırıyor.
  • Numaranın ilk iki hanesinden öğrencinin giriş yılını buluyor: 23 ise 2023.
  • Yalnız okul adresiyle, yani omu.edu.tr ile biten adresle kaydolanları kabul ediyor.
  • Aynı kişi iki kez yazılmışsa birini siliyor.
  • Temiz listeyi Deniz Yılmaz (2023 girişli) biçiminde yazıyor.

Bu iş bir programa verilecek. Program yalnız ona yazdığınız kuralları bilecek. 1. bölümde bir işin adımlarını sözde kodla yazmıştık. Başkanın kurallarını da öyle, Türkçe ve madde madde yazın. Sonra kurallarınızı listedeki satırlarla deneyin:

  1. İkinci satırdaki öğrencinin giriş yılını kurallarınız kaç buluyor?
  2. Üçüncü satırdaki adresi kurallarınız okul adresi sayıyor mu?
  3. Birinci ve dördüncü satırı kurallarınız aynı kişi sayıyor mu?

Python bilmeniz gerekmiyor: “Satırı virgüllerden ayır” da bir kural. Kurallarınızı bir kenara yazın. Bölümde her birinin Python’da nasıl yazıldığını göreceğiz. Alıştırmalardan önce listenize döneceğiz.

String: karakterlerden oluşan bir değer

Aşağıdaki değişken bir string tutar:

sehir = "Samsun"

Karakterleri soldan sağa numaralayalım:

S  a  m  s  u  n
0  1  2  3  4  5

Her karakterin sırasını gösteren bu numaraya indeks denir. Python’da indeksler 0’dan başlar. Bir karaktere köşeli parantezle ulaşırız: sehir[0]. Hücredeki üç satır ne yazar?

Important

Altı karakterlik bir string’in son geçerli pozitif indeksi 5’tir. sehir[6] yazmak IndexError hatası verir.

len() ile uzunluk

len() string içindeki karakter sayısını verir. Hücre kaç yazar?

Son indeks her zaman uzunluktan bir eksiktir:

uzunluk = 6
son indeks = 5

Bu nedenle son karaktere pozitif indeksle ulaşmak için len(metin) - 1 kullanılabilir. Hücre hangi karakteri yazar?

Bunun daha kısa bir yolu da var: hemen aşağıda göreceğimiz negatif indeksleme ile son karakteri metin[-1] yazarak alabiliriz.

Negatif indeksler

Negatif indeksler sağdan sayar: -1 son karakteri gösterir. İki satır ne yazar?

Tahmin et: hangi karakterler yazılır?

Kodu çalıştırmadan önce sonucu tahmin edin:

Sonra hücreyi çalıştırıp tahmininizi doğrulayın.

Dilimleme (slicing)

Bir string’in tek bir karakterini alabildiğimiz gibi bir bölümünü de alabiliriz. Buna dilimleme denir. Köşeli parantezin içine başlangıç ve bitiş indeksi iki noktayla ayrılarak yazılır. Hücre ne yazar?

Dilimlemede başlangıç indeksi dâhil, bitiş indeksi hariçtir.

metin[0:7]
      ↑ ↑
      | └─ 7 dâhil değil
      └─── 0 dâhil

Başlangıç ya da bitiş boş bırakılabilir. Başlangıç boşsa dilim metnin başından, bitiş boşsa metnin sonuna kadar alınır. İki satır ne yazar?

Bir metinde pozitif ve negatif indeksler ile dilimleme aralıklarının gösterimi.

Metinde indeksleme ve dilimleme

Alıştırma: ders kodunu parçalayın

"BLP101" değerinden ilk üç karakteri ve son üç karakteri ayrı değişkenlere alın.

Beklenen çıktı:

BLP
101

İlk üç karakter için ders_kodu[:3], son üç karakter için ders_kodu[-3:] kullanılabilir.

ders_kodu = "BLP101"

bolum = ders_kodu[:3]
numara = ders_kodu[-3:]

print(bolum)
print(numara)

String değerler değiştirilemez

Gelecek hafta bir listenin elemanlarını değiştirebildiğimizi göreceğiz. String’in tek bir karakterini ise doğrudan değiştiremeyiz. Hücredeki ikinci satır ne yapar?

İkinci satır TypeError verir: 'str' object does not support item assignment. Python bir string’in karakterine atama yapmaya izin vermez. Hata çıktığı için print() satırına hiç gelinmez.

Bunun yerine yeni bir string oluştururuz. "K" ile metin[1:] dilimini + ile birleştiriyoruz. Hücre ne yazar?

Bir string oluşturulduktan sonra içeriği değişmez. Bu yüzden string’lere değiştirilemez (immutable) denir. String metotları da var olan değeri değiştirmez, yeni bir string döndürür.

lower(), upper() ve strip()

Metin karşılaştırmalarında büyük ve küçük harf farkı ve fazladan boşluklar sorun çıkarabilir. Bir string’in metodu, değerin arkasına nokta konarak çağrılır: girdi.strip(). Hücredeki iki satır ne yazar?

  • strip() baştaki ve sondaki boşlukları kaldırır.
  • lower() harfleri küçük harfe çevirir. Bunu, bütün diller için ortak olan Unicode kurallarına göre yapar (Unicode, bilgisayarların dünyadaki yazı sistemlerindeki karakterleri numaralandırdığı standarttır).
  • upper() aynı kurallarla harfleri büyük harfe çevirir.

Metni karşılaştırmadan önce böyle ortak bir biçime getirmeye normalleştirme denir.

Şu kod ne yazar?

Python yazar. lower() yeni bir string döndürür, ama bu sonuç hiçbir değişkene atanmadığı için kaybolur. metin eski değerini korur. Sonucu kullanmak için atama gerekir:

metin = metin.lower()

Türkçe I ve İ harfleri

Bilgisayarınızın dil ve bölge ayarı (yerel ayar) Türkçe olsa bile str.lower() ve str.upper() Türkçe kurallarını kullanmaz. İki metot da her dilde aynı çalışan Unicode dönüşümünü uygular. Türkçede noktalı ve noktasız i ayrı harfler olduğu için bu fark gerçek veride sorun çıkarır.

Dört satır ne yazar? Özellikle ikinci satırı düşünün.

İlk satır ekranda iğne gibi görünebilir, ama i harfinden sonra gizli bir karakter daha vardır: birleşen nokta (U+0307), yani önündeki harfin üstüne eklenen nokta işareti. Bu yüzden ikinci satır False yazar: iki metin gözle aynı görünse de eşit değildir. len("İĞNE".lower()) sonucu 4 değil 5’tir.

Üçüncü satır ısparta değil isparta, dördüncü satır İSTANBUL değil ISTANBUL yazar.

Türkçede ise dönüşümler şöyle olmalıdır:

  • I → ı
  • İ → i
  • i → İ
  • ı → I
Warning

casefold(), büyük ve küçük harfi önemsemeden karşılaştırma yapmak için lower()’dan daha kapsamlı bir Unicode metodudur. Ama Türkçeye özgü I ve İ sorununu o da çözmez. “lower() yerine casefold() yazarsam Türkçe sorunu biter” diye düşünmeyin.

Programınızın Türkçe büyük ve küçük harf kurallarına göre karşılaştırma yapması gerekiyorsa dönüşümü kendiniz yazabilirsiniz. Hücre hata vermeden biterse iki assert de geçmiştir:

Bu yardımcı fonksiyon önce Türkçeye özgü iki büyük harfi (I ve İ) kendisi küçültür, kalan harfler için de normal lower() kullanır.

Note

Bu fonksiyonu her metne uygulamayın. E-posta alan adları, değişken ve fonksiyon adları ya da uluslararası kodlar Türkçe kurallar yerine başka kurallar gerektirebilir. Önce verinin hangi dilin kurallarına göre karşılaştırılacağına karar verin, sonra dönüşümü seçin.

İncele ve düzelt: temizlenmiş kullanıcı adı

Aşağıdaki kod kullanıcı adını temizlemeye çalışıyor, ama metotların döndürdüğü değeri hiçbir değişkene atamıyor. Düzeltmeden önce çalıştırın: ne yazıyor?

Çıktının deniz olması için kodu düzeltin.

kullanici_adi = kullanici_adi.strip().lower() yazabilirsiniz.

kullanici_adi = "  DENIZ  "
kullanici_adi = kullanici_adi.strip().lower()

print(kullanici_adi)

in ile içerme kontrolü

Bir string’in başka bir string içerip içermediğini in ile kontrol edebiliriz. Üç satır ne yazar?

Sonuçlar bool türündedir.

“Bu parça metnin içinde geçiyor mu?” ile “Metin bu parçayla mı bitiyor?” iki ayrı sorudur. endswith() ikinci soruyu sorar, aşağıda ayrıca göreceğiz. Bu dosya adı için iki satır ne yazar?

Dosya uzantısını denetlerken işinize yarayan ikinci sorudur.

Warning

"@" in eposta ifadesinin True olması, metnin geçerli bir e-posta adresi olduğunu göstermez: "@@@" da bu kontrolden geçer. Basit bir kontrolü tam doğrulama sanmayın.

startswith(), endswith() ve replace()

Metnin başına ya da sonuna bakmak istiyorsanız in yerine bu iş için yazılmış metotları kullanın:

  • startswith(...): metin verilen başlangıçla mı başlıyor?
  • endswith(...): metin verilen sonla mı bitiyor?

İki satır ne yazar?

Metnin içindeki bir parçayı başka bir parçayla değiştirmek için replace() kullanılır. Sonuç yeni bir string’dir. Hücre ne yazar?

String’ler değiştirilemez olduğu için replace() de var olan string’i değiştirmez. Sonucu bir değişkene atamak gerekir.

split() ile parçalama, join() ile birleştirme

Bir metni parçalara ayırmak için split() kullanılır. Parçaları birbirinden ayıran karaktere (örneğin virgüle) ayraç denir. split() parçaları bir liste olarak döndürür: köşeli parantez içinde, virgülle sıralanmış değerler. Listeleri gelecek hafta ayrıntısıyla göreceğiz. Hücre ne yazar?

Argüman vermezsek split() metni boşluklardan böler. Yan yana birden fazla boşluk varsa bunları tek ayraç sayar. Hücre ne yazar?

Tersi için, yani parçaları bir ayraçla birleştirip tek bir string elde etmek için join() kullanılır. Bu hücre ne yazar?

join() çağrısında soldaki string, parçaların arasına konacak ayraçtır.

Important

split(",") içeriğini bildiğiniz basit metinlerde işe yarar. Gerçek CSV dosyalarında (değerlerin virgülle ayrıldığı tablo dosyaları) ise yanılabilir, çünkü bir alanın içinde de virgül ya da tırnaklı metin olabilir. 12. haftada bu iş için Python’ın csv modülünü kullanacağız.

String ve döngüler

Bir string üzerinde for ile karakter karakter gezebiliriz. Hücre kaç satır yazar?

Örneğin bir metindeki ASCII rakamlarını, yani 0–9 arasındaki rakamları sayalım. Karakterler de sayılar gibi >= ve <= ile karşılaştırılabilir. Hücre kaç yazar?

Python’da hazır .isdigit() metodu da vardır. Bu metot yalnız tek karakterde değil, bütün bir string’de de çalışır ve string’in rakamlardan oluşup oluşmadığını söyler. Dört satır ne yazar?

Note

.isdigit(), 0–9 dışındaki bazı Unicode rakamları için de True döndürebilir (örneğin üs olarak yazılan "²"). Programınız yalnızca 0–9 rakamlarını kabul edecekse "0" <= karakter <= "9" gibi açık bir kontrol bu kuralı doğrudan yazar. Hazır bir metodu seçmeden önce, 7. haftadaki gibi, fonksiyonunuzun sözleşmesinin (fonksiyonun ne beklediğini ve ne döndürdüğünü söyleyen not) hangi karakterleri kabul ettiğine bakın.

Ham metnin strip, lower, split ve join gibi işlemlerle adım adım dönüştürülmesi.

Metin işleme hattı

Alıştırma: belirli karakteri sayın

Bir ürün kodunda kaç tane - karakteri bulunduğunu sayın.

Beklenen sonuç 3’tür.

if karakter == "-": koşulu içinde tire_sayisi değerini artırın.

urun_kodu = "TR-55-A-20"
tire_sayisi = 0

for karakter in urun_kodu:
    if karakter == "-":
        tire_sayisi = tire_sayisi + 1

print(tire_sayisi)

f-string ile okunabilir çıktı

Tırnaktan önce f harfi yazılan string’e f-string denir. F-string, değişkenleri metnin içine yerleştirmenin okunaklı bir yoludur: değişkenler süslü parantezin içine konur. Hücre ne yazar?

Süslü parantezlerin içine ifadeler de yazılabilir. Bu kez ne yazar?

Sayıyı iki ondalık basamakla göstermek

2. haftadaki gezi hesabında kişi başı ücret 257.14285714285717 çıkmıştı. Bunu ekranda 257.14 TL biçiminde göstermeyi bu haftaya bırakmıştık. F-string içinde değişken adından sonra yazılan :.2f, sayıyı iki ondalık basamakla gösterir. İki satır ne yazar?

İlk satır Toplam: 257.14 TL yazar: fazladan basamaklar gösterilmez. İkinci satır Oran: 3.50 yazar: 3.5 iki basamağa tamamlanır.

Note

.2f yalnızca sayının nasıl gösterileceğini belirler. tutar değerini metne çevirirken iki basamakla yazar. Değişkenin bellekteki değeri değişmez ve kesin bir ondalık sayıya dönüşmez. 7. haftada testlerde tolerans kullanmamızın nedeni de buydu.

Bu derste f-string’i çoğunlukla ekrana yazdırırken kullanacağız. Uzun hesapları süslü parantezin içine yazmak yerine önce ayrı bir değişkende hesaplayın. Kod daha kolay okunur.

Fonksiyonlarla metin normalleştirme

Aynı temizleme adımlarını birçok yerde kullanacaksak onları bir fonksiyona koyabiliriz. Hücre hata vermeden biterse iki assert de geçmiştir:

Bu örnekteki kullanıcı adlarında Türkçeye özgü harf yok. Türkçe ürün, kişi ya da şehir adlarını büyük ve küçük harfi önemsemeden eşleştirecekseniz yukarıdaki I ve İ kuralını da hesaba katmalısınız.

Bu fonksiyon saftır: bir string alır, yeni bir string döndürür ve dışarıdaki hiçbir değeri değiştirmez.

Soruya dönelim: kayıt listesi Python’da

Bölümün başında kulüp başkanının kurallarını yazıp üç satırla denemiştiniz. Python’daki karşılıkları şöyle:

İş Sözde kodda Python’da Dikkat
Satırı parçalamak “Satırı virgüllerden ayır” parcalar = satir.split(",") Virgülün yanındaki boşluk parçada kalır: ikinci satırın numarası " 2306012 " olur
Giriş yılı (2. satır) “Numaranın ilk iki hanesini al” numara.strip()[:2] Boşluk temizlenmezse numara[:2] sonucu " 2" olur. [:2] iki karakter alır, çünkü bitiş hariçtir
Okul adresi (3. satır) “Adreste omu.edu.tr var mı bak” eposta.strip().endswith("@omu.edu.tr") in ile bakarsanız [email protected] da geçer. Kural “ile biten” diyor
Aynı kişi mi (1. ve 4. satır) “İki adı da küçük harfe çevir, karşılaştır” turkce_kucult(ad1.strip()) == turkce_kucult(ad2.strip()) lower() IŞIL adını işil, Işıl adını işıl yapar ve iki sonuç eşit çıkmaz. Sondaki boşluk da eşitliği bozar
Temiz satırı yazmak “Adı yaz, yanına giriş yılını yaz” yil = "20" + numara[:2], sonra f"{ad} ({yil} girişli)" Metotlar yeni string döndürür. ad.strip() yazıp sonucu atamazsanız yazdırılan ad temizlenmemiş kalır

Listenizi tabloyla karşılaştırın. Kurallarınızda “boşlukları sil” adımı yoksa ikinci satırın giriş yılı yanlış çıkar. Okul adresini “içinde geçiyor mu” diye sınadıysanız üçüncü satır kabul edilir. Adları “küçük harfe çevir” diye eşlediyseniz insan için aynı olan iki ad Python için farklı kalır: kural doğru, ama Python’ın küçültmesi Türkçe kurallara uymaz.

Üret: basit kurumsal e-posta kontrolü

Kulüp başkanının üçüncü kuralını bir fonksiyona dönüştürün. kurumsal_eposta_mi adlı fonksiyon:

  • Baştaki ve sondaki boşlukları temizlemeli
  • Metni küçük harfe çevirmeli
  • Metinde @ bulunup bulunmadığını kontrol etmeli
  • Metnin omu.edu.tr ile bitip bitmediğini kontrol etmeli

Başlangıç kodu:

Beklenen çıktı:

True
False
False

Örneğin temiz = eposta.strip().lower() ile başlayabilirsiniz. Sonra "@" in temiz ve temiz.endswith("omu.edu.tr") koşullarını and ile birleştirin.

def kurumsal_eposta_mi(eposta):
    temiz = eposta.strip().lower()
    return "@" in temiz and temiz.endswith("omu.edu.tr")

print(kurumsal_eposta_mi("  [email protected] "))
print(kurumsal_eposta_mi("[email protected]"))
print(kurumsal_eposta_mi("[email protected]"))
Note

Bu fonksiyon yalnızca ders için basitleştirilmiş bir kontroldür. Gerçek e-posta adresi doğrulaması için daha ayrıntılı kurallar gerekir.

Sıra sizde: kayıt satırını temizleyin

Kulüp başkanının bütün kurallarını tek bir satıra uygulayın. Program satırı üç parçaya ayırsın, her parçanın boşluğunu temizlesin, okul adresi değilse Kabul edilmedi yazsın, okul adresiyse adı ve giriş yılını Deniz Yılmaz (2023 girişli) biçiminde yazsın.

Programı bölümün başındaki dört satırla deneyin. Beklenen sonuçlar:

satir Beklenen
Işıl Kaya,2406044,[email protected] Işıl Kaya (2024 girişli)
Deniz Yılmaz, 2306012 ,[email protected] Deniz Yılmaz (2023 girişli)
Ali Can,2506101,[email protected] Kabul edilmedi
IŞIL KAYA ,2406044,[email protected] IŞIL KAYA (2024 girişli)

parcalar = satir.split(",") ile başlayın. Sonra ad = parcalar[0].strip() gibi her parçayı ayrı bir değişkene alın. Giriş yılı için numaranın ilk iki karakterini "20" ile birleştirin.

satir = "Deniz Yılmaz, 2306012 ,[email protected]"

parcalar = satir.split(",")
ad = parcalar[0].strip()
numara = parcalar[1].strip()
eposta = parcalar[2].strip().lower()

if eposta.endswith("@omu.edu.tr"):
    yil = "20" + numara[:2]
    print(f"{ad} ({yil} girişli)")
else:
    print("Kabul edilmedi")

Sınav provası

Önce kendi cevabınızı seçin, sonra cevap anahtarında her şıkkın neden doğru ya da yanlış olduğunu okuyun. Yanlış şıklar rastgele yazılmadı; bu konuda öğrencilerin gerçekten yaptığı hatalardan seçildi. Sınav soruları da aynı yolla hazırlanır.

Madde 1. "Python"[0] ve "Python"[-1] sırasıyla hangi karakterleri verir?

  • A. P ve n
  • B. P ve P
  • C. n ve P
  • D. y ve o
  • E. Hata verir; negatif indeks kullanılamaz

Madde 2. "Programlama"[0:7] sonucu nedir?

  • A. rogramla
  • B. Programl
  • C. Program
  • D. P
  • E. Programlama

Madde 3. "Python" metninin tamamını dilimle almak isteyen bir öğrenci şunu yazdı:

metin = "Python"
print(metin[0:len(metin) - 1])

Çıktı Pytho oluyor. Neden?

  • A. Bitiş zaten hariçtir, - 1 bir karakter daha keser
  • B. print() yazdırırken son karakteri kırpar
  • C. Dilimleme son karakteri hiçbir zaman alamaz
  • D. İndeksler 1’den başladığı için bir kayma oluşur
  • E. len() karakter sayısını bir eksik verir

Madde 4. Aşağıdaki program ne yazdırır?

metin = "  Ankara  "
metin.strip()
print(metin)
  • A. Boşlukları kırpılmış hâliyle Ankara
  • B. Boşluklarıyla birlikte Ankara
  • C. Boş bir satır; metin silinmiştir
  • D. Hata verir; strip() sonucu atanmalıdır
  • E. None

Madde 5. strip() neyi kaldırır?

  • A. Metnin sonundaki noktalama işaretlerini
  • B. Metnin içindeki bütün boşlukları, ortadakiler dâhil
  • C. Metnin ilk ve son karakterini
  • D. Metnin başındaki ve sonundaki boşlukları
  • E. Metindeki büyük harfleri

Madde 6. "İĞNE".lower() sonucu neden "iğne" ile her zaman eşit olmayabilir?

  • A. lower() Türkçe karakterlerle hiç çalışmaz
  • B. lower() metni değiştirmediği için sonuç aynı kalır
  • C. Karşılaştırma için == yerine is kullanılmalıdır
  • D. İĞNE bir string değil, bytes değeridir
  • E. lower(), Türkçedeki I / İ ayrımını gözetmez

Madde 7. Dosya adının gerçekten .pdf ile bittiğini sınamak için neden dosya.endswith(".pdf") tercih edilir?

  • A. in büyük/küçük harfe duyarlı değildir
  • B. endswith() daha hızlı çalışır
  • C. endswith() uzantıyı kendiliğinden düzeltir
  • D. in yalnızca listelerde kullanılır
  • E. in metnin herhangi bir yerinde de eşleşir

Madde 8. "a,b,c".split(",") ve ",".join(["a", "b", "c"]) sırasıyla ne döndürür?

  • A. "a,b,c" ve ["a", "b", "c"]
  • B. İkisi de "a,b,c"
  • C. ["a,b,c"] ve "abc"
  • D. ["a", "b", "c"] ve `“a,b,c”
  • E. İkisi de ["a", "b", "c"]

Madde 9. tutar = 12.3456 iken print(f"{tutar:.2f}") ne yazdırır?

  • A. 12.3456
  • B. 12.35
  • C. 12
  • D. {tutar:.2f}
  • E. 12.34

Madde 10. f"{tutar:.2f}" biçimlendirmesi neyi değiştirir, neyi değiştirmez?

  • A. Değişkenin değerini kalıcı olarak iki basamağa yuvarlar
  • B. Sayıyı tam sayıya çevirip ondalığı atar
  • C. Gösterimi değiştirir, tutarın değeri aynı kalır
  • D. Hiçbir şeyi değiştirmez; yalnızca okunabilirlik içindir
  • E. Değişkenin türünü stre çevirir

Madde 1. Doğru: A. İndeksler 0’dan başlar; -1 ise son karakteri gösterir.

  • B yanlış: -1 yazımında eksi işareti gözden kaçarsa iki indeks de baştan sayılır ve ikisi de ilk karakter sanılır. Ama -1 baştan değil sondan sayar.
  • C yanlış: İki karakter doğru bulunmuş ama sıraları karışmış: [0] sondan, [-1] baştan okunmuş. Oysa [0] ilk, [-1] son karakterdir.
  • D yanlış: Günlük hayatta saymaya 1’den başlandığı için [0] ikinci karakter, [-1] de sondan ikinci karakter sanılır. Bu [1] ve [-2] sonuçlarıdır; ilk indeks 0’dır.
  • E yanlış: Konum numarası eksi olamazmış gibi göründüğü için hata beklenebilir. Ama Python negatif indeksi kabul eder; negatif indeks metnin sonundan sayar.

Madde 2. Doğru: C. 0’dan 6’ya kadarki karakterler alınır; 7 numaralı karakter dilime girmez.

  • A yanlış: İki indeks de birer kaydırılarak, 1’den 8’e kadar sayılmış. Ama başlangıç 0 olduğu için ilk karakter de alınır ve bitiş 7’dir.
  • B yanlış: 0’dan 7’ye kadar denince 7 de dâhil sanılır. Ama bitiş indeksi dâhil değildir; sekiz değil yedi karakter alınır.
  • D yanlış: Köşeli parantez tek karakter almayla ilişkilendirildiği için yalnız ilk karakter beklenebilir. Bu [0:1] sonucudur; [0:7] yedi karakter alır.
  • E yanlış: Dilim yazımında metnin tamamı görünür ve dilimin metni değiştirmediği bilindiği için tamamı yazılır sanılabilir. Ama dilim yalnızca belirtilen aralığı verir.

Madde 3. Doğru: A. Dilimde bitiş indeksi dâhil edilmez. metin[0:6] zaten son karaktere kadar alır; - 1 yazmak son karakteri fazladan dışarıda bırakır. Doğru yazım metin[0:len(metin)] ya da kısaca metin[:]dir.

  • B yanlış: Eksik karakter çıktıda fark edildiği için sorun print()te aranabilir. Ama print() kırpma yapmaz; eksik olan dilimden gelir.
  • C yanlış: Bitişin hariç olduğunu yanlış genelleyen öğrenci son karakterin hiç alınamayacağını düşünebilir. Ama alabilir; bitiş indeksi doğru yazıldığında son karakter de gelir.
  • D yanlış: Bir karakterlik kayma, indekslerin 1’den başladığı izlenimini verebilir. Ama indeksler 0’dan başlar; kayma - 1den geliyor.
  • E yanlış: Son indeksin len() - 1 olduğunu öğrenen öğrenci len()in kendisinden şüphelenebilir. Ama len("Python") sonucu 6’dır; doğru sayıyı verir.

Madde 4. Doğru: B. strip() yeni bir string döndürür ama sonuç hiçbir yere atanmadığı için kaybolur. metin eski değerini korur. Doğru yazım metin = metin.strip()tir.

  • A yanlış: strip() çağrısı boşlukları kırptığı için en doğal beklenti budur. Ama string’ler değiştirilemez; metot değişkenin içeriğini yerinde değiştirmez.
  • C yanlış: strip() bir şeyleri kırptığı için metnin tamamen gittiği sanılabilir. Ama strip() yalnızca baştaki ve sondaki boşlukları kırpar; metni silmez.
  • D yanlış: Sonucun atanması gerektiğini bilen öğrenci atanmamasının hata vereceğini sanabilir. Ama atamamak hata vermez; sonuç yalnızca kullanılmadan atılır.
  • E yanlış: Sonucu atanmayan çağrının geride None bıraktığı düşünülebilir. Ama strip() bir string döndürür; burada yazdırılan zaten metinin kendisidir.

Madde 5. Doğru: D. strip() iki uçtaki boşluk türü karakterleri (boşluk, sekme, satır sonu) kırpar. Ortadaki boşluklara dokunmaz.

  • A yanlış: Kullanıcı girdisini temizlemek için kullanıldığından noktalamayı da sildiği sanılabilir. Ama varsayılan davranışta noktalama kaldırılmaz; "Evet.".strip() sonucu yine "Evet."tir.
  • B yanlış: Boşluk temizleme denince akla bütün boşluklar gelebilir. Ama ortadaki boşluklar korunur; "a b".strip() sonucu yine "a b"dir.
  • C yanlış: Metnin iki ucuyla çalıştığını bilen öğrenci uçtaki karakterlerin her durumda silindiğini düşünebilir. Ama uçtaki karakter boşluk değilse korunur.
  • E yanlış: strip() de lower() gibi girdiyi temizlemek için kullanıldığından görevleri karışabilir. Ama harf dönüşümü lower() ve upper() işidir.

Madde 6. Doğru: E. Türkçede noktalı ve noktasız i ayrı harflerdir; Unicode’un genel harf dönüşümü bu ayrımı gözetmez. Noktalı büyük İ küçültülünce beklenen i yerine i ile ayrı bir nokta işareti çıkar. casefold() de bu sorunu çözmez.

  • A yanlış: Bir Türkçe harfte sorun çıktığını duyan öğrenci bunu bütün Türkçe harflere genelleyebilir. Ama lower() Ğ gibi çoğu Türkçe harfte çalışır; sorun yalnızca I / İ çiftinde.
  • B yanlış: String’lerin değiştirilemez olduğunu öğrenen öğrenci lower()ın hiçbir etkisi olmadığını düşünebilir. Ama lower() yeni bir string döndürür; sorun, ortaya çıkan harfin hangisi olduğunda.
  • C yanlış: is İngilizce okunuşuyla bir eşitlik sözcüğü gibi göründüğü için akla gelir. Ama is nesne kimliğini sınar; metin karşılaştırmasında == doğrudur.
  • D yanlış: Türkçe harflerin bellekte farklı tutulduğunu duyan öğrenci türden şüphelenebilir. Ama tırnak içinde yazılan değer bir strdir.

Madde 7. Doğru: E. ".pdf" in dosya metnin herhangi bir yerinde arar; rapor.pdf.txt gibi bir ad bu denetimden geçer ama .pdf ile bitmez. endswith() yalnızca metnin sonuna bakar; aranan da zaten sondaki uzantıdır.

  • A yanlış: Metin karşılaştırmalarında harf farkı sık sorun çıkardığı için akla gelir. Ama in de büyük ve küçük harfe duyarlıdır; ikisi bu açıdan aynıdır.
  • B yanlış: Daha özel bir metodun daha hızlı olacağı düşünülebilir. Ama gerekçe hız değil, denetimin doğru yeri sınaması.
  • C yanlış: Uzantıyla ilgili bir metot olduğu için uzantıyı da düzelttiği sanılabilir. Ama düzeltme yapmaz; yalnızca True ya da False döndürür.
  • D yanlış: in çoğu örnekte bir koleksiyonla birlikte göründüğü için akla gelir. Ama in string’lerde de çalışır; sorun nerede aradığı.

Madde 8. Doğru: D. split() metni listeye böler; join() listeyi ayraçla birleştirip bir metin döndürür. İkisi birbirinin tersidir.

  • A yanlış: İki metot birbirinin tersi olduğu için hangisinin ne döndürdüğü kolayca karışır. Ama split() metni böler ve liste döndürür, join() listeyi birleştirir ve metin döndürür.
  • B yanlış: Ekrana yazdırıldığında iki değerde de aynı harfler ve virgüller göründüğü için ikisi aynı sanılabilir. Ama split() metin değil liste döndürür.
  • C yanlış: Virgülün ayraç olarak kullanıldığı gözden kaçarsa metin bölünmez ve birleştirmede araya bir şey konmaz sanılır. Ama split(",") virgüllerden böler; join() ise ayraç olarak virgülü araya koyar.
  • E yanlış: join() çağrısının içinde bir liste göründüğü için sonucun da liste olduğu sanılır. Ama join() liste değil metin döndürür.

Madde 9. Doğru: B. :.2f sayıyı iki ondalık basamakla gösterir ve gösterirken yuvarlar.

  • A yanlış: Biçimlendirmenin değişkeni değiştirmediği bilindiği için ekrana da tam değer yazılır sanılabilir. Ama değişken aynı kalsa da ekrana biçimlendirilmiş metin yazılır.
  • C yanlış: Biçimlendirme sayıyı sadeleştiriyormuş gibi düşünülürse ondalık kısmın tümüyle atıldığı sanılır. Ama .2f iki ondalık basamak ister; ondalık kısım atılmaz.
  • D yanlış: Süslü parantez de tırnağın içinde olduğu için olduğu gibi yazılır sanılabilir. Ama tırnaktan önce f olduğu için süslü parantezin içi hesaplanır.
  • E yanlış: İki basamak gösterilecekse fazlasının kesilip atıldığı düşünülür. Ama .2f keserek değil yuvarlayarak gösterir: üçüncü basamak 5 olduğu için ikinci basamak yukarı yuvarlanır.

Madde 10. Doğru: C. Biçimlendirme bir görüntüleme kararıdır. Yalnızca ekranda görünen metni değiştirir; tutar değişkeni olduğu gibi kalır ve sonraki hesaplar hâlâ tam değerle yapılır.

  • A yanlış: Ekranda iki basamak görüldüğü için değerin de öyle kaldığı sanılır. Ama biçimlendirme değişkene dokunmaz; yalnızca o anki çıktıyı biçimlendirir.
  • B yanlış: Biçimlendirmenin basamak attığını gören öğrenci ondalığın tümüyle gittiğini düşünebilir. Ama .2f ondalık kısmı iki basamakla korur.
  • D yanlış: Değişkenin değişmediğini bilen öğrenci biçimlendirmenin etkisiz olduğunu sanabilir. Ama gösterimi gerçekten değiştirir; değişmeyen şey değişkenin kendisidir.
  • E yanlış: F-string’in sonucu gerçekten bir str olduğu için akla yatkındır. Ama oluşan metin ayrı bir değerdir; değişken float kalır.

Tek sayfa özet

Bu hafta string’leri parçalara ayırdık, temizledik ve kontrol ettik.

  • String indeksleri 0’dan başlar.
  • Negatif indeksler sağdan sayar; son karakter metin[-1] ile alınabilir.
  • len() karakter sayısını verir.
  • Dilimlemede başlangıç dâhil, bitiş hariçtir.
  • String değerler değiştirilemez; metotlar yeni string döndürür.
  • strip(), lower() ve upper() metni karşılaştırmadan önce ortak bir biçime getirir. lower() ve upper() Türkçeye özgü I ve İ dönüşümünü yapmaz: "IŞIL".lower() sonucu "işil" olur.
  • casefold() büyük ve küçük harfi önemsemeyen karşılaştırmalarda işe yarar ama Türkçe I ve İ sorununu çözmez.
  • in bir parçanın metnin herhangi bir yerinde geçip geçmediğine bakar; startswith() ve endswith() yalnızca başa ya da sona bakar.
  • replace() bir parçası başka bir parçayla değiştirilmiş yeni bir string döndürür.
  • split() metni parçalara ayırır, join() string parçaları bir ayraçla birleştirir.
  • for ile bir string’in karakterleri tek tek gezilebilir; .isdigit() bir string’in rakamlardan oluşup oluşmadığını söyler.
  • F-string değişkenleri metnin içine yerleştirir; :.2f sayıyı iki ondalık basamakla gösterir.
  • Tekrarlanan temizleme ve kontrol adımları bir fonksiyona konabilir.
  • Gerçek veride bir satır çoğu zaman birkaç adımda temizlenir: önce split(), sonra her parçada strip(), en son karşılaştırma.

Bir sonraki bölümde birden fazla değeri birlikte tutmak için listeler ve demetler kullanacağız.

Bu bölümün kazanımları

Bu bölümü bitiren öğrenci:

  • İndeks ve negatif indeksle karaktere erişir.
  • Dilimlemede başlangıcın dâhil, bitişin hariç olduğunu hesaba katarak dilim alır.
  • String’in değiştirilemez olduğunu ve metotların yeni string döndürdüğünü açıklar.
  • strip(), lower() ve upper() ile normalleştirir; Türkçe I / İ sınırını açıklar.
  • in, startswith() ve endswith() denetimlerini ayırt eder.
  • split() ve join() ile metni parçalar ve birleştirir.
  • F-string ile biçimlendirir ve :.2f davranışını açıklar.
Back to top