IndentationError: expected an indented block in IF - Anweisung

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
Brewster
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 20:52

Hallo liebe Gemeinde,

ich bin Anfänger und nutze Thonny zum programmieren. Nun habe ich einen IndentationError: expected an indented block - Fehler in einer IF - Anweisung. Angeblich ein Einrückungsfehler. Ich habe die Struktur mehrfach geprüft. Die Einrückungen beträgt jeweils 4 Leerzeichen und sonst kann ich auch keinen Grund finden.

Code: Alles auswählen

def Kontrolle():
    
    print("kontrolle")
    # Kontrollstrukturen
    
    for i in Rast:
        if Rast[i][0] < Rast[i+1][0]:
        
        else:
            print("Fehler !!! Temperatur nicht streng monoton steigend!!!")
            'HIer fehlt eine MSGBox
        
    for i in Hopfengaben:
        if Hopfengaben[i] < Hopfengaben[i+1]:
        
        else:
            print("Fehler !!! Bei den Zeitangeben für das Hopfenkochen gibt es einen Fehler!!!") 
            'HIer fehlt eine MSGBox
        
    if Kochzeit <Hopfengaben[0]:
        print("Fehler !!! Bei den Zeitangeben für das Hopfenkochen gibt es einen Fehler!!!") 
        'Hier fehlt eine MSGBox
    
    #Kontrollstruktur Ende
Thonny weist darauf hin, dass der Fehler beim ersten "else: " liegt.

Vielen Dank und GRüße

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

In Python darf es keine leeren Blöcke, da muß mindestens `pass` drinstehen.

Du benutzt for-Schleifen falsch. In Python iteriert man nicht über einen Index, sondern über die Elemente der Liste direkt:

Code: Alles auswählen

    for r1, r2 in zip(Rast, Rast[1:]):
        if r1 < r2:
            pass
        else:
            print("Fehler !!! Temperatur nicht streng monoton steigend!!!")
Sowas macht man aber nicht, da man die Bedingung einfach umdrehen könnte:

Code: Alles auswählen

    for hopfengabe1, hopfengabe2 in zip(Hopfengaben, Hopfengaben[1:]):
        if hopfengabe1 >= hopfengabe2:
            print("Fehler !!! Bei den Zeitangeben für das Hopfenkochen gibt es einen Fehler!!!")
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Brewster: Wobei das so ja sowieso nicht funktioniert. Selbst wenn `Rast` und `Hopfengaben` Wörterbücher sind die ganze Zahlen als Schlüssel haben, wird bei mindestens einem Schlüssel `i` kein Schlüssel ``i + 1`` vorhanden sein, denn das würde ja bedeuten das die Wörterbücher endlos viele Elemente enthalten.

Noch ein paar Anmerkungen: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Funktions- und Methodennamen beschreiben üblicherweise die Tätigkeit die sie ausführen. Also beispielweise `kontrolliere_angaben()`.

Alles was Funktionen und Methoden ausser Konstanten benötigen bekommen sie als Argument(e) übergeben. Auf Modulebene sollte es keine Variablen geben, sondern nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Anstelle von dem `zip()` und dem Anlegen einer Kopie ohne das erste Element was Sirius3 gezeigt hat, könnte man auch `more_itertools.windowed()` verwenden.

Wenn man Code wiederholt sollte man sich immer Fragen ob man da nicht sinnvoll eine Funktion draus isolieren kann. Zum Beispiel eine Testfunktion ob etwas iterierbares streng monoton steigende Elemente enthält.

Zwischenstand (ungetestet):

Code: Alles auswählen

from operator import itemgetter

from more_itertools import windowed


def ist_streng_monoton_steigend(elemente):
    return all(a < b for a, b in windowed(elemente, 2))


def kontrolliere_angaben(rast, hopfengaben, kochzeit):
    print("kontrolle")

    if not ist_streng_monoton_steigend(map(itemgetter(0), rast)):
        print("Fehler! Temperatur nicht streng monoton steigend!")

    if not ist_streng_monoton_steigend(hopfengaben):
        print(
            "Fehler! Bei den Zeitangaben für das Hopfenkochen"
            " gibt es einen Fehler!"
        )

    if kochzeit < hopfengaben[0]:
        print(
            "Fehler! Bei den Zeitangaben für das Hopfenkochen"
            " gibt es einen Fehler!"
        )
Was hier noch unschön ist, ist die ”magische” 0. Namen sind in der Regel besser/verständlicher als irgendwelche nichtssagenden Indexwerte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Brewster
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 20:52

WOW!
Irre. Das ging ja echt schnell. Ich muss jetzt erst einmal arbeiten und werde dann probieren die Rückmeldungen zu verstehen. Ich danke schon einmal!
Antworten