Python Indentation

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
Devanther
User
Beiträge: 13
Registriert: Samstag 23. März 2019, 21:45

Hallo,

ich habe schon mit Java einiges programmiert und kennen gelernt, vor paar Tagen habe ich mit Python angefangen.
Python will ich jetzt lernen, habe mich da für einen Udemy Kurs angemeldet und lerne das gerade.

Das Problem ist dass Python im Gegensatz zu Java indentation berücksichtigt. (Einrückung von Code)
Also, Python berücksichtigt Leerzeichen etc....kann mir jemand erklären wie das in Python funktioniert?
Codeblöcke etc...

Bzw. gibt es Links, Bücher, Videos wo das erklärt wird?

Ohne dieses Verständnis komme ich nicht weiter -.-

Danke für Hilfe!
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das offizielle Tutorial auf der Python.org Webseite zb.

Und wenn du schon programmiert hast, dann kennst du doch Blöcke wie sie zb in Java durch {} gebildet werden. Das erlaubt

if(x) { tuwas();} else if (y) { tuwasanderes();}

zu schreiben. Tut aber keiner. Man schreibt

Code: Alles auswählen

if(x) 
{ 
    tuwas();
}
else if (y) 
{ 
    tuwasanderes();
} 


Man rückt also ein. Um klar zu machen, was zu welchem Zweig gehört. Python nimmt das und erzwingt dieses Vorgehen.
Devanther
User
Beiträge: 13
Registriert: Samstag 23. März 2019, 21:45

Geht es noch etwas genauer?
https://imgur.com/a/8C0uF8d

Kann mir das jemand ausführlich erklären, anhand dieses Beispiels?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne Quelltext und Fehlermeldung? Nein.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Devanther: Quelltext bitte hier in Code-Tags reinstellen und nicht als Bilder irgend wo anders hosten.

Ich verstehe nicht was Du da noch mehr erklärt haben willst, wenn Du doch schon Java kennst/kannst. __deets__ hat das erschöpfend beschrieben. In Java rückst Du ein damit der menschliche Leser besser versteht was zu einem Block gehört. Man kann da aber auch falsch einrücken. Das verwirrt den Leser, aber nicht den Compiler, weil der sich an den geschweiften Klammern orientiert. Bei Python glaubt Dir halt auch der Compiler die Einrückung. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Datenstrukturen/Wörterbücher auf dem Bildschirmfoto sind übrigens nicht so toll. Zum Beispiel sollten `locations` und `exits` keine zwei parallel geführten Datenstrukturen sein. Das ist umständlich und fehleranfällig. Die Ausgänge währen besser direkt Bestandteile von den Werten in `locations`, die Beispielsweise Wörterbücher sein könnten die eine Orts-ID auf ein Wörterbuch mit Beschreibung und Ausgängen des jeweiligen Ortes abbilden.

Das ('Q', 0) ein Eintrag in *jedem* der Ausgänge ist, macht das redundant. Wenn es den Code vereinfacht würde man es einfach per Code überall hinzufügen, aber nicht immer wieder von Hand hinschreiben. Auch wieder umständlich und fehleranfällig.

Das `vocabulary` bildet jeden Schlüssel auf seinen ersten Buchstaben ab. Auch wieder überflüssig von Hand zu schreiben, da man das entweder direkt im Code machen kann, oder zumindest das Wörterbuch programmatisch erstellen kann.

`availableExits` entspricht in der Schreibweise nicht den Namenskonventionen von Python. Siehe auch den Style Guide for Python Code.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal zum Vergleich das Stück Python-Code auf dem Bildschirmfoto in Java übersetzt:

Code: Alles auswählen

        int loc = 1;
        while (true) {
            final String availableExits = exits.get(loc).keySet().stream()
                    .sorted().collect(Collectors.joining(", "));

            System.out.println(locations.get(loc));

            if (loc == 0) {
                break;
            }

            String direction = input("Available exits are " + availableExits + " ")
                    .toUpperCase();
            System.out.println();
            if (direction.length() > 1) {
                for (String word: vocabulary.keySet()) {
                    if (direction.contains(word)) {
                        direction = vocabulary.get(word);
                    }
                }
            }

            if (exits.get(loc).containsKey(direction)) {
                loc = exits.get(loc).get(direction);
            } else {
                System.out.println("You cannot go in that direction");
            }
        }
Wie man sieht: zusätzlich zu den Klammern die Java braucht um die Blöcke zuzuordnen, ist da die Einrückung die der menschliche Leser braucht, um die Blöcke einfach(er) zuzuordnen. In Python (ge)brauchen Computer und menschlicher Leser nur die Einrückung für diesen Zweck.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten