Değişkenin nerede tanımlanacağını ve pythonun bunu satır satır nasıl yorumladığını açıklayabilir misiniz?


Merhaba. burada şunu sormak istiyorum: toplam değişkenini ilk döngüye değil de en dışarıya tanımladığımda boş küme, ikinci döngünün altına tanımladığımda not defined hatası alıyorum. kodun bu kısmını yorumlayamadım. neden mutlaka ilk döngünün altında yazmam gerekli. acaba python bunu satır satır nasıl yorumluyor açıklayabilir misiniz ?

mukemmel_sayilar= []
for i in range(1, 10):
    toplam = 0
    for j in range(1, i):
        if i % j == 0:
            toplam += j
    if toplam == i:
            mukemmel_sayilar.append(i)
print(mukemmel_sayilar)

Bu orjinal kodumuz, doğru şekilde çalışan yani. Ama ben aralığı 1,1000 yerine test etmesi kolay olsun diye 1,10 yaptım. Yani radarımıza yalnızca 6 rakamı takılacak. Şimdi burada ne yapıyor?

for i in range(1, 10):

i’yi 1 ile 10 arasında döndürmeye başladık.

    for j in range(1, i):
        if i % j == 0:
            toplam += j
    if toplam == i:
            mukemmel_sayilar.append(i)

i 1’den 10’a kadar gidene kadar her seferinde bu bloğun üzerinden geçiyor. yani i 1 olduğunda:

# anlaşılması adına, i yerine 1 değerini koydum

for j in range(1, 1):
        if 1 % j == 0:
            toplam += j
    if toplam == 1:
            mukemmel_sayilar.append(1)

oluyor. Bu da şu demek, eğer j 1 ile 1 (yani i) aralığında ise, ki değil, toplam değişkenine j değerini ekle diyoruz. Ama j in range(1, 1) False değer döndüreceği için ilk if bloğumuza girmiyoruz. Sonrakine gidiyoruz. Eğer toplam değişkenimiz 1’e (yani i’ye) eşitse, mukemmel_sayilar değişkenimize i’yi ekle diyoruz. Ama toplam değişkenimiz henüz 0.

Artık i değişkenimiz 1 olarak başladığı görevini sonlandırabilir.

Sıra 2’ye geliyor. Artık j in range(1, 2) ifadesi True değer döndürüyor. O yüzden

        if i % j == 0:
            toplam += j

bloğuna giriyoruz. Ancak i % j == 0 ifadesi True değer verse bile, toplam += j işlemi henüz toplam değişkenimizi i ile aynı değere getiremiyor. Yani

if toplam == i: ifadesi True değer döndürmedği için, çünkü şu an i==2 ve toplam==1, mukemmel_sayilar.append(i) işlemini sağlayacak bloğa girmiyoruz.

i 3’e geliyor, 4’e geliyor, 5’e geliyor ve 6 olana kadar hepsinde aynı şey oluyor çünkü toplam değişkeni i 6 olana kadar i’ye eşit olmuyor.

Peki i 6 olduğunda ne oluyor? Her zamanki gibi toplam değişkenimize 0 değerini atıyoruz. for j in range(1, 6): ifadesi True değer döndürüyor, öyleyse o bloğa giriyoruz. if 6 % j == 0: diyor, doğru mu, doğru. Öyleyse o bloğa da giriyoruz. toplam += j diyor. Öyleyse 0 olan toplam değişkenimiz şu an j’nin değeri olan 1’i kendisine ekledi. toplam artık 1.

# 6 i'nin mevcut değeri oluyor

for j in range(1, 6):
        if 6 % j == 0:
            toplam += j

bloğu tekrar çalışıyor ama

if toplam == i:
        mukemmel_sayilar.append(i)

bloğuna henüz giremiyoruz çünkü toplam hala i’ye eşit değil.

Öyleyse j’yi arttırmaya devam. j 2 oluyor. i’nin yani 6’nın 2’ye bölümünden kalan 0’dır diyor, doğru mu, doğru. Öyleyse toplam+= j yapıyoruz.

Ardından bakıyoruz, if toplam == i: True döndürüyor mu, döndürmüyor çünkü toplam değerimiz 3.

O zaman j’ uğrayacağı başka kod kalmadığı için 3 oluyor. if i % j == 0: doğru mu, doğru. Çünkü 6’nın 3’e bölümünden kalan 0’dır. Öyleyse altındaki bloğa giriyoruz, toplam += j. 3 olan toplam değerimize j’yi ekledik, yani toplam artık 6.

Öyleyse artık şu if bloğuna girebiliriz:

    if toplam == i:
            mukemmel_sayilar.append(i)

Böylece mukemmel_sayilar listemize 6 değeri ekleniyor. Daha sonraki değerlerin hiçbirinde (yani 1 ile 10 arasındaki) toplam i ye eşit olmuyor. Bu, işler yolunda gittiğinde olan süreç.

Şimdi sorduğunuz iki sorunun ikincisinden başlayalım. toplam değişkenini ikinci döngünün bloğunda tanımladığınızda, o artık for j in range(1, i): bloğuna ait oluyor, o scope’da kalıyor. Yani if toplam == i: o değişkene ulaşamıyor. Hal böyle olunca da Python “ben böyle bir değişken tanımıyorum” diyor.

Peki toplam en tepede, yani global scope’da tanımlanırsa ne oluyor? Bu sefer, i 1’den 10’a gidene kadar,

        if i % j == 0:
            toplam += j

koşulu sağlandığı sürece, toplam değişkenimize i’yi ekliyor da ekliyor. Bu durumda, i 6 olduğunda daha önceki değerler de toplama eklenmiş olduğu için

if toplam == i:
            mukemmel_sayilar.append(i)

koşulunu sağlayamıyoruz ve mükemmel sayılar listemiz bomboş kalıyor.

düzenlemeler: Bazı kafa karıştırıcı ifadelerin ve yazım hatalarının düzeltilmesi.

Teşekkürler hocam oldukça açıklayıcı olmuş.

1 Beğeni

Yukarıdan aşağı doğru yorumluyor.

Bu durumda toplam değişkenine dıştaki döngü her çalıştığında 0 atanmadığı için kodun çalışma şekli değişir, farklı bir sonuç almanız normal.

Bir değişkeni, ona değer atamadan önce kullanmaya çalışırsanız bahsettiğiniz not defined hatasını alırsınız. toplam += j ifadesi de toplam değişkenini kullanıyor, toplam = toplam + j’den bir farkı yok.

1 Beğeni