Doppelpunkt und Indentation: doppelt gemoppelt?

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
djh
User
Beiträge: 7
Registriert: Samstag 5. Februar 2011, 09:28

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Doppelpunkt ist tatsächlich überflüssig erhöht aber die Lesbarkeit.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
lunar

Der Doppelpunkt ist mitnichten redundant. Ohne wäre die Grammatik der Sprache nicht eindeutig, oder zumindest nicht so offensichtlich.
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?
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?!
BlackJack

@lunar: Na so:

Code: Alles auswählen

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

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

@BlackJack: Ich wusste, dass das jetzt kommt ;) Daran, dass "for" gemeint sein könnte, habe ich allerdings nicht gedacht ...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
lunar

@cofi: Schon klar, ich habe halt offensichtlich schneller geschrieben als gedacht. ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit Rekursion sind sowohl ``for`` als auch ``while`` redundant. Aber dann sollte man nicht zu viele Daten verarbeiten wollen 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

@Hyperion: Soweit waren wir in dieser Diskussion schon ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben:@Hyperion: Soweit waren wir in dieser Diskussion schon ;)
Verdammte Axt... hatte BlackJacks Beitrag tatsächlich übersehen! :oops:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
djh
User
Beiträge: 7
Registriert: Samstag 5. Februar 2011, 09:28

@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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten