Seite 1 von 1

Python Indentation

Verfasst: Samstag 23. März 2019, 22:01
von Devanther
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!

Re: Python Indentation

Verfasst: Samstag 23. März 2019, 22:06
von __deets__
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.

Re: Python Indentation

Verfasst: Samstag 23. März 2019, 22:17
von Devanther
Geht es noch etwas genauer?
https://imgur.com/a/8C0uF8d

Kann mir das jemand ausführlich erklären, anhand dieses Beispiels?

Re: Python Indentation

Verfasst: Samstag 23. März 2019, 22:24
von __deets__
Ohne Quelltext und Fehlermeldung? Nein.

Re: Python Indentation

Verfasst: Samstag 23. März 2019, 22:35
von __blackjack__
@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. :-)

Re: Python Indentation

Verfasst: Samstag 23. März 2019, 22:55
von __blackjack__
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.

Re: Python Indentation

Verfasst: Sonntag 24. März 2019, 11:15
von __blackjack__
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.