Seite 1 von 1

Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 15:42
von djh
Hallo Leute,

bin neu hier und ganz neu bei Python. Ich programmiere mich gerade durch byteOfPython, was ich einen sehr guten Einstieg finde. Aber mit dem Indentation-Konzept bei Python tue ich mich noch ein bißchen schwer :? Das kannte ich so noch von keiner anderen Sprache. Natürlich rücke ich auch bei anderen Sprachen ein, soweit wie es die Logik an der jeweiligen Stelle erfordert. (Ich kenne auch Sprache, wo der Interpreter/Compiler das - auf Wunsch - auch nachträglich erledigt, wenn man's mal vergißt!) Aber daß der Interpreter das explizit verlangt, war mir bisher noch nicht untergekommen.

Meine Frage dazu: Wenn die Indentation bei Python sowieso obligatorisch ist, was soll dann noch der Doppelpunkt? Das ist doch dann redundant, oder?
Und der Interpreter scheint die Indentation-levels auch nicht mitzuzählen: Ich kann auch zwei oder drei eingeben, auch wenn logisch an dieser Stelle nur eine verlangt wäre. :?:

Grüße, Dirk

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 15:57
von DasIch
Der Doppelpunkt ist tatsächlich überflüssig erhöht aber die Lesbarkeit.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 16:03
von cofi
djh hat geschrieben:Meine Frage dazu: Wenn die Indentation bei Python sowieso obligatorisch ist, was soll dann noch der Doppelpunkt? Das ist doch dann redundant, oder?
Ja und? Zwei Schleifentypen sind auch redundant. Ein Doppelpunkt leitet eben eine Suite ein, damit kann man eben abstrakt von allen eingerueckten Blöcken sprechen und nicht nur von "for-Bloecken", "while-Bloecken" und so weiter
djh hat geschrieben:Und der Interpreter scheint die Indentation-levels auch nicht mitzuzählen: Ich kann auch zwei oder drei eingeben, auch wenn logisch an dieser Stelle nur eine verlangt wäre.
Eine Einrueckungsebene ist nicht fest, sondern wird durch die erste eingerueckte Anweisung bestimmt.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 16:28
von lunar
Der Doppelpunkt ist mitnichten redundant. Ohne wäre die Grammatik der Sprache nicht eindeutig, oder zumindest nicht so offensichtlich.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 16:29
von BlackJack
@djh: Einrückung kann kein Interpreter/Compiler nachträglich für Dich erledigen wenn Du nicht irgendwie anders, zum Beispiel durch Klammern, Deine Absichten kundgetan hast. Sonst müsste der Compiler wissen was Du denkst und die beabsichtigte Semantik verstehen können. Wenn Compiler *so* weit sind, braucht man keine Programmierer mehr. :-)

Why are colons required… ist eine FAQ.

Du verwechselst Einrückebene mit einer Anzahl von Leerraum-Zeichen. Eine Ebene wird durch die Spalte bestimmt an der aufeinanderfolgende, nicht-leere Zeilen beginnen und nicht durch die Spaltennummer an der eine einzelne Zeile beginnt.

Es gibt auch noch andere Programmiersprachen, bei denen die Einrückung ein wichtiges Mittel zur Strukturierung des Quelltextes ist, und nicht nur "Kosmetik". Haskell, Nemerle (optional), und CoffeeScript wären Beispiele für solche Sprachen.

@lunar: Wäre sie nicht? Mal den Fall dass man die "Suite" in der gleichen Zeile schreiben möchte ausser acht gelassen, was wäre denn dann noch mehrdeutig?

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 16:41
von lunar
@BlackJack: Keine Ahnung, ich glaube nichts mehr, aber so genau habe ich darüber nicht nachgedacht. Mir ist beim Lesen des Beitrags von DasIch nur unmittelbar aufgefallen, dass man Einzeiler ohne Doppelpunkt nicht eindeutig zerlegen kann.

@cofi: "for" und "while" sind redundant? Wie würdest Du "while True:" denn über "for" ausdrücken?!

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 16:43
von BlackJack
@lunar: Na so:

Code: Alles auswählen

for dummy in itertools.repeat(True):
    pass
:-)

