Bu iki mükemmel sayı kodundaki fark ne?

Merhaba,

İlk kodda, fonksiyondan toplam == sayı ifadesi dönüyor. Bu ifade True veya False değeri alır. 9. satırda da if mük(i) gibi bir ifade görüyorsunuz. Burada mük fonksiyonunun True veya False döndürüp döndürmediği sorgulanıyor. Dönen değer True ise, ekrana yazı yazdırılıyor.

İkinci kodda da fonksiyondan toplam == sayı ifadesi dönüyor. Ancak fonksiyon sonlanmadan önce, sayının mükemmel sayı olduğunu ekrana yazdırıyorsunuz. Oysa toplam, sayıya eşitse print ifadesinin çalışması lazım.

1 Beğeni

Fonksiyonda return yerine if yazarsan ve printini de if bloğuna yazarsan olacak.

1 Beğeni

Ben önceden True yazmasam bile False demediğim için True oluyor o zaman return toplam==sayı diyince. if 'in otomatik olarak öyle bir işlevi olduğunu da bilmiyordum teşekkür ederim.

@sonsuz @dildeolupbiten Pycharmla ilgili de bir sorum vardı bilgi sahibiyseniz, yeni proje açmak yerine bu şekilde yaptığım gibi bir projenin içinde yeni python dosyaları açıp kodlarımı yazarsam ekstra yük altına sokmuş olur muyum ? O projeyi açtığı için hepsini çalıştırıyor gibi olur mu yani ?

Üst tarafta printi düzelttim ama şimdi de aşağıda if in altına ne yazacağımı bilemiyorum. Sizce ne yapmalıyım ? Tamam oldu bitti maşallaha getirmek istiyorum orayı ama bir şey yazarsam mükemmel sayı çıktılarının arasına o yazdığım şeyi yazıyor.
image

Olmazsınız.

Olmaz.

Hocanız ne güzel yazmış işte. Aşağıdaki gibi yapın.

def mukemmel_mi(sayi):
    toplam = 0
    for i in range(1, sayi):
        if sayi % i == 0:
            toplam += i
    return toplam == sayi


for i in range(1, 1001):
    if mukemmel_mi(i):
        print(i, "Mükemmel sayıdır.")

Bu arada, aşağıdaki başlığı da incelemenizi öneririm.

1 Beğeni

Diğer yanıtlarınız için teşekkür ederim ama hocanın yaptığı gibi yapma ilgili bir sorun yaşıyorum çünkü ileride bir fonksiyon tanımlarken printi fonksiyonun içine yazmayı da öğrenmek istiyorum. Hep bu şekilde dışarıda yazacak olursam bir yerde illaki sıkıntıya gireceğim.

def mukemmel_mi(sayi):
    toplam = 0
    for i in range(1, sayi):
        if sayi % i == 0:
            toplam += i
    if toplam == sayi:
        print(sayi, "Mükemmel sayıdır.")


for i in range(1, 1001):
    mukemmel_mi(i)

Burada, if toplam == sayi sorgusunu fonksiyonun içinde yazdık. Sorgu True değerini verirse, ekrana yazı yazdırılır. Fonksiyondan herhangi bir değer de dönmez. (None değeri geri döner.)

for i in range(1, 1001):
    mukemmel_mi(i)

Burada da, ikinci defa if mukemmel_mi(i) yazmanıza gerek yok. Zaten sorgu fonksiyonun içinde yapılıyor, bir daha fonksiyonun dışında yapmaya gerek yok. Yukarda da bahsettim, son yazdığımız fonksiyon herhangi bir şey döndürmüyor. Herhangi bir şey döndürmeyen fonksiyonlar None döndürür.

Dolayısıyla; aşağıdaki fonksiyondan dönen değeri bir sorguya alacak olursanız, herhangi bir değer dönmediği için, False değeri alırsınız.

def mukemmel_mi(sayi):
    toplam = 0
    for i in range(1, sayi):
        if sayi % i == 0:
            toplam += i
    if toplam == sayi:
        print(sayi, "Mükemmel sayıdır.")
   # Bu fonksiyon herhangi bir şey return etmiyor.
   # Herhangi bir şey return etmeyen fonksiyonlar
   # None return eder.
   # Yani bu fonksiyonun son satırında gizli bir return None ifadesi var.
   return None
   # Açıkça return None yazmak zorunda olmadığımızı üstte paylaştığım
   # mukemmel_mi fonksiyonunun kodunda görebilirsiniz.


for i in range(1, 1001):
    # mukemmel_mi fonksiyonu None döndürdüğü için aşağıdaki sorgu hep False değerini verir.
    if mukemmel_mi(i):  # <- None <-> False
        print("bu satır ekrana yazdırılamayacak.")

Umarım anlatabilmişimdir.

1 Beğeni

Teşekkür ederim uğraşıp yazmışsınız elinize sağlık.
En alta ne yazacağım hususunda ise True da yazsam False de yazsam etkilemediği için yazıp geçtim en alta. Kod da çalıştı istediğim gibi.

Ben de benzer konularda eğitim veriyorum. Bu açıdan bir kaç şeye karşı çıkmak istiyorum.

Örneğin fonksiyonlar içinde print kullanımı hoş bir şey değil. Fonksiyonların görevi oldukça basit olmalı.

