Continue ifadesi döngüyü neden başa almıyor?

şöyle bir kod yazdım

from random import randint
  
  üretilen_sayı = randint(1,100)`Önceden biçimlendirilmiş yazı`
  
  tahmin_hakkı = 10
  
  söylenen_sayılar = set()
  
  print("""
  
  x----------------------------------------x
  
  x                                        x  
  
  x   Sayı Tahmin Oyununa Hoşgeldiniz.     x
  
  x                                        x
  
  x   çıkmak için 0'a basınız.            x  
  
  x                                        x          
  
  x----------------------------------------x
  
  """)
  
  while True:
  
      try:
  
          tahmin = int(input('Tahmininizi giriniz: '))
  
      except ValueError:
  
          print('\nLütfen bir sayı giriniz.\n')
  
          continue
  
     
  
      if tahmin < 0:
  
          print('\nLütfen (-) değer girmeyiniz.\n')
  
      elif tahmin == 0:
  
          print('Çıkış yapılıyor...')
  
          print('Çıkış yapıldı.')
  
          break
  
      elif tahmin < üretilen_sayı:
  
          for i in söylenen_sayılar:
  
              if tahmin == i:
  
                  print(i, 'sayısını zaten söylediniz.')
  
                  continue
  
          print('\nDaha büyük sayı giriniz.')
  
          tahmin_hakkı -= 1
  
          söylenen_sayılar.add(tahmin)
  
          print('Kalan tahmin hakkınız:', tahmin_hakkı, '\n')
  
          if tahmin_hakkı < 1:
  
              print('Tahmin hakkınız bitti sayımız: ',üretilen_sayı, '\n')
  
              tahmin_hakkı = 10
  
             
  
      elif tahmin > üretilen_sayı:
  
          for i in söylenen_sayılar:
  
              if tahmin == i:
  
                  print(i, 'sayısını zaten söylediniz.')
  
                  continue
  
          print('\nDaha küçük sayı giriniz.')
  
          tahmin_hakkı -= 1
  
          söylenen_sayılar.add(tahmin)
  
          print('Kalan tahmin hakkınız:', tahmin_hakkı, '\n')
  
          if tahmin_hakkı < 1:
  
              print('Tahmin hakkınız bitti sayımız: ',üretilen_sayı, '\n')
  
              tahmin_hakkı = 10
  
     
  
      else:
  
          print('Doğru tahmin ettiniz.')

ve continue satırlarında döngünün başa dönmesini ve alttaki satırları çalıştırmamasını bekliyorum ama alttaki satırlarda çalışıyor nedenini bilen var mı acaba.

from random import randint
from os import system
  
üretilen_sayı = randint(1,100)
tahmin_hakkı = 12
soylenen = []  
menu = ("""
  
  x----------------------------------------x
  
  x                                        x  
  
  x   Sayı Tahmin Oyununa Hoşgeldiniz.     x
  
  x   0 ile 100 arasında bir sayı          x
  
  x   Çıkmak için 0'a basınız.             x  
  
  x                                        x          
  
  x----------------------------------------x
  
  """)

print(menu)

while True:
    try:
        tahmin = int(input('Tahmininizi giriniz: '))  
    except ValueError:
        system("cls||clear")
        print('\nLütfen bir sayı giriniz.\n')
        continue
    if tahmin == 0:
        system("cls||clear")
        print('Çıkış yapılıyor...')
        break
    elif tahmin in soylenen:
        system("cls||clear")
        print('\nBu sayıyı daha önce girdiniz.\n')
        continue
    elif tahmin < üretilen_sayı:
        if tahmin < 0:
            system("cls||clear")
            print("0 ile 100 arasında bir sayı giriniz.\n")
            continue
        system("cls||clear")
        print('\nDaha büyük sayı giriniz.')
        tahmin_hakkı -= 1
        soylenen.append(tahmin)
        print('\nKalan tahmin hakkınız:', tahmin_hakkı, '\n')
        if tahmin_hakkı < 1:
            system("cls||clear")
            print('Tahmin hakkınız bitti sayımız: ',üretilen_sayı, '\n')
            input("Tekrar oynamak için enter'a basınız.")
            tahmin_hakkı = 12
            system("cls||clear")
            print(menu)
    elif tahmin > üretilen_sayı:
        if tahmin > 100:
            system("cls||clear")
            print("0 ile 100 arasında bir sayı giriniz.\n")
            continue
        system("cls||clear")
        print('\nDaha küçük sayı giriniz.')
        tahmin_hakkı -= 1
        soylenen.append(tahmin)
        print('\nKalan tahmin hakkınız:', tahmin_hakkı, '\n')
        if tahmin_hakkı < 1:
            system("cls||clear")
            print('Tahmin hakkınız bitti sayımız: ',üretilen_sayı, '\n')
            input('Tekrar oynamak için enter tuşuna basınız.')
            tahmin_hakkı = 12
            system("cls||clear")
            print(menu)
    else:
        print('\nDoğru tahmin ettiniz.')

cevapladığınız için teşekkür ederim kodlar çalışıyor rica etsem nasıl çalıştığını ve eklediğiniz satırların ne işe yaradığını anlatabilir misiniz ?

