Python'da //= ne ise yariyor?

Bir ornek vermek gerekirse;

sayı = input("Sayı:")
basamak_sayisi = len(sayı)
sayı = int(sayı)
basamak = 0
toplam = 0

gecici_sayı = sayı

while (gecici_sayı > 0):
    
    basamak = gecici_sayı % 10
    
    toplam += basamak ** basamak_sayisi
    
    gecici_sayı //= 10
    

if (toplam == sayı):
    print(sayı,"bir armstrong sayısıdır.")
else:
    print(sayı,"bir armstrong sayısı değildir.")
1 Beğeni

https://python-istihza.yazbel.com/islecler.html#deger-atama-islecleri

2 Beğeni

Peki kodu aciklayabilir misiniz? Biraz kafami karistirdi calisma mantigi. //= icin degil, genel olarak.

Operatörler yazdığımız programlarda verileri çeşitli amaçları gerçekleştirmek için kullanabilmemizi sağlıyor. Farklı operatör türleri var. Burada senin sorduğun operatör ise değer atama operatörlerinden.

= operatörü değişkene bir değer atamak için kullanılıyor. Mesela a = 12 gibi bir kod yazdığında artık program içerisinde a değişkenini kullandığın yerde aslında 12 değerini kullanmış oluyorsun.

