Verständnisfrage zur For Schleife

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
TheNormalGuy
User
Beiträge: 3
Registriert: Freitag 22. April 2022, 11:05

Hallo liebe Community,
ich habe einen Code für eine Berechnung einer Fakultät gefunden und an meine Vorstellungen angepasst.

Für mein Verständnis habe ich an euch noch die Frage, ob man dies noch hätte anders lösen können.

Und bitte kann mir jemand erklären, was für eine Funktion fact im Code hat.

Ich hatte viel ausprobiert und nur mit diesem Code hat es funktioniert. Mit anderen Codes wurde nur n abgefragt.

Code:

Code: Alles auswählen

n = int(input("Welche Zahl möchtest du berechnen?: "))
fact = 1
for i in range(1,n+1): 
    fact = fact * i 
      
print ("Die Fakultät von",n,"ist: ",end="")
print (fact)
TheNormalGuy
User
Beiträge: 3
Registriert: Freitag 22. April 2022, 11:05

Den Code habe ich gerade beim Durchstöbern anderer Codes ganz gut verstanden. Danke euch trotzdem!
Intregral
User
Beiträge: 20
Registriert: Montag 15. März 2021, 13:35

So hab ich das mal gemacht:

Code: Alles auswählen

n = int(input("Welche Zahl möchtest du berechnen?: "))    

i=1 #Startwert (ergibt 1 für !0)
s=1 #Zähler
    
while i<n+1:
        
    s = s*i
    i = i+1 #Zähler raufsetzen
  
print(s)
Benutzeravatar
Dennis89
User
Beiträge: 1562
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo Intregral,

Dein Code ist ein gutes Beispiel dafür, wie wichtig ordentliche Namen sind und wie verwirrend Kommentare sein können, die versuchen die schlecht gewählten Namen zu beschreiben.

'i' ist also der Startwert und 's' der Zähler. Ein paar Zeilen später ist 'i'' plötzlich der Zähler und 's' ist viel mehr das Ergebnis der Berechnung.

Ich finde, spätestens wenn man Code zeigt, der etwas erklären soll, dann müsste man sich um die Namen kümmern. Naja nur so als Anmerkung.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Intregral
User
Beiträge: 20
Registriert: Montag 15. März 2021, 13:35

Stimmt, ist mir leider nicht aufgefallen.

Wobei ich sagen muss dass ich absoluter Anfänger bin und beileibe nichts erklären wollte, sondern nur auf die Frage, "ob man dies noch hätte anders lösen können", geantwortet habe.

Ich könnte noch nicht mal sagen, ob es weitere Möglichkeiten gibt oder welche die effizienteste ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

(Ich habe vor Dennis89 angefangen den Beitrag zu schreiben, darum ist der wohl recht redundant, sorry.)

@Intregral: Schönes Beispiel für schlechte Variablennamen. Wenn man einen Kommentar schreiben muss was der einbuchstabige Name bedeuten soll, und der Kommentar nur aus einem Wort besteht, dann kann man in der Regel davon ausgehen, dass dieses eine Wort in 99,9% der Fälle eigentlich der Variablenname hätte sein sollen.

Hier wird es dann aber wirr in Deinem Code: Du schreibst an `s` den Kommentar ”Zähler”, aber in der Schleife hochgezählt wird dann `i` mit dem Kommentar ”Zähler raufsetzen”. Der Kommentar beim initialisieren von `i` ist damit auch inhaltlich falsch. Schlimmer als keine Kommentare sind falsche Kommentare, denn Kommentare sollen ja gerade aufkommende Fragen beim Leser beseitigen, und nicht neue aufwerfen. Dann machen sie genau das Gegenteil von dem wofür sie da sind.

Statt ``i < n + 1`` wäre es einfacher, und auch effizienter, ``i <= n`` als Schleifenbedingung zu verwenden. Letztlich ist das hier aber eindeutig ein Fall für eine ``for``-Schleife statt einer ``while``-Schleife.

Hier eine Variante ohne explizite Schleife mit Werkzeugen aus der Standardbibliothek:

Code: Alles auswählen

#!/usr/bin/env python3
from functools import reduce
from operator import mul as multiplicate


def main():
    number = int(input("Welche Zahl möchtest du berechnen?: "))
    #
    # FIXME Handle negative input.
    #
    result = reduce(multiplicate, range(1, number + 1), 1)
    print(f"Die Fakultät von {number} ist: {result}")


if __name__ == "__main__":
    main()
Wie die anderen Varianten die hier schon stehen geht der Code davon aus, das der Benutzer keine negative Zahl eingibt, denn dann ist das Ergebnis falsch.

Und natürlich könnte man auch einfach die vorhandene `math.factorial()`-Funktion verwenden, statt sich etwas selbst zu schreiben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Dennis89
User
Beiträge: 1562
Registriert: Freitag 11. Dezember 2020, 15:13

__blackjack__ hat geschrieben: Montag 25. April 2022, 12:07 (Ich habe vor Dennis89 angefangen den Beitrag zu schreiben, darum ist der wohl recht redundant, sorry.)
Dass ich das noch erleben darf.

Eine zeitlange kam es öfters vor, das ich vor dem posten noch mals aktualisiert habe und dann schon eine viiiiiiiiel ausführlichere und bessere Antwort von dir da stand :cry: :D

Ausführlicher ist sie wieder, aber wenigstens war ich mal schneller.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten