web-dev-qa-db-fra.com

Que signifient les nombres commençant par python?

Lorsque je tape de petits entiers avec un 0 devant en python, ils donnent des résultats étranges. Pourquoi est-ce?

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

Remarque: Python version 2.7.3 Je l’ai testé dans Python 3.0 et, apparemment, il s’agit maintenant d’une erreur. C'est donc quelque chose de spécifique à la version. 

Edit: ce sont apparemment encore des entiers:

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

Ce sont des nombres représentés en base 8 (nombres octaux) . Par exemple,

011 est égal à 1*(8**1) + 1*(8**0) = 9,

0100 est égal à 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

027 est égal à 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

49
unutbu

En Python 2 (et quelques autres langages de programmation), ceux-ci représentent nombres octaux .

En Python 3, 011 ne fonctionne plus et vous utiliseriez plutôt 0o11.

En réponse à edit: et ce sont des entiers normaux. Ils sont juste spécifiés de manière différente; et ils sont automatiquement convertis par Python en une représentation entière interne (qui est en réalité de base 2, donc 9 et 011 sont convertis en interne en 0b1001).

42
Michał Górny

Nombres en système numérique octal. Les autres préfixes sont 0x pour hexadécimal et 0b pour binaire.

7
Zaur Nasibov

Ce sont des nombres octaux (base 8, valeurs 0 - 7)

Vous pouvez convertir un nombre décimal en octal avec la fonction 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

et convertir une valeur octale en entier avec la fonction int () avec la base appropriée (8 dans ce cas):

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

Le même ensemble de règles/fonctions s’applique aux nombres hexadécimaux (base 16) avec la fonction hex () .

6
Levon

C'est très facile. Ce sont des nombres octaux.

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

Il y a aussi des nombres qui commencent par 0x. Ce sont des nombres hexadécimaux:

>>> 0x51
81
4
Igor Chubin

Ce sont apparemment des nombres octaux (base 8), et le 0 est simplement un préfixe obsolète utilisé par Python 2. 

En Python 3, vous devez écrire: 0o11 à la place.

Ce sont toujours des entiers, mais les opérations effectuées avec eux donneront un résultat sous forme régulière en base 10.

2
Rob Volgman

Je l'ai essayé. J'ai appris un peu. De Java, je sais que cela est un piège: un zéro non significatif introduit un nombre octal. J'ai des collègues qui n'ont pas resp. Je ne le sais pas après plus d’années d’expérience en Java.

À présent, le comportement de Python était intéressant. J'apprécie ce changement de Python 2 à Python 3. C'est un écueil, je n'ai jamais compris pourquoi Java (un jeune langage centré sur "être facile") pourrait reprendre cette stupide solution de C.

Un zéro comme préfixe peut être saisi accidentellement (mauvaise solution). 0x pour un nombre hexadécimal n'est jamais saisi accidentellement (bonne solution). Mais 0 et o sont similaires, donc je pense que 0o23 en Python n'est pas une solution parfaite. 0c23 (o c tal) serait à mon avis une meilleure solution.

0
Rudi

La dernière spécification Python pour les littéraux numériques se trouve dans PEP-3127 "Support et syntaxe de littéraux entiers"

La syntaxe pour 011 a été supprimée dans Python 3.0. La syntaxe de 0o11 a été ajoutée à Python 2.6 et est la seule prise en charge après Python 3.0. Il n'y a pas d'importation __future__ dans Python 2 qui interdirait ou au moins mettrait en garde sur les littéraux numériques précédés de zéros, les développeurs doivent donc savoir ce que 011 signifie et qu'il convient de l'éviter (et que cela peut réellement être évité).

0
Guido U. Draheim