Seite 1 von 1

08 -> invalid token?

Verfasst: Donnerstag 19. März 2009, 13:30
von Nocta
Ist mir grad beim Rumspielen aufgefallen, kann mir das jemand erklären?

Code: Alles auswählen

>>> 01
1
>>> 05
5
>>> 08
SyntaxError: invalid token
Edit: 00-07 klappt, 08/09 nicht mehr.

Verfasst: Donnerstag 19. März 2009, 13:32
von Leonidas
In Python 2.x werden Zahlen die mit einer Null anfangen als Oktalzahlen gesehen, propier mal ``010``, was sicher nicht das ist, was du erwartest.

Und in den Oktalzahlen gibt es nunmal keine 8, daher der Syntaxfehler.

In Python 3.x sieht das ganze Verhalten etwas anders aus.

Verfasst: Donnerstag 19. März 2009, 13:36
von Nocta
Ah, das klingt einleuchtend ;)
Ich dachte erst, dass Python automatisch die Nullen wegstreicht, um einen validen Integer daraus zu machen.

Nächstes mal werd ich auch dran denken, die Python-Version mit anzugeben, da sich solche Dinge (wie zB von dir angesprochen in Python 3) ändern.

Verfasst: Donnerstag 19. März 2009, 14:54
von birkenfeld
Leonidas hat geschrieben:In Python 3.x sieht das ganze Verhalten etwas anders aus.
Ja, da ists ein SyntaxError :)

Verfasst: Donnerstag 19. März 2009, 16:12
von Nocta
Ich frag mich sowieso, warum man Oktalzahlen in die Syntax integrieren sollte.
Ein eigener Datentyp oder so ist ja okay, aber es bringt ja nichts ein einziges Zahlensystem in die Syntax zu integrieren.

Verfasst: Donnerstag 19. März 2009, 16:18
von cofi
Nocta hat geschrieben:es bringt ja nichts ein einziges Zahlensystem in die Syntax zu integrieren.
Darum ja auch 3:
Dezimal
Oktal
und Hexadezimal:

Code: Alles auswählen

In [1]: 0xA
Out[1]: 10

Verfasst: Donnerstag 19. März 2009, 16:19
von birkenfeld
Ein eigener Datentyp ist unsinnig, um alternative Zahlensysteme zu unterstützen. 10 oktal ist kein anderer Typ, sondern ein Integer wie auch 8 dezimal. Wenn, dann eine Konversionsfunktion von einem String, wie es int() macht.

Und nein, oktal ist nicht das einzige Zahlensystem außer dem dezimalen, das Python versteht: 0x10 ist hexadezimal, und 0b10 (ab 2.6) ist binär. In Python3 ist 0o10 oktal. Warum man das möchte? Weil Zahlensysteme mit Basen, die Potenzen von 2 sind, oftmals viel einfacher ausdrücken, was man dem Computer vermitteln will ;-)

Verfasst: Donnerstag 19. März 2009, 16:36
von Nocta
Okay gut, ein eigener Datentyp wäre nicht so sinnhaftig. Ich meine ja auch eher sowas wie eine Umwandlungsfunktion.
Dass der Computer mit solchen Zahlensystemen gut zurecht kommt, leuchtet mir auch ein.

Wenn ich so drüber nachdenke, ist es vielleicht doch recht sinnvoll ;)
Ich dachte erst, dass nur das Oktalsystem unterstüzt würde, weil die Syntax in der Form '08' kein zweites Zahlensystem daneben unterstützen könnte. Mit den Os, X'en und Bs find ich das aber gut.

Ich hab jetzt auch gemerkt, dass int auch gleichzeitig eine Umwandlungsfunktion ist:

Code: Alles auswählen

>>> int('01110', 2)
14
Es müsste nur noch eine geben, mit der's auch andersrum geht;) Also von dez->x anstatt nur von x->dez.

Verfasst: Donnerstag 19. März 2009, 16:54
von BlackJack
@Nocta: Der umgekehrte Weg ist eine beliebte Hausaufgabe. Einfach mal die Suchfunktion hier im Forum benutzen und Du findest Unmengen an Implementierungen. :-)

