mitmario.dev

Zählen und summieren

Python Sandbox 3 Min Lesezeit 4 BeispieleLektion 3 von 7

Fünf Tage Kaffee, und du willst wissen, was das zusammen gekostet hat. Eine Schleife, die nur etwas wiederholt und danach vorbei ist, hilft da nicht. Interessant wird es erst, wenn von den Runden etwas übrig bleibt. Wie oft kam etwas vor? Wie viel war es zusammen? Was war der größte Wert? Diese drei Fragen stellt man an fast jede Sammlung von Daten, egal ob Kassenbons, Messwerte oder die Schritte auf dem Handy. Die drei Muster dafür kommen in diesem Kurs noch oft vor, und jedes Mal heißt die Variable anders.

Zählen

Wie oft kommt das e vor
text = "Erdbeeren essen ist eine ernste Sache"
anzahl = 0
for zeichen in text:
    if zeichen == "e" or zeichen == "E":
        anzahl += 1
print(f"Im Satz stehen {anzahl} e.")

Zuerst etwas Neues an for. Es geht nicht nur Zahlen aus range durch, sondern auch einen Text, Zeichen für Zeichen. Bei for zeichen in text: landet in jeder Runde das nächste Zeichen in zeichen, vom ersten bis zum letzten, Leerzeichen eingeschlossen. Der Satz im Beispiel hat 37 Zeichen, also dreht die Schleife 37 Runden.

Gezählt wird mit dem ersten Muster, dem Zähler. Er hat drei Teile:

  • vor der Schleife fängt er bei 0 an, anzahl = 0,
  • in der Schleife wächst er um eins, aber nur, wenn das Zeichen passt, anzahl += 1 unter dem if,
  • nach der Schleife, wieder ganz links, ist er das Ergebnis.

Im Satz stehen 11 e, große und kleine zusammen. Weil Python Groß und klein unterscheidet, wird im if mit or nach beiden gefragt.

Summieren

Eine Woche Kaffee
summe = 0
for tag in range(1, 6):
    betrag = float(input(f"Tag {tag}: "))
    summe += betrag
print(f"Zusammen: {summe:.2f} Euro")

Das zweite Muster, die Summe, sieht fast genauso aus. Nur wächst die Variable nicht um eins, sondern um den Wert der Runde, hier mit summe += betrag. Fünf Arbeitstage Kaffee kosten zusammen 13,80 Euro.

Neu ist, woher die Werte kommen. In eingabe.txt stehen fünf Beträge, einer je Zeile, und das input() steht in der Schleife. Jeder Aufruf liest die nächste Zeile, also bekommt jede Runde ihren eigenen Betrag. So kann ein Programm eine ganze Reihe von Werten einlesen, ohne dass es für jeden eine eigene Zeile Code braucht. In die Frage kommt dabei tag mit hinein. Deshalb steht im Terminal Tag 1:, Tag 2: und so weiter, jeweils mit dem Betrag dahinter.

Das Größte finden

Der teuerste Tag
teuerster = 0
teuerster_tag = 0
for tag in range(1, 6):
    betrag = float(input(f"Tag {tag}: "))
    if betrag > teuerster:
        teuerster = betrag
        teuerster_tag = tag
print(f"Am teuersten war Tag {teuerster_tag} mit {teuerster:.2f} Euro.")

Beim dritten Muster merkt man sich das bisher Größte. Vor der Schleife steht ein Anfangswert. In jeder Runde wird gefragt, ob der neue Wert größer ist als alles bisher, und wenn ja, wird er das neue Größte. Nach der letzten Runde ist das bisher Größte das Größte überhaupt, hier 4,50 Euro.

In jeder Runde weiß man, welcher Tag gerade dran ist. Den kann man sich also gleich mitmerken. Beide Zeilen stehen im selben if-Block, weil sie zusammengehören. Nur wenn ein neuer Höchstwert kommt, ändert sich auch der Tag.

Heikel ist der Anfangswert. 0 funktioniert hier, weil kein Kaffee weniger als nichts kostet. Bei Temperaturen im Januar wäre 0 Grad dagegen wärmer als jeder Messwert, und am Ende stünde als wärmster Tag einer da, den es nie gab. Dann fängt man nicht mit einer erfundenen Zahl an, sondern mit dem ersten echten Wert. Wie das geht, kommt, sobald die Werte in einer Liste stehen.

Wo die Variable stehen muss

Die Summe fängt immer wieder bei null an
for tag in range(1, 6):
    summe = 0
    betrag = float(input(f"Tag {tag}: "))
    summe += betrag
print(f"Zusammen: {summe:.2f} Euro")

In allen drei Mustern wird die Variable vor der Schleife angelegt. Hier steht summe = 0 im Block, und damit fängt die Summe in jeder Runde von vorn an. Am Ende steht nur der letzte Betrag da, 4,50 statt 13,80 Euro. Eine Fehlermeldung gibt es nicht. Nur eine falsche Zahl, und die sieht nicht einmal verdächtig aus.

In der Aufzeichnung im Reiter Debug springt summe in jeder Runde erst auf 0 und dann auf den Betrag dieses einen Tages. Nie auf mehr.

Am anderen Ende gilt dasselbe für die Ausgabe. Wenn das print eingerückt im Block steht, kommt es in jeder Runde, und du musst das Ergebnis zwischen den Zwischenständen suchen.

Was die Aufgabe will

Im Schrittzähler stecken alle drei Muster auf einmal, und sie teilen sich eine Schleife. Die steht schon da. Es fehlt alles, was vor ihr, in ihr und nach ihr kommt.

Zum Mitnehmen

Zählen, aufsummieren und das Größte finden sind die drei Muster, die in fast jeder Auswertung stecken. Alle drei brauchen eine Variable, die vor der Schleife anfängt, in der Schleife wächst und nach der Schleife das Ergebnis ist.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.