return und Nutzung von variabeln in Funktionen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sfthbara
User
Beiträge: 6
Registriert: Samstag 13. Juli 2019, 14:26

Hallo zusammen.
Ich habe ein Übungsprogramm geschrieben, dass perfekte Zahlen ermitteln soll. Prinzipiell funktioniert es auch. Jedoch verstehe ich nicht warum ich das returnte Array "primfaktoren" nach der Ausgabe nicht mehr verwenden kann. Kann mir das jemand erklären oder einen Lösungsvorschlag geben, um das Array weiter zu nutzen zu können.
Vielen Dank

Code: Alles auswählen

def primfaktoren_proz(n):
    i = int(1)

    primfaktoren = []
    while i<n:
        if n % i == 0:
            primfaktoren.append(i)
            print(primfaktoren)
        i +=1
    return primfaktoren

def isTrue(n,primfaktoren):
    if sum(primfaktoren) == n:
        print("Die Primfaktoren sind: ")
        return (True)
    else:
        return False

def isVollkommendeZahl(n):
    primfaktoren_proz(n)
    isTrue(n,primfaktoren)
    
        


n = float(0)
while n>=0 and n % 1 == 0:
    n = float(input( "Geben Sie eine Ganzzahl an! DAs Programm wird beendet, wenn Sie eine negative oder eine Kommazahl verwenden "))
    if isVollkommendeZahl(n):
        print(n, "ist eine eine perfekte Zahl ")
        
    else:
        print(n, "ist keine perfekte Zahl")

Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum müssen die Primfaktoren protzen? Benutze keine Abkürzungen. Funktionen sollten nach Tätigkeiten benannt werden. Funktionen werden wie Variablen nach Konvention komplett klein geschrieben.
In `primfaktoren_proz` ist 1 schon ein int, das in ein int umzuwandeln ist also unnötig. Wenn man eine while-Schleife hat, wo ein Index hochgezählt wird, dann ist das eigentlich eine for-Schleife.

Code: Alles auswählen

def berechne_primfaktoren(n):
    primfaktoren = []
    for i in range(1, n):
        if n % i == 0:
            primfaktoren.append(i)
            print(primfaktoren)
    return primfaktoren
`isTrue` ist ein seltsamer Name, was soll denn Wahr sein? Wenn in den if-Blöcken doch nur wieder True oder False zurückgegeben wird, dann kann man gleich den Wahrheitswert des Vergleichs benutzen:

Code: Alles auswählen

def ist_bedingung_für_vollkommene_zahl_erfüllt(n, primfaktoren):
    return sum(primfaktoren) == n
Damit ist die Funktion so kurz, dass sie keine eigenständige Funktion sein muß, sondern in die nächste integriert werden kann.
In `isVollkommendeZahl` kommt dann `primfaktoren` aus dem nichts. Das würde wohl das komische Verhalten erklären, weil Du irgendetwas benutzt, was Du irgendwo anders definiert hast.
Den Rückgabewert von `primfaktoren_proz` benutzt Du dagegen nicht. Den Rückgabewert von isTrue benutzt Du auch nicht, so dass die Funktion eigentlich nichts macht.
Das muß also so aussehen:

Code: Alles auswählen

def ist_vollkommene_zahl(n):
    primfaktoren = berechne_primfaktoren(n)
    return sum(primfaktoren) == n
Es ist komisch, dass Kommazahlen zum Beenden einer Schleife benutzt werden. 0 in ein float umzuwandeln ist auch komisch. Wenn eine Schleife nur mit einem Dummywert richtig starten kann, dann hat man eigentlich eine Endlosschleife, die an der passenden Stelle per break verlassen werden will:

Code: Alles auswählen

def main():
    while True:
        n = input("Geben Sie eine Ganzzahl an! Zum Beenden Eingabetaste drücken.")
        if not n:
            break
        if ist_vollkommene_zahl(int(n)):
            print(n, "ist eine eine perfekte Zahl ")
        else:
            print(n, "ist keine perfekte Zahl")

if __name__ == '__main__':
    main()
PS: `primfaktoren` ist kein Array sondern eine Liste.
Antworten