08 -> invalid token?

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.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

08 -> invalid token?

Beitragvon Nocta » Donnerstag 19. März 2009, 13:30

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 19. März 2009, 13:32

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Donnerstag 19. März 2009, 13:36

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

Beitragvon birkenfeld » Donnerstag 19. März 2009, 14:54

Leonidas hat geschrieben:In Python 3.x sieht das ganze Verhalten etwas anders aus.


Ja, da ists ein SyntaxError :)
Dann lieber noch Vim 7 als Windows 7.

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

Beitragvon Nocta » Donnerstag 19. März 2009, 16:12

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Donnerstag 19. März 2009, 16:18

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

Beitragvon birkenfeld » Donnerstag 19. März 2009, 16:19

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

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

Beitragvon Nocta » Donnerstag 19. März 2009, 16:36

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.
BlackJack

Beitragvon BlackJack » Donnerstag 19. März 2009, 16:54

@Nocta: Der umgekehrte Weg ist eine beliebte Hausaufgabe. Einfach mal die Suchfunktion hier im Forum benutzen und Du findest Unmengen an Implementierungen. :-)
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Donnerstag 19. März 2009, 17:01

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 19. März 2009, 17:32

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?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Donnerstag 19. März 2009, 17:44

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 19. März 2009, 17:53

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Beitragvon Nocta » Donnerstag 19. März 2009, 18:00

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 19. März 2009, 18:05

Nocta hat geschrieben:Andererseits kann man einen "hexadezimalen String" theoretisch auch als Integer behandeln.

Oder eine Hashmap als Array. Kennen wir das nicht irgendwoher?
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]