Seite 1 von 1

syntaktisches

Verfasst: Donnerstag 7. Mai 2009, 10:13
von hendrikS
Neulich in den unendlichen Weiten des Internets gefunden:
Einige kennen sicher die folgende Kombination von Vergleichsoperatoren:

Code: Alles auswählen

a = 3
2 < a < 10
zum Ausdruck bringend

Code: Alles auswählen

a > 2 and a < 10
Möglicherweise ist nicht jedem klar, dass dies auch mit anderen Vergleichsoperatoren geht. Z.Bsp.

Code: Alles auswählen

2 < a in [2,3,4]
zum Ausdruck bringend

Code: Alles auswählen

a > 2 and a in [2,3,4]

Verfasst: Donnerstag 7. Mai 2009, 12:02
von derdon
Wenn du dich so darüber freust, so eine Möglichkeit entdeckt zu haben, wäre es fair, die Quelle zu nennen.

Verfasst: Donnerstag 7. Mai 2009, 12:15
von Nocta
Das ist ja echt cool ..
Ich hatte erwartet, dass

Code: Alles auswählen

2 < a in [2,3,4]

Code: Alles auswählen

2 < (a in [2,3,4])
also

Code: Alles auswählen

2 < True
entsprechen würde, also false ergeben müsste.

Verfasst: Donnerstag 7. Mai 2009, 12:37
von lunar
Auf die Anwendung dieses "Tricks" würde ich aber zwecks Lesbarkeit verzichten. "2 < a < c" kennt jeder aus der Mathematik, "2 < a in [1, 2, 3]" dagegen ist etwas "mystisch", ich hätte das auf den ersten Blick genauso wie Nocta gelesen.

Verfasst: Donnerstag 7. Mai 2009, 13:53
von birkenfeld
derdon hat geschrieben:Wenn du dich so darüber freust, so eine Möglichkeit entdeckt zu haben, wäre es fair, die Quelle zu nennen.
Die Python-Dokumentation?

Verfasst: Donnerstag 7. Mai 2009, 14:04
von derdon
Ok, bei "den unendlichen Weiten des Internets" habe ich nicht so etwas offensichtliches erwartet.

Verfasst: Donnerstag 7. Mai 2009, 19:21
von Nocta
Ich finde diese Schreibweise auch ziemlich ungeschickt. Es erfüllt meiner Meinung nach nicht das Einfachheits und Lesbarkeitsprinzip von Python. Es ist auch nicht intuitiv, wie lunar mir auch schon zugestimmt hat, da man hier ein anderes Ergebnis erwartet.

Die vollständige Schreibweise ist imho auch nicht so viel Länger:

Code: Alles auswählen

2 < a in [2,3,4]
==> 
2 < a and a in [2,3,4]
Außer natürlich man nutzt diese Syntax etwas stärker und "verschachtelt" die in's:

Code: Alles auswählen

2 < a in [2,3,4] in [2,3,4,5] in [2,3,4,5,6] ...
==> 
2 < a and a in [2,3,4] and [2,3,4] in [2,3,4,5] and [2,3,4,5] in [2,3,4,5,6] ...
PS:
Wenn die Klammern die Operatorenreihenfolge verändern würden (mit Klammern kommt das erwartete Ergebnis), könnte man das ganze ja noch einigermaßen nachvollziehen, aber das wird ja hier so weit ich das sehe auch nicht gemacht. Deshalb ist es auch ziemlich unerwartet, dass sich durch die Klammern (die ja in logischer Sicht nichts ändern), etwas völlig anderes ergibt als ohne bzw andersrum.

Verfasst: Donnerstag 7. Mai 2009, 19:32
von birkenfeld
Nocta hat geschrieben:Ich finde diese Schreibweise auch ziemlich ungeschickt. Es erfüllt meiner Meinung nach nicht das Einfachheits und Lesbarkeitsprinzip von Python.
Nein, aber es erfüllt das Konsistenzprinzip. Die Grammatik spezifiziert

Code: Alles auswählen

comparison: expr (comp_op expr)*
und nachdem "<" und Verwandte, "in" und "is" und ihre Verneinungen alles "comp_op"s sind, ist das zulässig. Eine andere Möglichkeit wäre natürlich, die Priorität von "in" zu ändern, aber dann hat man genauso ein Zweideutigkeitsproblem, nämlich wo genau die impliziten Klammern stehen. "in" ist nunmal kein Operator, dem wir "intuitiv" eine Rangfolge zuweisen wie "+" oder "*".
Es ist auch nicht intuitiv, wie lunar mir auch schon zugestimmt hat, da man hier ein anderes Ergebnis erwartet.
Ich hoffe auch, dass es niemand mit "in" (oder "is") verwendet.

Verfasst: Donnerstag 7. Mai 2009, 20:18
von Nocta
birkenfeld hat geschrieben:Nein, aber es erfüllt das Konsistenzprinzip. Die Grammatik spezifiziert
Konsistenz im Sinne von Widerspruchsfrei oder Vollständigkeit oder was ist genau gemeint?

Naja, vielleicht ist es konsequent, es zuzulassen, dass der Operator in dieser Art und Weise eingesetzt werden kann. Ich kann das nicht beurteilen, ich habe auch keine Theorie studiert :)
Da gibt es dann wahrscheinlich auch keinen Kompromiss. Es wegzulassen würde die Sprache dann "unvollständig" oder "unperfekt" machen und es zuzulassen, würde eben diese Einfachheit und Lesbarkeit irgendwie beeinträchtigen.
Aber da sowieso nie jemand "in" und irgendwelche mathematischen Operatoren gleichzeitig benutzt ist's auch egal :D

Verfasst: Donnerstag 7. Mai 2009, 20:23
von birkenfeld
Nocta hat geschrieben:
birkenfeld hat geschrieben:Nein, aber es erfüllt das Konsistenzprinzip. Die Grammatik spezifiziert
Konsistenz im Sinne von Widerspruchsfrei oder Vollständigkeit oder was ist genau gemeint?
Eher im Sinne von "es sind keine zusätzlichen Ausnahmen nötig". "Konsequenz" wäre vielleicht sogar das richtigere Wort.