syntaktisches

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Wenn du dich so darüber freust, so eine Möglichkeit entdeckt zu haben, wäre es fair, die Quelle zu nennen.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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.
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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ok, bei "den unendlichen Weiten des Internets" habe ich nicht so etwas offensichtliches erwartet.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten