it-swarm.com.de

Was bedeuten Zahlen, die mit Python beginnen?

Wenn ich kleine Ganzzahlen mit einer 0 vor Python eingebe, ergeben sich merkwürdige Ergebnisse. Warum ist das?

>>> 011
9
>>> 0100
64
>>> 027
23

Hinweis: Python Version 2.7.3 Ich habe dies in Python 3.0 getestet und anscheinend ist dies jetzt ein Fehler. Also ist es etwas Versionsspezifisch. 

Edit: sie sind anscheinend noch ganze Zahlen:

>>> type(027)
`<type 'int'>`
50
Rob Volgman

Dies sind Zahlen, die in Basis 8 (Oktalzahlen) ... dargestellt werden.

011 ist gleich 1*(8**1) + 1*(8**0) = 9,

0100 ist gleich 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

027 ist gleich 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

49
unutbu

In Python 2 (und einigen weiteren Programmiersprachen) repräsentieren diese Oktalzahlen .

In Python 3 funktioniert 011 nicht mehr und Sie würden stattdessen 0o11 verwenden.

Als Antwort auf edit: und sie sind reguläre Ganzzahlen. Sie werden nur anders angegeben. und sie werden automatisch von Python in eine interne Ganzzahldarstellung konvertiert (die eigentlich base-2 ist, also sowohl 9 als auch 011 intern in 0b1001 konvertiert werden).

42
Michał Górny

Beide Python -Versionen 2 und 3 verstehen Oktale, die mit führenden '0o' und '0O' (Großbuchstaben o) geschrieben wurden. Verwenden Sie also immer if, wenn Sie mit Python 2.x arbeiten.

Verwenden Sie nur führende Nullen in Zahlen in Zeichenfolgen.

Sie können mit int () ganze Zahlen von jedem anderen Basissystem konvertieren.

>>> int(0o20)

16

Wenn Sie möchten, dass Ihre Ausgabe mit führenden Nullen angezeigt wird, definieren Sie sie wie folgt: Nummer mit führenden Nullen anzeigen

Wenn Sie jemals mit Postleitzahlen arbeiten möchten, sollten Sie sie in jeder Hinsicht als Zeichenfolgen behandeln.

9
ionn

Zahlen im numerischen Oktalsystem. Andere Präfixe sind 0x für hexadezimal und 0b für binär.

7
Zaur Nasibov

Dies sind Oktalzahlen (Basis 8, Werte 0 - 7)

Sie können eine Dezimalzahl mit der Funktion oct () in Oktal umrechnen.

In [125]: for i in range(10):
   .....:     print '{:5} {:5}'.format(i, oct(i))
   .....:
    0 0
    1 01
    2 02
    3 03
    4 04
    5 05
    6 06
    7 07
    8 010
    9 011

und konvertieren Sie einen Oktalwert in eine Ganzzahl mit der Funktion int () mit der entsprechenden Basis (8 in diesem Fall):

int(str(17), 8)
Out[129]: 15

Ein ähnlicher Satz von Regeln/Funktionen gilt für Hexadezimalzahlen (Basis 16), die die Funktion hex () verwenden.

6
Levon

Das ist sehr leicht. Sie sind Oktalzahlen.

http://en.wikipedia.org/wiki/Octal

Es gibt auch Nummern, die mit 0x beginnen. Sie sind Hexadezimalzahlen:

>>> 0x51
81
4
Igor Chubin

Es handelt sich offenbar um oktale Zahlen (Basis 8), und die 0 ist nur ein veraltetes Präfix, das Python 2 verwendet hat. 

In Python 3 müssen Sie stattdessen Folgendes schreiben: 0o11.

Sie sind immer noch Ganzzahlen, aber wenn Sie Operationen mit ihnen ausführen, erhalten Sie ein Ergebnis in regelmäßiger Basis-10-Form.

2
Rob Volgman

Ich habe es ausprobiert. Ich habe ein bisschen gelernt. Von Java kenne ich das als Fallstricke: Eine führende Null führt eine Oktalzahl ein. Ich habe Kollegen, die nicht resp. Ich weiß es nicht nach mehr als Jahren mit Java-Erfahrung.

Nun war ich interessant, was das Verhalten in Python ist. Ich weiß diese Änderung von Python 2 zu Python 3 zu schätzen. Es ist ein Fallstrick, den ich nie verstanden habe, warum Java (eine junge Sprache mit dem Schwerpunkt "Einfach sein") diese dumme Lösung von C übernehmen kann.

Eine führende Null als Präfix kann versehentlich eingegeben werden (schlechte Lösung). 0x für eine Hexadezimalzahl wird niemals versehentlich eingegeben (gute Lösung). Aber 0 und o sind zu ähnlich, daher denke ich, dass 0o23 in Python keine perfekte Lösung ist. 0c23 (o c tal) wäre meiner Meinung nach eine bessere Lösung.

0
Rudi

Die neueste Python-Spezifikation für Zahlenliterale ist in PEP-3127 "Integer-Literal-Unterstützung und -Syntax"

Die Syntax für 011 wurde in Python 3.0 entfernt. Die Syntax für 0o11 wurde in Python 2.6 hinzugefügt. Nach Python 3.0 wird nur diese unterstützt. Es gibt keinen __future__-Import in Python 2, der die Anzahl von Literalen mit führenden Nullen verbieten oder zumindest warnen würde. Entwickler müssen also wissen, was 011 bedeutet und dass es vermieden werden sollte (und dass es tatsächlich vermieden werden kann).

0