Esnek parametreli (*args) çoklu toplama fonksiyonu

Merhaba,
Tek yani esnek parametre kullanarak, döngü yoluyla 0’a basıncaya kadar aldığı değerleri toplayıp döndüren bir fonksiyon yazmaya çalışmaktayım, birçok biçimde denedim ancak sağlıklı bir düzen sağlayamadım.
Örneğin;

def toplamaYap():
    while True:
        sayi = list()
        if sayi != 0:
            sayi.append(int(input("Sayı giriniz: ")))
        else:
            print("Çıkış yapıldı.")
            break
        return tuple(sayi)

def sonucuVer(*sayilar):
    toplam = sum(toplamaYap())
    return toplam

islem = sonucuVer(toplamaYap())
print(islem)

Başka bir biçimde daha denedim;

def toplamaYap():
    while True:
        sayi = int(input("Sayı giriniz: "))
        if sayi != 0:
            def sonucuVer(*sayilar):
                sonuc = 0
                for i in sayilar:
                    sonuc += i
                return sonuc

islem = toplamaYap()
print(islem)

Geriye dönüp aktaramadığım birçok yöntemle daha denedim. İlgili olarak bir fikir verip yardımcı olabilirseniz sevinirim.
Teşekkürler.

Merhaba,

Bu örnekte parametreye pek ihtiyacınız yok aslında. Yazdığınız fonksiyonlar sanki yapmak istediğiniz işlemi zorlaştırmış gibi geldi bana. Aşağıdaki fonksiyonun işlevine benzeyen bir fonksiyon yazmaya çalışmıyor musunuz?

def topla():
    toplam = 0
    while True:
        try:
            veri_al = int(input("Sayi: "))
        except ValueError:
            continue
        if veri_al != 0:
            toplam += veri_al
        else:
            return toplam
            
            
print(topla())
1 Beğeni

Evet aklımdaki işlem tam olarak bu işlevde. Ancak ben özellikle “*sayilar” biçimindeki bir parametre üzerinden bir algoritma oluşturmak istiyordum. Bunun, belki özyineli fonksiyon şeklinde olabileceğini sanıyorum ama dediğin gibi oldukça da karıştı. İlgine teşekkürler.

Baska bir deyisle if list() != 0

Burada sayilar kullanilmiyor.

Buradaki fonksiyon tanimi disari, toplamaYap’in yanina alinabilir.

Burada da sonucuVer cagrilmiyor.

1 Beğeni

Ben de bir türlü hem *sayilar’ı parametre olarak sağlayıp hem de parametresiz bir fonksiyonun içinde kurulacak bir döngüyle veri aktarmayı veya aynı işlevde başka bir düzeni şimdilik gerçekleyemedim işte.

Bu örnek için parametre alan bir fonksiyona ve bu parametre alan fonksiyon içindeki başka bir fonksiyona ihtiyacınız yok. *args veya **kwargs kullanmanızın daha uygun olacağı başka örnekler düşünelim isterseniz.

Mesela, burada input ile kullanıcıdan sayı girmesini istiyorsunuz. Bu input'u kaldırıp, sayıları parametre olarak verebilirsiniz. Ve bu örnekte özyineleme kullanabilirsiniz.

Örnek:

def topla(*args):
    return args[0] + topla(*args[1:]) if args and args[0] else 0

Bu fonksiyon, parametreler içinde 0'ı görene kadar parametreleri toplar.

print(topla(10, 12, 0, 3))  # Sonuç: 22

Bu ilham verici bir örnek oldu. Sağ olun.

Array kullanilacaksa *args kullanmaya gerek yok. Calisma asamasinda sabit ama degisik kullanimlarda degisen parametre sayisi icin *.