Aslında hocanın yöntemini de şöyle eleştirebilirim. Mükemmel sayı için fonksiyon yazmak yerine bir sayının bölenlerinin toplamını döndüren bir fonksiyon yazılması daha uygun gibi.

Çünkü bunun zengin sayısı var, arkadaş sayıları var, mükemmel sayılar var vs. Hepsi için ortak kullanılacak bir fonksiyon yazıp ayrı ayrı yine küçük fonksiyonlar yazılabilirdi.

1 Beğeni

hayır tam tersi, fonksiyonlar içerisinde print kullanmamalısın. (en azından çoğu zaman)
ayrıca kısaca bahsetmek istediğim bir husus var. Yazılmış mı bilmiyorum şimdiden kusuruma bakmayın.

return toplam==sayi

bu satır True ya da False döndürür. == operatörü sadece if içerisinde kullanılacak diye bir zorunluluğumuz yok.
bunu uzun uzadıya şöyle de yazabilirdik

if toplam==sayi:
    return True
else:
    return False

== operatörüyle alakalı bir de şöyle bir örnek başka bir bakış açısı getirebilir

s = toplam==sayi

eğer toplam değişkeni sayi değişkenine eşitse s değişkeni True olur.
yani kısacası == operatörü True ya da False döndürür.

Hocanız if muk(i): kullanmış mesela
bu da if muk(i) == True: demek bir nevi.
yani muk(i) True döndürürse if içerisine gir ve buradaki işlemleri yap demek oluyor.

2 Beğeni

Bana kalırsa hocanın pek çok hatası var hocam. Ben eğitimci değilim, eğitimcilik üzerine bir eğitim almadım fakat yazılım alanında bir eğitim veriyor olsam öğrenciye operatörleri tamamıyla anlatmadan fonksiyon ve sınıf oluşturma gibi konulara girmezdim.

1 Beğeni

Bu konuda aslında ikiye ayrılıyor hangisi daha yararlı ben de bilmiyorum. Fonksiyonları en öncesinde anlatmak veya sonradan anlatmak.

Mesela C eğitiminde sanki önce anlatsak daha mı iyi? Malum programın kendisi de bir fonksiyon.

Ben dediğin gibi yapıyorum sonradan anlatıyorum ama sanki bu yıl operatörlerden sonra doğrudan fonksiyonları mı işlesem diye düşünüyorum. (pythonda)

C konusunda haklısınız. Üniversitede ilk eğitim verilirken hocamız “şimdilik void main{} kısmını kafanıza takmayın daha sonra öğreneceğiz, en önemli konulardan biri ama şimdilik sizin için önemsiz” demişti. Bu bence gayet yeterli (bu yaklaşım nelere yol açar bilmiyorum, üzerine çok düşünmedim açıkçası).
C için yine bir yere kadar tamam ama pythonda herhangi bir sınıf, fonksiyon tanımlama zorunluluğumuz da yok. Neden böyle bir yol izlenmiş anlamak güç.

1 Beğeni

Aslında tartışmak da istediğim bir konu. Çünkü bazı gözlemlerim diğer konuları (karşılaştırma, döngü vs) önce öğrenip fonksiyona bir türlü ısınamayan öğrencilerimin kodu büyük programlarda arapsaçına (veya spagetti makarna da olur) dönüyor. Israrla fonksiyon yazmak istemiyorlar.

O yüzden acaba baştan mı sevdirsem veya alıştırsam diyorum.

Adamın her ödevinde illaki mükemmel sayı var zaten kudurmak üzereyim. Kendimi geliştiririm anlamadığım yerin üstüne gideyim diyorum ama Allah kahretmesin mükemmel sayıyla yapılan her şeyi ya.

Yapmasına yapıyorum da sonra böyle pek de göstermediği garip garip ifadeler koyuyor koda

Bir ödev de ben vereyim o zaman. :slight_smile:

İki sayı var x ve y diyelim. x in bölenleri toplamı y ye, y nin bölenleri toplamı da x e eşitse bunlara arkadaş sayılar deniyor. 10bine kadar arkadaş sayıları bul bakalım. :slight_smile:

1 Beğeni

Kör topal hesabı böyle bir şey yaptım ama sonrasında fonksiyonu (i,i) gibi yazamayacağımı farkedince ne yapacağımı bilemedim.

def arkadas(x,y):
    x_bolenleri_toplami=0
    y_bolenleri_toplami=0
    for i in range(1,x):
        if x % i ==0:
            x_bolenleri_toplami+=i
    for i in range(1,y):
        if y % i ==0:
            y_bolenleri_toplami+=i
    if x_bolenleri_toplami==y and y_bolenleri_toplami==x:
        return



for i in range(1,10001):

Olacak olacak. Kodunu düzelttim.

def arkadas(x,y):
    x_bolenleri_toplami=0
    y_bolenleri_toplami=0
    for i in range(1,x):
        if x % i ==0:
            x_bolenleri_toplami+=i
    for i in range(1,y):
        if y % i ==0:
            y_bolenleri_toplami+=i
    if x_bolenleri_toplami==y and y_bolenleri_toplami==x:
        return True
    
print(arkadas(220,284)) #True
print(arkadas(222,222)) #None

Eğer iki arkadaş sayı gönderirse fonksiyonun True değerini gönderiyor. Arkadaş sayı olmazlarsa da None değeri geliyor geriye.

1 Beğeni