Bunun yerine normal boş bir liste oluşturdum. Ve eğer kullanıcıdan aldığımız input da bir sorun yoksa aldığımız inputu bu listeye ekledik. Sizin kodunuzda “sayı söylendi mi” kontrolu elif in içindeyken ben bu kontrolu elif içine girmeden ayrı bir elif oluşturarak yaptım.

Temel değişiklikler bunlardı. Diğer şeyleri de göze daha güzel gözükmesi için yaptım.
Umarım yardımcı olabilmişimdir.

Teşekkür ederim yardımcı oldunuz ve benim anlamadığım bir nokta kaldı elif içindeki continue döngüyü başa almıyor continue ifadesini break ile değiştirdim yine komut çalışmadı acaba python bu kısmı neden çalıştırmıyor.

Oradaki continue for döngüsündeki döngüyü bir defa atlamaya yarıyor. Döngüden çıkmıyor bile. Döngüden çıkmak için break kullanılabilir ama for döngüsünden çıksak bile elif in içinde olduğumuz için for döngüsünden sonraki satırları çalıştırıyor. elifin içinden çıkmak içinse farklı metotlar var. İnternetten araştırabilirsiniz.

continue, en içerideki for (veya while) döngüsünü etkiliyor. Yani şu kısımda

tahmin’in değeri i’ye eşit olup da continue çalıştığında for i in söylenen_sayılar döngüsüne “devam et” sinyali veriliyor. Aslında anlıyoruz ki o continue orada olmasa da bir şey değişmez zira döngü zaten devam etmek üzere o noktadan sonra.

Sizin istediğiniz ise en dışarıdaki while True döngüsünün devam ettirilmesi. Fakat Python dışarıdaki bir döngüyü içeriden continue ile devam ettirmeyi (veya break ile kırmayı) desteklemiyor. Bunun için kenarda başka bir (boolean) değişken tutup onun doğruluk değeri ile oynayıp, içerideki döngü bittiğinde kontrol etmek gibi bir çözüm getirilebilir.

Ama sizdeki durumda daha direkt bir çözüm söz konusu. Dikkat ederseniz kod tekrarı var kullanıcının halihazırda söylenmiş olan bir sayıyı söylemesi durumunda:

(bu arada satırlar arasındaki boş satırlar okunabilirliği azaltıyor, onları kaldırmak isteyebilirsiniz…)

Şimdi bu konuya el atmadan şuraya bir bakalım:

Buradaki if ve elif’le ne yapıyorsunuz? Bir nevi kullanıcının girdiği değerin işlemeye değer olup olmadığını kontrol ediyorsunuz değil mi? Negatifse tekrar sor, sıfırsa programı sonlandır gibi. Yani üretilen_sayı burada henüz işin içinde değil çünkü input validasyonu yapılıyor.

O zaman bu yukarıdaki “kullanıcı halihazırda söylenen bir sayıyı söylediyse tekrar sor” kısmını da buraya alsak olmaz mı? Benzer bir amaca hizmet ediyorlar zira. O zaman buraya bir elif koyalım ve tahmin değeri söylenen_sayılar’ın içerisinde mi diye baksın: öyleyse tekrar sormaya yönlensin program.

söylenen_sayılar’ı bir set ile tutuyorsunuz: bu doğru seçimdir, listeye dönüştürmeye gerek yok; listede eleman varlığının kontrolü linear zamanlıdır, set’te ise sabit zamanlıdır veri yapısından ötürü. Ama siz bu avantajı kullanmıyorsunuz for kullanarak! Demek istediğim, şu kısım

for i in söylenen_sayılar:
    if tahmin == i:
        print(i, 'sayısını zaten söylediniz.')

set kullanmanın avantajını yok ediyor; şöyle yazmak gerekir

if tahmin in söylenen_sayılar:
    print(f"{tahmin} sayısını zaten söylediniz.")

Şimdi başa dönersek… Kodunuzu şöyle revize edebilirsiniz:

while True:
     tahmin = try-except(input(...))

     if tahmin < 0
        "negatif değer uygun değil"

     elif tahmin == 0
         "program sonlandırılıyor"

     elif tahmin in söylenen_sayılar
        "tahmin'i söylediniz zaten"

     elif tahmin < üretilen_sayı:
          "biraz yükseltin"
          söylenen_sayılar'a tahmin eklenir
          tahmin hakkı bir azaltılır

     elif tahmin > üretilen_sayı:
          "biraz düşürün"
          söylenen_sayılar'a tahmin eklenir
          tahmin hakkı bir azaltılır

     else
         "bildiniz"

Böylelikle sadece 1 continue ve 1 break ile iş tamam olur:

  • continue, try-except’ten sonra uygun girdi alınana kadar devamlılığı sağlar,
  • break ise girdi 0 olduğunda döngüyü sonlandırmaya yarar.

Bu ikisi de direkt while True döngüsünü etkilerler çünkü artık içeride başka bir döngü kalmadı.

1 Beğeni

Anladım teşekkür ederim.

Gayet açıklayıcı şekilde anlattığınız için teşekkür ederim.

1 Beğeni

*while True döngüsünün içerisinde olduğu için

*iç içe döngülerde, içeridekilerden birindeyken dışarıdaki bir döngüden çıkmak

2 Beğeni