Java-Ausdruck in Python "umwandeln"

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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Samstag 15. März 2008, 12:00

Ein Freund fragte mich gestern, ob ich nicht zufällig Java kann. Da das schon 4 Jahre zurückliegt und ich Java verzweifelt aufgegeben habe...

Jedenfalls... hab ich mir die Aufgaben dennoch mal angeguckt.

int i=100; System.out.printIn(i+(i++)+"+i");

zuerst dachte ich, die Ausgaben sei "201 + i"

Ein weiterer Freund, der sich mit Java besser auskennt, meinte gestern abend, dass das i++ ja das i schon verändert und daher "202+i". Berichtigte gerade aber auf "200 + i"

JETZT würde ich das gern mit Python nachvollziehen ... aber ein

Code: Alles auswählen

i = 100
print "%i +i" %(i+(i+1))
Ist ja nicht das selbe wie ein i++ ... wie kann ich mit Python ein i++ am besten umsetzen? bzw. den ganzen Ausdruck?

Wie finde ich eigentlich ständig irgendwas was mich vom Diplomarbeit zu Ende schreiben abhält und viel viel spannender erscheint?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. März 2008, 12:28

Nach meiner Einschätzung lässt sich das so gar nicht übertragen.

Der Java-Code liefert in der Tat 200+i.
Ich verstehe das so, dass i++ zwar eigentlich eine Zuweisung ist, aber offensichtlich auch als Ausdruck geduldet wird, dann aber ohne vorherige Inkrementierung.

Dem Java i++ entspricht in Python ein i+=1.
Das ist ebenfalls eine Zuweisung, und zwar NUR eine Zuweisung.
Baut man das in den Code ein, funktioniert es nicht:

Code: Alles auswählen

>>> i=100
>>> print "%i +i" %(i+(i+=1))
  File "<stdin>", line 1
    print "%i +i" %(i+(i+=1))
                         ^
SyntaxError: invalid syntax
Die Variante mit dem %(i+(i+1)) trifft es sicher nicht, denn erstens kommt etwas anderes dabei heraus und zweitens könnte man es genau so ja auch in Java machen:

Code: Alles auswählen

int i = 100;
System.out.println(i+(i+1)+"+i");
Wobei die inneren Klammern in beiden Sprachen überflüssig sind und in beiden Fällen "201+i" ausgegeben wird.

Edit: Eben ist mir noch etwas eingefallen.
Java kennt ja sowohl ein i++ als auch ein ++i, wobei im letzteren Fall ZUERST inkrementiert und dann ausgewertet wird, im ersteren Fall genau umgekehrt.

Evtl. ging es bei dem Code des OP genau darum, diesen Unterschied wahrzunehmen und zu verstehen. Ersetzt man nämlich im Java-Code das i++ durch ++i, dann wird "201+i" ausgegeben.
Zuletzt geändert von numerix am Samstag 15. März 2008, 12:39, insgesamt 1-mal geändert.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Samstag 15. März 2008, 12:37

pütone hat geschrieben:Nach meiner Einschätzung lässt sich das so gar nicht übertragen.

Der Java-Code liefert in der Tat 200+i.

Dem Java i++ entspricht in Python ein i+=1.

[\quote]

Eben, das ist mir auch klar, aber ein i+=1 hab ich nicht ohne Syntaxfehler in den Ausdruck bekommen^^
pütone hat geschrieben:

Code: Alles auswählen

>>> i=100
>>> print "%i +i" %(i+(i+=1))
  File "<stdin>", line 1
    print "%i +i" %(i+(i+=1))
                         ^
SyntaxError: invalid syntax
Das hatte ich auch schon probiert ^^
pütone hat geschrieben: Die Variante mit dem %(i+(i+1)) trifft es sicher nicht, denn erstens kommt etwas anderes dabei heraus und zweitens könnte man es genau so ja auch in Java machen.
Ich weiß ....

Ich suche daher nach irgendeiner Möglichkeit diese Code irgendwie in Python umzusetzen
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. März 2008, 12:46

meneliel hat geschrieben:Ich suche daher nach irgendeiner Möglichkeit diese Code irgendwie in Python umzusetzen
Eine Entsprechung gibt es m.E. nicht, weil es dazu eines Ausdruck bedürfte, der erst ausgewertet wird und anschließend inkrementiert.

Am nächsten kommt dem für meinen Geschmack ein

Code: Alles auswählen

print "%i+i" %(i+(lambda i:i+1)(i))
aber es liefert eben "201+i", weil der lambda-Ausdruck ja erst ausgewertet wird, nachdem er seine Arbeit schon verrichtet hat. Natürlich kann man ihn mit i-1 statt mit i aufrufen, wenn man die "200+i" sehen will ...
BlackJack

Samstag 15. März 2008, 14:28

Ich würde auch sagen, dass ``i++`` kann man in Python so nicht umsetzen, da dies Unterstützung vom Compiler benötigt, der das inkrementieren bzw. in Python neu binden, erst nach dem Ausdruck macht.

Ich denke mal gerade weil man damit so undurchsichtige Sachen machen kann, ist dieses Konstrukt nicht in Python enthalten.

In Python müsste man das also so schreiben:

Code: Alles auswählen

    i = 100
    print "%d+i" % (i + i)
    i += 1
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 16. März 2008, 10:28

Die semantisch korrekte Umsetzung in Python wäre

Code: Alles auswählen

i = 100
def _():
    global i
    t = i
    i += 1
    return t
print str(i + _()) + "+i"
Das "i++" ist ein post-inkrement-Operator, für den es in Python keine Entsprechung gibt. Er liefert den Wert der Variable und erhöht danach (als Seiteneffekt) ihren Wert. Insbesondere entspricht "i++" nicht "i += 1"! Die Entsprechung von "i += 1" wäre "++i".

Stefan
BlackJack

Sonntag 16. März 2008, 11:01

Meine Umsetzung ist etwas lesbarer und auch korrekt. Als ganzes hat es die gleiche Semantik. Wenn Du Haare spalten möchtest, dann bitte auch richtig und per Zugriff über den Stackframe, damit das auch in Funktionen/Methoden klappt. ;-)
maxip
User
Beiträge: 61
Registriert: Dienstag 11. März 2008, 09:43

Montag 17. März 2008, 10:06

i++ ist doch sowas von einfach umzusetzen: im Ausdruck selbst steht nur i, danach einfach eine Zeile machen in der i um eins erhoeht wird

bei ++i muss dies eben vorher gemacht werden


kann man in python halt nicht alles in einem Ausdruck schreiben, aber ansonsten ist das kein problem
Antworten