Verfasst: Donnerstag 19. März 2009, 17:01
von Nocta
Ja kann man natürlich selbst implementieren ;)
Bietet Python keine solche Funktion?

Ein int(string/int, frombase, tobase) wäre imo sowieso besser. Aber man wird sich schon was dabei gedacht haben :p

Verfasst: Donnerstag 19. März 2009, 17:32
von Leonidas
Nocta hat geschrieben:Ein int(string/int, frombase, tobase) wäre imo sowieso besser. Aber man wird sich schon was dabei gedacht haben :p
Naja, tobase ist ja egal und das interessiert den Programmierer ja nicht, zu welcher Basis ein Integer im Computer gespeichert wird.
Ein Integer ist erstmal eine Ganzzahl. Dezimal, oktal oder binär sind nur Darstellungen dieser Zahl. Der zweite Parameter bei ``int()`` gibt ja nur an, welche Darstellung man als Eingabe hat.

Außerdem, was sollte ``int("01011011", 2, 16)`` denn zurückgeben?

Verfasst: Donnerstag 19. März 2009, 17:44
von Nocta
Leonidas hat geschrieben:Außerdem, was sollte ``int("01011011", 2, 16)`` denn zurückgeben?
Die Hexadezimal Darstellung von 01011011?
Und ``int("1011011", 8, 16)`` sollte zB das selbe tun, nur dass es die Zahl im 1. Parameter als Oktalzahl, nicht als Binärzahl ansieht.

Verfasst: Donnerstag 19. März 2009, 17:53
von Leonidas
Nocta hat geschrieben:
Leonidas hat geschrieben:Außerdem, was sollte ``int("01011011", 2, 16)`` denn zurückgeben?
Die Hexadezimal Darstellung von 01011011?
Also einen String? Ich hätte da eher ein Objekt vom Typ ``int`` erwartet.
Nocta hat geschrieben:Und ``int("1011011", 8, 16)`` sollte zB das selbe tun, nur dass es die Zahl im 1. Parameter als Oktalzahl, nicht als Binärzahl ansieht.
Und was würde mir nun ein ``int`` geben, also eine Ganzzahl, bei der ich unabhängig von der Darstellung 1 hochzählen kann?

Ich denke du solltest nochmal den Unterschied zwischen der Zahl und der Darstellung einer Zahl überdenken.

Verfasst: Donnerstag 19. März 2009, 18:00
von Nocta
Ich kenne schon den Unterschied zwischen der Darstellung der Zahl und einer Zahl selbst.
Aber okay, es ist wirklich ein bisschen widersprüchlich, wenn int() einen String zurückgibt. Daran hab ich gar nicht gedacht.
Andererseits kann man einen "hexadezimalen String" theoretisch auch als Integer behandeln. Dann hätte der Typ int halt noch eine optionale Basis-Angabe. Aber ich sehe ein, dass es so, wie es jetzt ist, gut ist.
Dann könnte man aber immer noch eine andere Funktion einführen, die ein tobase als Parameter nimmt. Aber vermutlich gibt's sowas eh schon in irgendeinem Modul?

Verfasst: Donnerstag 19. März 2009, 18:05
von Leonidas
Nocta hat geschrieben:Andererseits kann man einen "hexadezimalen String" theoretisch auch als Integer behandeln.
Oder eine Hashmap als Array. Kennen wir das nicht irgendwoher?

Verfasst: Freitag 20. März 2009, 00:36
von lunar
Nocta hat geschrieben:Andererseits kann man einen "hexadezimalen String" theoretisch auch als Integer behandeln.
Was würdest du denn dann von folgender Operation erwarten:

Code: Alles auswählen

"0xF0" + "0xF"
Eine Zahl dem Wert der Addition entsprechend? Eine Zeichenkette? Welche Zeichenkette? Das Ergebnis der Konkatenation "0xF00xF" oder doch lieber das arithmetische "0xFF"?

Verfasst: Freitag 20. März 2009, 11:01
von birkenfeld
Natürlich eine Superposition aus beidem, die bei entsprechender Benutzung in das gewünschte Ergebnis kollabiert.