Aber vielleicht war auch eher ``for`` mit redundant gemeint.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 17:04
von lunar
@BlackJack: Ich wusste, dass das jetzt kommt ;) Daran, dass "for" gemeint sein könnte, habe ich allerdings nicht gedacht ...

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 17:08
von cofi
lunar hat geschrieben:Daran, dass "for" gemeint sein könnte, habe ich allerdings nicht gedacht ...
Das macht ja auch das Argument kaputt ;) Dass es Probleme gibt, wenn man mit der spezielleren Schleife die generelle Ausdruecken will, ist klar.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 17:23
von lunar
@cofi: Schon klar, ich habe halt offensichtlich schneller geschrieben als gedacht. ;)

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 18:19
von Leonidas
Mit Rekursion sind sowohl ``for`` als auch ``while`` redundant. Aber dann sollte man nicht zu viele Daten verarbeiten wollen 8)

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 18:20
von Hyperion
lunar hat geschrieben: @cofi: "for" und "while" sind redundant? Wie würdest Du "while True:" denn über "for" ausdrücken?!

Code: Alles auswählen

for _ in itertools.repeat(True):
:mrgreen:

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 18:23
von lunar
@Hyperion: Soweit waren wir in dieser Diskussion schon ;)

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Dienstag 8. Februar 2011, 18:45
von Hyperion
lunar hat geschrieben:@Hyperion: Soweit waren wir in dieser Diskussion schon ;)
Verdammte Axt... hatte BlackJacks Beitrag tatsächlich übersehen! :oops:

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Mittwoch 9. Februar 2011, 08:42
von djh
@BlackJack:
Einrückung kann kein Interpreter/Compiler nachträglich für Dich erledigen wenn Du nicht irgendwie anders, zum Beispiel durch Klammern, Deine Absichten kundgetan hast.
Völlig klar, aber genau das muß man ja in vielen Sprachen tun. Und DANN kann der Compiler natürlich die Semantik erkennen und Code durch Einrückung "aufhübschen".
Ich kann in NATURAL z.B. folgendes Programm codieren - und das läuft dann:

Code: Alles auswählen

DEFINE DATA LOCAL                              
1 #I      (I2)                                 
1 #REST   (I2)                                 
1 #TEILER (I2)                                 
END-DEFINE                                     
*                                              
FOR #I = 1 TO 12                               
DIVIDE 2 INTO #I GIVING #TEILER REMAINDER #REST
IF #REST = 0                                   
WRITE #I 'ist gerade'                          
END-IF                                         
END-FOR                                        
END   
Wenn ich aber irgendwann den editor-Befehl "struct" absetze, sieht der Code so aus, wie er sollte - es wird automatisch richtig eingerückt, mit Berücksichtigung der verschiedenen logischen Ebenen:

Code: Alles auswählen

FOR #I = 1 TO 12                                 
  DIVIDE 2 INTO #I GIVING #TEILER REMAINDER #REST
  IF #REST = 0                                   
    WRITE #I 'ist gerade'                        
  END-IF                                         
END-FOR                                          
(In dieser Sprache sind eben nicht nur die Blockanfangsindikatoren - for, while, if, case, ... sondern auch die Blockendeindikatoren obligatorisch, so daß der Interpreter damit klarkommt.)
Das Bsp. ist natürlich Pipifax, aber bei längeren Programmen weiß man manchmal nicht mehr genau, auf welcher Schachtelungsbene man sich befindet und da fand ich diese Funktion gelegentlich doch ganz hilfreich. :)
Aber danke für den Hinweis auf die FAQs. (Ich kann halt nicht die gesamte Dokumentation an einem Tag lesen :) )
Du verwechselst Einrückebene mit einer Anzahl von Leerraum-Zeichen. Eine Ebene wird durch die Spalte bestimmt an der aufeinanderfolgende, nicht-leere Zeilen beginnen und nicht durch die Spaltennummer an der eine einzelne Zeile beginnt.
Da muß ich jetzt was länger drüber nachdenken, aber ich glaube, das geht tatsächlich in die Richtung, die ich meinte, bzw. wo mir das rechte Verständnis noch fehlte.

Re: Doppelpunkt und Indentation: doppelt gemoppelt?

Verfasst: Mittwoch 9. Februar 2011, 09:21
von Leonidas
djh hat geschrieben:Das Bsp. ist natürlich Pipifax, aber bei längeren Programmen weiß man manchmal nicht mehr genau, auf welcher Schachtelungsbene man sich befindet und da fand ich diese Funktion gelegentlich doch ganz hilfreich. :)
Also ich programmiere Python seit etwa 7 Jahren und hatte dieses Problem nie. Der Trick ist, einfach nicht so tief zu verschachteln. Was auch sinnvoll ist angesichts dessen dass Zeilen nicht länger als 80 Zeichen werden sollten sowie das für die Einrückungsebenenen "Klasse" und "Methode" ja allein schon 8 Zeichen weggehen. Das ist aber durchaus machbar in Python. Teif verschachtelte Strukturen sind für mich ein Signal, dass der Code suboptimal strukturiert ist.