metin=input("Metni girin:")
aranacak=input("Aranacak kelime nedir?: ")
for i in range(len(metin)):
if i == metin.index(aranacak, i):
print(i)
kodunda sorunla karşılaşıyorum.
Bir karakter dizisi için bir harfı ya da karakteri arattığımda, doğru çıktıyla birlikte ValueError hatası alıyorum. Örneğin
““portakal orda kal””
karakter dizisinde
“k”
harfinin kaçıncı sıralarda geçtiğini arattığımda:
5
14
Traceback (most recent call last):
File “/home/orion/Dropbox/PROGRAMLAMA/Python_Projects/Python-3_F_Ozdil_Notlar/bolum_18_karak_diz_devam.py”, line 104, in
if i == metin.index(aranacak, i):
ValueError: substring not found
Bu problemi try… except… bloğuna almadan nasıl çözerim?. Problem nereden kaynaklanıyor.?
şeklinde değiştirirseniz sorunun bir kısmı çözülür.
Sorunun geri kalan kısmı şununla alakalı; Bir harfin metin içerisinde hangi sıra değerlerinde olduğunu yukarıda yazdığım satır hesaplayamaz. Sadece aranan harfin metin içerisindeki ilk indeks değeri ekrana bastırılır, diğer indeks değerleri ekrana bastırılmaz.
Sizin örneğinizde 5 ve 14. indeks değerlerinin ekrana yazdırılmasının sebebi ValueError hatası veren şu kodu yazmanız:
if i == metin.index(aranacak, i):
Bu satırı aşağıdaki gibi değiştirirsek sorun çözülür.
Ama hala anlamadım. Verdiğim kodlar. Boşluk olmayan karakterlerde çalışıyor (zaten kitap da bu kodu kullanmış.). Ayrıca index(aranacak,i) ile verilen parametre, “i. karakter dahil olmak üzere aramaya başla” olarak emir verdiğinden o anda döngüdeki i. karakter ile arama sonucunun eşit olup olmadığına bakıyor ve eşitse o karakteri yazıyor. Yani mantık hatası bulamadım. Yani Python bunu nasıl yanlış algılıyor.? Ayrıca neden boşluksuz karakter dizini için hata vermiyor?
Size örnek üzerinde programın neden hata verdiğini anlatmaya çalışayım:
# İki tane karakter dizisi tanımlayalım:
x = "Merhaba Dünya"
y = "Dünya"
print(x.index(y))
# Bu kod "Dünya" stringinin kaçıncı indekste başladığını verir.
print(x.index(y, 1))
# Bu kod da "Dünya" stringinin kaçıncı indekste başladığını verir.
print(x.index(y, 2))
# Aynı şekilde bu kod da "Dünya" stringinin kaçıncı indekste başladığını verir.
# Ancak "Dünya" stringi 8. indekste başlamışsa;
# Biz bu 2. parametreye en fazla 8 rakamını yazabiliriz.
# 8'den sonraki sayılar ValueError: substring not found hatası verir.
print(x.index(y, 9))
# Ancak eğer şöyle bir karakter dizisi tanımlamış olsaydık:
x2 = "Merhaba Dünya Dünya"
y2 = "Dünya"
print(x2.index(y2, 10))
# Bu sefer hata vermeyecekti. Çünkü "Dünya" stringi hem 8. hem de 14. indekste başlıyor.
# Dolayısıyla 14'den büyük bir rakam girersek yine aynı hatayı alırız.
# Bu ikinci parametre kısmına ilk stringin başladığı değerden daha küçük
# bir sayı yazarsanız, sonuç ilk stringle ilgilidir.
# Ancak ilk string'in başladığı indeks değerinden büyük bir sayı yazarsanız
# Bu sefer de sonuç ikinci stringle ilgili olur.
Şimdi gelelim sizin neden hata aldığınıza:
Siz for döngüsüyle metnin içindeki bütün indeks değerlerini kullanıyorsunuz, “i” değeri döngü içinde sürekli değişiyor. Ve öyle bir an geliyor ki, i’nin sayısal değeri aradığınız harfin indeks değerinden fazla oluyor. ValueError hatası almanızın sebebi bu.
Şimdi anladım. Lakin kitapta (sf.286) verilen kod biçimi genel bir çözüm sunmuyor. Şunu anladım:
eğer aradığımız harf aranan karakter dizinin son teriminde bulunuyorsa o kitapta verilen for döngüsü hata vermeden tamamlanıyor. Değilse ValueError veriyor. Belki bu kısım düzeltilebilir. Ya da bir uyarı ile okuyucu bilgilendirilir. Neyse…