Was macht dieser Ausdruck ?

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
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Wie lässt sich dieses Ausruck:

Code: Alles auswählen

abs(n) != 1 and "s" or ""
in normale If-statements umwandeln ? Also nen Mehrzeiler.

Lg. Septias
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist das selbe wie

Code: Alles auswählen

["", "s"][abs(n) != 1]
oder

Code: Alles auswählen

"s"*(abs(n) != 1)
oder

Code: Alles auswählen

"s" if abs(n) != 1 else ""
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

[s]bin gerade verwirrt... warum ergibt `True and "s"` `s` als Ergebnis?[/s]

Gruß, noisefloor

EDIT: Verwirrung hat sich erledigt. RTFM hilft halt ;-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und die Negation der Bedingung zeigt, warum das schon immer ein doofer Trick war:

Code: Alles auswählen

abs(n) == 1 and '' or 's'
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Natürlich ist alles richtig im Sinne der Grammatik, aber wenn denn eine Variante pythonisch ist, dann diese:

Code: Alles auswählen

"s" if abs(n) != 1 else ""
Alles andere kostet potentiell reviewende Kollegen Zeit, was nicht unbedingt beliebt macht. Und selbst diese wird durch Negation (vgl. __deets__) noch leichter verständlich:

Code: Alles auswählen

"" if abs(n) == 1 else "s"
Python ist das egal, aber der menschliche Leser kann dem besser folgen.
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Dieser Ausrdruck ist im datetime.timedelta Modul xD, dachte eigentlich die könnten programmieren :P ^^
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Septias
User
Beiträge: 80
Registriert: Freitag 24. Juni 2016, 19:15

Sirius3 hat geschrieben: Dienstag 7. August 2018, 16:48 Das ist das selbe wie

Code: Alles auswählen

["", "s"][abs(n) != 1]
oder

Code: Alles auswählen

"s"*(abs(n) != 1)
oder

Code: Alles auswählen

"s" if abs(n) != 1 else ""
woher "weiß" das Programm im zweiten Codeschnipsel, dass es bei False einen leeren String zurück geben muss ? Und wo kann ich die Syntax mit dem Stern nachschlagen Kenn die nämlich noch nicht ^^ (Die Zweite auch nicht, aber die schien mir relativ logisch)
Für alle meine Codebeispiele gilt: Äußert bitte jegliche Art von Verbesserungsvorschlägen. Ich versuche immer meinen Stil zu verbessern und wenn man mir einfach sagt, was ich falsch machen, ist es um einiges einfacher, als wenn ich es mühselig selber herausfinden muss :-)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Trick ist immer, dass False der Zahl 0 und True der Zahl 1 entspricht.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Septias: Die können Programmieren und hatten als sie das geschrieben haben noch keinen bedingten Ausdruck zur Verfügung. Die Syntax gab es zu dem Zeitpunkt noch nicht.

Die „Syntax mit dem Stern“ ist einfach Multiplikation von Zeichenketten mit einer ganzen Zahl und wie Sirius3 schon geschrieben hat, das Wahrheitswerte auch ganze Zahlen sind:

Code: Alles auswählen

In [3]: 'x' * 10
Out[3]: 'xxxxxxxxxx'

In [4]: 'x' * 1
Out[4]: 'x'

In [5]: 'x' * 0
Out[5]: ''

In [6]: 'x' * True
Out[6]: 'x'

In [7]: 'x' * False
Out[7]: ''

In [8]: True == 1
Out[8]: True

In [9]: isinstance(True, int)
Out[9]: True

In [10]: issubclass(bool, int)
Out[10]: True
Das Wahrheitswerte von Zahlen abgeleitet sind, hat auch wieder historische Gründe, denn auch `bool`, und `True` und `False` gab es nicht von Anfang an in Python. Zu Beginn wurden da wie in C 1 und 0 für genommen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten