Forum: PC-Programmierung Pyrhon: Auswertung logischer Ausdruck


von Dennis S. (eltio)


Lesenswert?

Guten Morgen,
wie wird der folgende (und ähnliche) Audruck von Python ausgewertet?
1
(7+3) != 10 > 4

Ergebnis ist False.

Gruß
Dennis

von Carl D. (jcw2)


Lesenswert?

Versuch mal in Textform darzulegen, was das tun soll.

So wie es da steht:  False > 4        scheint False akzeptabel

: Bearbeitet durch User
von Dennis S. (eltio)


Lesenswert?

Carl D. schrieb:
> Versuch mal in Textform darzulegen, was das tun soll.

Variante 1 (Auswertung von links):
1. Ist 10 ungleich 10?    --> False
2. Ist False größer 4?    --> False (?)

Variante 2 (Auswertung von rechts):
1. Ist 10 größer 4?       --> True
2. ist 10 ungleich True?  --> False (?)

Edit 1: Gibt es eine inheränte Regel (wie in C), dass alles ungleich 0 
True ist?

Edit 2: Mhh... True > 4 gibt auch False

Gruß
Dennis

: Bearbeitet durch User
von Karl (Gast)


Lesenswert?

True wir als 1, False als 0 interpretiert.

True == 1     -> True
False == 0    -> True

Dennis S. schrieb:
> (7+3) != 10 > 4

-> 0 > 4      -> False

von Dennis S. (eltio)


Lesenswert?

Karl schrieb:
> True wir als 1, False als 0 interpretiert.
>
> True == 1     -> True
> False == 0    -> True
>
> Dennis S. schrieb:
>> (7+3) != 10 > 4
>
> -> 0 > 4      -> False

Okay.. also konvertiert Python munter zwischen Boolean und Integer hin 
und her..
Vielen Dank.

von Karl (Gast)


Lesenswert?

Dennis S. schrieb:
> Okay.. also konvertiert Python munter zwischen Boolean und Integer hin
> und her..
> Vielen Dank.

So wie es halt dokumentiert ist. C macht ja auch nichts anderes.

https://www.hdm-stuttgart.de/~maucher/Python/html/Datentypen.html

von Dieter F. (Gast)


Lesenswert?


von Dirk B. (dirkb2)


Lesenswert?

!= und > haben die Gleiche Priorität (vgl. Punkt vor Strich). Dann wird 
von links nach rechts ausgewertet

von Dennis S. (eltio)


Lesenswert?

Vielen Dank für die Antworten.

Kern der Frage war dann eigentlich, ob es möglich ist numerische und 
logische Werte miteinander zu vergleichen.
--> geht, aufgrund der implizizen Umwandlung von False nach 0 und True 
nach 1.

Gruß
Dennis

von Dirk B. (dirkb2)


Lesenswert?

Dennis S. schrieb:
> Kern der Frage war dann eigentlich, ob es möglich ist numerische und
> logische Werte miteinander zu vergleichen.
Warum hast du dann die Frage nicht gestellt?

> --> geht, aufgrund der implizizen Umwandlung von False nach 0 und True
> nach 1.

Es wird auch 0 nach False und der Rest nach True gewandelt.

von Dieter F. (Gast)


Lesenswert?

Dennis S. schrieb:
> Kern der Frage war dann eigentlich, ob es möglich ist numerische und
> logische Werte miteinander zu vergleichen.

Dennis S. schrieb:
> wie wird der folgende (und ähnliche) Audruck von Python ausgewertet?

Das war der ursprünglichen Fragestellung nur schwer zu entnehmen :-)

von Dennis S. (eltio)


Lesenswert?

Ich habe die Frage nicht gestellt weil diese sich erst im Laufe der 
Diskussion als URSACHE für das beobachtete Verhalten herausgestellt hat. 
Ich kannte aber nur die WIRKUNG für die ich eine Erklärung gesucht habe. 
Henne und Ei.. ;-)

Nochmals, wo lieg mein Denkfehler?
1
var1 = 15
2
var2 = 3
3
result = (var1 + var2) != 10 > 4
4
print( result )

Ausgabe (Python 2.7) ist True. Meine Erwartung ist aber
1) 18 ist ungleich 10 --> True
2) True wird nach 1 konvertiert
3) 1 größer als 4 ist False
4) Ausgabe ist False

Gruß
Dennis

von Dieter F. (Gast)


Lesenswert?

Dennis S. schrieb:
> Ausgabe (Python 2.7) ist True. Meine Erwartung ist aber
> 1) 18 ist ungleich 10 --> True
> 2) True wird nach 1 konvertiert
> 3) 1 größer als 4 ist False
> 4) Ausgabe ist False

Ja, da muss man tiefer schauen :-)

https://docs.python.org/2/reference/expressions.html#comparisons

Der Interprter zerlegt die Zuweisung in 2 Ausdrücke (mit entsprechendem 
"Wahrheitsgehalt"-Ergebnis) und vergleicht/verknüpft die Ergebnisse mit 
AND:

18 != 10 AND 10 > 4

Da beides wahr ist kommt auch TRUE heraus.

von nicht"Gast" (Gast)


Lesenswert?

Moin,

ist eher so, das 4 nach boolean umgebandelt wird.
Drehe den Ausdruck mal um

4 < (17 != 10)

und es kommt false raus.

PS: Deswegen kann ich diese untypisierte Sch**ße nicht leiden. In C# 
hätte der Compiler gemeckert.

von nicht"Gast" (Gast)


Lesenswert?

Ok, falsch. (s.o.)

von Dieter F. (Gast)


Lesenswert?

nicht"Gast" schrieb:
> Drehe den Ausdruck mal um
>
> 4 < (17 != 10)>
> und es kommt false raus.

Aber nur wegen der Klammer!

von Dennis S. (eltio)


Lesenswert?

Dieter F. schrieb:
> 18 != 10 AND 10 > 4
Pffff... Okay, ich sehe ein, dass es für Bereichsabfragen (10<x<70) ganz 
nett ist.. aber hier fande ich es wenig intuitiv.

Gut, dass ich hauptsächlich C schreibe. Das ist einfach. :-D

Gruß
Dennis

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Ich kenne mich ja mit Python nicht so aus, aber ein Compiler, der was 
auf sich hält, sollte auch ordentlich meckern. Und zwar in der Form, als 
ob Du Äpfel mit Birnen vergleichst.
Du mach doch folgendes:
(7+3)   ... Zahl
10 > 4  ... Logisch
(Zahl) != (Logisch)      ist Mist

von Dieter F. (Gast)


Lesenswert?

Dennis S. schrieb:
> aber hier fande ich es wenig intuitiv.

Nein - da bin ich anderer Meinung. Nur so ist es korrekt - es wäre 
falsch, einen Wahrheitswert (in diesem Fall repräsentiert durch 0 oder 1 
- weil es eben eine Maschine/ein Computer ist) mit einer Zahl zu 
vergleichen.

Wie sieht denn das Ergebnis Deiner Beispiel-Zuweisung in C aus?

von Dennis S. (eltio)


Lesenswert?

Amateur schrieb:
> Ich kenne mich ja mit Python nicht so aus [...]
Jepp.. hat aber auch nicht richtig mit Python zu tun! Es sind 
unterschiedliche Konzepte, beide mit Vor- und Nachteilen. 
Einstiegsliteratur:
https://de.wikipedia.org/wiki/Dynamische_Typisierung

Dieter F. schrieb:
> Nein - da bin ich anderer Meinung. Nur so ist es korrekt - es wäre
> falsch, einen Wahrheitswert (in diesem Fall repräsentiert durch 0 oder 1
> - weil es eben eine Maschine/ein Computer ist) mit einer Zahl zu
> vergleichen.
>
> Wie sieht denn das Ergebnis Deiner Beispiel-Zuweisung in C aus?
Abgesehen von der dynamischen Typisierung, war das "Erweitern" des 
Ausdrucks zu mehreren Ausdrücken für mich einfach nicht ersichtlich.
Um das in C zu schreiben, müsste ich vorher wissen was ich erreichen 
will! Das war hier nicht der Fall. Ich habe lediglich ein bisschen 
rumgespielt und geguckt was passiert.

Gruß
Dennis

von Timm R. (Firma: privatfrickler.de) (treinisch)


Angehängte Dateien:

Lesenswert?

Hallo,

interessantes Beispiel. Ich muss zugeben, ich wäre wohl selbst unter 
starkem Alkoholeinfluss nie auf die Idee gekommen, so einen Ausdruck zu 
schreiben!

Ich habe das mal in Swift ausprobiert, dort gibt es zwei 
Fehlermeldungen.

Zum einen, dass „er” int nicht nach bool konvertieren kann und zum 
anderen, dass Reihungen nicht-assoziativer Operatoren nicht erlaubt 
sind.

vlg
 Timm

von Karl (Gast)


Lesenswert?

Dennis S. schrieb:
> Ich habe lediglich ein bisschen
> rumgespielt und geguckt was passiert.

Wenn ich in C lediglich ein bisschen Rumspiele und Wert an der Stelle 12 
aus einem Array der länge 10 haben möchte passieren auch die 
wunderbarsten Dinge. Python hätte gemeckert, irgendwas mit out of range. 
Da hat halt jede Sprache ihre Tücken.

Aber es gibt bestimmt schon 10 Threads Pytonh vs. C. Da kann mann alle 
Vor- und Nachteile nachlesen.

von Dennis S. (eltio)


Lesenswert?

@Timm Reinisch:
Mir ist der Bezug zum Thema nicht ganz klar... Python und Swift sind 
doch unterschiedliche Sprachen!

Nettes Feature der IDE (Values am Rand). Welche ist das?

Gruß
Dennis

von Dennis S. (eltio)


Lesenswert?

Karl schrieb:
> Aber es gibt bestimmt schon 10 Threads Pytonh vs. C. Da kann mann alle
> Vor- und Nachteile nachlesen.

Und das hier sollte nicht der 11. werden! Deswegen: die Frage ist 
geklärt. Alles was jetzt kommt ist Offtopic...

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Dennis S. schrieb:
> @Timm Reinisch:
> Mir ist der Bezug zum Thema nicht ganz klar... Python und Swift sind
> doch unterschiedliche Sprachen!

da hast Du recht. Ich wollte nur den Punkt, der aufkam, untermauern, 
dass man berechtigterweise die Auffassung vertreten kann, dass sich die 
Frage nach der Auswertung nicht stellen sollte, weil der Ausdruck 
schlicht Nonsens ist. Geht wohl etwas in Richtung ot, sorry.

Die IDE ist XCode.

vlg
 Timm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.