1
votes

Pourquoi la valeur de base de int () est-elle limitée entre 36 et 2?

Je trouve que lorsque j'exécute l'expression suivante en python

ValueError: int() base must be >= 2 and <= 36, or 0

j'obtiens l'erreur suivante:

int(33, base=100)

Je ne pourrais pas trouver une explication à cette limitation; une autre question Stack Overflow sur le même message d'erreur ne Je n'ai pas mentionné pourquoi l'argument de base est limité à cette plage.


0 commentaires

3 Réponses :


5
votes

L'argument base à int est destiné à être utilisé lors de l'analyse d'une chaîne, pas lors du passage d'un int à int :

>>> int('ff', 16)
255

C'est une convention bien établie d'utiliser a, b, c, ..., z pour les chiffres représentant 10, 11, 12, ..., 35, mais il n'y a pas de convention pour quel symbole utiliser pour le chiffre 36 en base 37.


0 commentaires

2
votes

Ceci est une convention de mise en œuvre pratique. Qu'envisagez-vous comme jeu de caractères pour la base 100? :-)

L'utilisation de chiffres et de l'alphabet entier est assez courante, donc la fonction base avec un ensemble contigu de valeurs de base acceptables a implémenté la fonctionnalité jusque-là. La base 1 est simplement len ​​(arg).

Il existe également une convention pour l'encodage en base 64; sans convention pour les valeurs 37-63, cependant, la fonction base a laissé la valeur radix-64 pour une interface séparée.


4 commentaires

Les conventions de codage base64 (pluriel!) Sont incompatibles avec le mappage habituel des symboles aux chiffres, aussi - par exemple, le symbole '0' ne représente pas la valeur 0 dans le codage base64.


Bien - cela n'empêcherait pas base d'effectuer la conversion, mais la fonctionnalité ne serait pas fluide avec un changement de paramètre apparemment petit.


@Prune j'étais juste en train de l'expérimenter. car mathématiquement, il est possible de l'encoder à ce niveau, vérifiait cela en python si cela est possible ou non.


Bien sûr. C'est certainement possible - mais vous devez avoir une convention pour la représentation textuelle. Il y a une interprétation évidente si le texte d'entrée est limité aux 36 ou 64 caractères déjà acceptés. Cependant, comme nous n'avons pas de convention pour les autres caractères dans un ensemble arbitrairement long, les fonctions intégrées ne supportent pas ces bases. Écrire le vôtre est facile, si vous voulez cette fonctionnalité.



3
votes

Tout d'abord: vous ne pouvez spécifier une base pour int () que lors de la conversion de chaînes en nombres. Supposons que vous ayez une chaîne avec un nombre hexadécimal , donc base 16:

>>> int('zz', 36)
1295

Ce résultat diffère considérablement de la même chaîne interprétée comme une base différente:

>>> int('2a', 11)
32
>>> int('2a', 29)
68

Vous n'avez besoin de la base d'un nombre entier que lorsque présente la valeur visuellement ou lors de l'analyse de la valeur entière à partir d'une représentation sous forme de chaîne. Vous pouvez afficher une valeur entière de différentes manières, mais un objet int est la valeur, pas une présentation visuelle, et n'a pas de base et vous ne pouvez pas changer cette base.

L'extension logique lorsqu'elle supporte déjà la notation hexadécimale (chiffres 0-9 et lettres AF), est également supportée en utilisant les lettres GZ, et 10 chiffres et 26 lettres permet d'utiliser la base 36:

>>> int('2a', 16)
42

D'autres bases devraient utiliser des symboles non alphanumériques, pour lesquels il n'y a pas de classement prédéfini clair.

Vous ne pouvez pas avoir une base inférieure à 2; vous ne pouvez pas compter avec un seul chiffre, la valeur de 0 ne changera pas.


1 commentaires

merci pour l'explication, car mathématiquement, il est possible d'encoder une valeur élevée, a été confus pourquoi il est limité ici en python.