= operatörünü aritmetik işlem operatörleri (+, -, *, /, //, %) ile bitişik kullanırsan, işlemi yaptıktan sonra bulunan sonucu değişkene atamış olursun.

Az önceki örnekte a değişkeninin sakladığı değer 12 idi. Eğer programında ilerleyen satırlarda a /= 5 yazarsan Python, a nın değeri olan 12’yi 5’e böler ve bulduğu sonucu a’ya yeni değer olarak atar. Yani a’nın değerini 2.4 olarak günceller.

//= operatörü ise taban bölme yaparak bölümün sadece tam sayı kısmını değişkene atar. Az önceki örnekte 12 //= 5 yapmış olsaydık a’nın yeni değeri 2.4 değil, 2 olacaktı.

Aşağıdaki kodları çalıştırarak sonuçları gözlemleyebilir, https://python-istihza.yazbel.com/ adresinden bu tarz soruların cevaplarını fazlasıyla bularak kendine Python dili için iyi bir temel atabilirsin. Benim hayatımda gördüğüm bir programlama diliyle ilgili yazılmış en açıklayıcı kitap Python İstihza belgeleri. :slight_smile:

a = 12         # a değişkenine 12 değeri atandı
print("1. durumda a'nın değeri:", a)

a /= 5         # a'nın değeri 5'e bölündü ve bulunan sonuç a'ya atandı.
print("2. durumda a'nın değeri:", a)

a = 12         # a'ya tekrar 12 değeri atandı
print("3. durumda a'nın değeri:", a)

a //= 5        # a'nın değeri 5'e bölündü ve bulunan sonucun sadece tam sayı kısmı a'ya atandı.
print("4. durumda a'nın değeri:", a)
1 Beğeni

Aslında arkadaş koddaki algoritmayı anlamadığını belirtmiş en son.

3 Beğeni

Evet. Ornegin 153 sayisini bu kod ile test ederken. 3. dongude gecici_sayi = 1 oluyor ve islem benim icin orada tikaniyor. Sonuca gore toplam degerine +1 ekliyor gecici_sayi = 1 ile gerceklesen dongu. Ama nasil oluyor bu?

Programı çalıştırıp klavyeden 153 girdiğinde

basamak_sayisi = 3
sayi = 153
gecici_sayi = 153

oluyor.
İnternetten baktığım kadarı ile bir sayının Armstrong sayısı olabilmesi için her basamağındaki rakamın, o sayının basamak sayısı kadar üssü alınıp toplandığında kendisine eşit olması gerekiyor. Yani 153 sayısını test etmek için her bir basamağını tek tek ele alacağımız için toplamda 3 kez döngüye girmemiz lazım, yada 1453 sayısını inceleseydik her bir basamağını incelemek için toplamda 4 kez döngüye girmiş olacaktık. Bunu sağlamak için gecici_sayi //= 10 işlemi kullanılarak her seferinde gecici_sayi 10’a bölünüp bölümün tam sayı kısmı alınmış. Mantıklı, döngü içine girerek deneyelim…

gecici_sayi //= 10   # 1. TUR: 153 //= 10 işlemi sonucunda gecici_sayi = 15 olur
gecici_sayi //= 10   # 2. TUR: 15 //= 10 işlemi sonucunda gecici_sayi = 1 olur
gecici_sayi //= 10   # 3. TUR: 1 //= 10 işlemi sonucunda gecici_sayi = 0 olur

while içerisindeki koşul gereği gecici_sayi nın son değeri 0’dan büyük olmadığı (sıfıra eşit) için artık döngüye girmiyor. Yani gecici_sayi //= 10 işlemi, kullanıcının klavyeden girdiği sayının basamak sayısı kadar döngüye girilmesini sağlıyor. Tabi döngü içerisindeki her adımda gecici_sayi nın 10 ile bölümünden kalan hesaplanarak o anki sayının 1’ler basamağındaki rakam “basamak” değişkenine atanıyor. Böylece sırasıyla 153 sayısı için 3’ü, 5’i, ve 1’i alıp bunların tek tek 3. kuvvetini alıp toplam değişkenine ekleyerek atayabiliyoruz. Kodları daha iyi anlamak için aralara print fonksiyonu ekleyebilirsin.

sayı = input("Sayı:")
basamak_sayisi = len(sayı)
sayı = int(sayı)
basamak = 0
toplam = 0
tur = 1

gecici_sayı = sayı

print(sayı, "SAYISI İNCELENİYOR...!")

while (gecici_sayı > 0):
    print(tur, ". TUR")
    
    basamak = gecici_sayı % 10
    print("İncelenen basamak:", basamak)

    toplam += basamak ** basamak_sayisi
    
    print("//= işleminden önce geçici_sayı:", gecici_sayı)
    gecici_sayı //= 10
    print("//= işleminden sonra geçici_sayı:", gecici_sayı)
    print()

    tur += 1
    

if (toplam == sayı):
    print(sayı,"bir armstrong sayısıdır.")
else:
    print(sayı,"bir armstrong sayısı değildir.")

İstersen bu problemi daha farklı yollarla da kendin çözmeyi deneyebilirsin. Böylece pratiğini geliştirirsin. Mesela ben şöyle bir yöntem denedim,

sayı = input("Sayı:")
basamak_sayisi = len(sayı)
basamak = 0
toplam = 0

for basamak in sayı:
  toplam += int(basamak) ** basamak_sayisi

if (toplam == int(sayı)):
    print(sayı,"bir armstrong sayısıdır.")
else:
    print(sayı,"bir armstrong sayısı değildir.")

Kodları anladıktan sonra mesela şunu deneyebilirsin, 1’den kullanıcının girdiği sayıya kadarki tüm sayıların Armstrong sayı olup olmadığını ekrana bastıran bir program geliştirebilirsin. Böylece döngüleri iç içe de kullanmış olursun.

3 Beğeni

Cok tesekkurler aciklamalar icin.

Bir sorum daha olacak, ikinci kodda basamak degerine bir artis komutu ya da bir formul yazmamamiza ragmen nasil sorunsuz calisiyor? Hep 0 olarak islemiyor belli ki.

Kardeş sorunu tam olarak anlayamadım. İkinci koddan kastın tam olarak nedir acaba?

Cevabin gecikmesinden dolayi kusura bakmayin.

Onceki mesajda atilan ikinci kod orneginden bahsediyordum.

basamak_sayisi = len(sayı)
basamak = 0
toplam = 0

for basamak in sayı:
  toplam += int(basamak) ** basamak_sayisi

if (toplam == int(sayı)):
    print(sayı,"bir armstrong sayısıdır.")
else:
    print(sayı,"bir armstrong sayısı değildir.")```

basamak 0 haliyle alsa kullanilmiyor, yukaridaki satir yanlis yonlendirmis.

1 Beğeni

Evet aib haklı, o satırı orada unutmuşum. Senin kodları düzenleyip kendimce birşeyler yapmaya çalışırken gözümden kaçmış.

sayı = input("Sayı:")
basamak_sayisi = len(sayı)
# basamak = 0 BURASI GEREKSİZ
toplam = 0

for basamak in sayı:
  toplam += int(basamak) ** basamak_sayisi

if (toplam == int(sayı)):
    print(sayı,"bir armstrong sayısıdır.")
else:
    print(sayı,"bir armstrong sayısı değildir.")
1 Beğeni
if (toplam == int(sayı)):
    print(sayı,"bir armstrong sayısıdır.")
``` Bu kısımda "int(sayı)" demezsek ne olur?

toplam yukarıda 0 olarak tanımlanmış bir int. sayı da input fonksiyonunun döndürdüğü bir str. Eğer sayı’yı int’e çevirmeden toplam ile karşılaştırırsak sonuç hep False olacaktır.