2012-07-23 3 views
39

Quando digito i piccoli interi con uno 0 davanti in python, danno strani risultati. Perchè è questo?Cosa significano i numeri che iniziano con 0 in python?

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

Nota: Python versione 2.7.3 Ho testato questo in Python 3.0, ea quanto pare questo è ora un errore. Quindi è qualcosa di specifico della versione.

Edit: sono apparentemente ancora interi:

>>> type(027) 
`<type 'int'>` 

risposta

44

Questi sono numeri rappresentati in base 8 (numeri ottali). Ad esempio,

011 è uguale 1*(8**1) + 1*(8**0) = 9,

0100 è uguale a 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

027 è uguale 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

+0

Forse il doppio asterisco non è il modo più chiaro per indicare un esponenziale. Se si tratta di uno stoverno Stackoverflow o di un altro stantard, è necessario modificarlo. –

+11

@DavidL: In Python, ['**' è l'operatore esponenziale] (https://docs.python.org/2/tutorial/introduction.html#numbers) e ['^' è bit XOR] (https : //wiki.python.org/moin/BitwiseOperators). – unutbu

+1

Basta notare, in Python 3, l'immissione di '011' genererà' SyntaxError: invalid token'. Usa '0o11' invece. – chenghuayang

5

Questi sono numeri ottali (base 8, valori 0-7)

È possibile convertire un numero decimale in ottale con la funzione oct().

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 

e convertire un valore ottale a intero con la funzione int() con la base appropriata (8 in questo caso):

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

Il simile insieme di regole/funzioni si applicano per i numeri esadecimali (base 16) utilizzando la funzione hex().

5

Numeri nel sistema numerico ottale. Altri prefissi sono 0x per esadecimale e 0b per binario.

+3

E notare che in Python 3, gli zeri iniziali non sono consentiti e devi usare '0o' per ottale. –

34

In Python 2 (e alcuni altri linguaggi di programmazione), questi rappresentano octal numbers.

In Python 3, 011 non funziona più e si utilizzerà invece 0o11.

In risposta alla modifica: e sono numeri interi regolari. Sono solo specificati in modo diverso; e vengono automaticamente convertiti da Python in una rappresentazione intera (che è in realtà base-2, quindi sia 9 sia 011 vengono convertiti internamente in 0b1001).

2

Sono numeri ottali (base 8) e lo 0 è solo un prefisso obsoleto utilizzato da Python 2.

In Python 3 è necessario scrivere: 0o11.

Sono ancora interi ma eseguendo operazioni con essi si otterrà un risultato in forma base-10 regolare.

4

Entrambe le versioni Python 2 & 3 interpretano ottale scritto con iniziali '0o' e '0O' (maiuscolo o), quindi sii l'abitudine di usare se si sta lavorando anche con Python 2.x.

Utilizzare solo zeri iniziali nei numeri nelle stringhe.

È possibile convertire numeri interi da qualsiasi altro sistema di base con int().

>>> int(0o20)

16 

Se volete che il vostro output per visualizzare con gli zeri, poi definirlo per questa risposta: Display number with leading zeros

Se mai intenzione di lavorare con i codici di avviamento postale, è meglio trattare li come stringhe in tutti i modi.