37 votes

Comment expliquer la fonction int () à un débutant

Je suis de tutorat d'un voisin de l'enfant et nous avons été visiter l' int() de la fonction avant de l'utiliser avec input () qui retourne une chaîne de caractères. Nous avons essayé le suivant:

int(5)
int(5.5)
int('5')
int('5.5')

Les trois premiers retourné 5 comme prévu; le dernier a jeté l'erreur

ValueError: invalid littéral pour int() avec la base 10: '5.5'

Étant donné le comportement des trois premières lignes comment expliquer l'erreur d'un adolescent de 14 ans (fond = parle 4 langues, mais les maths, c'est pas si chaud)?

Mise à JOUR C# présente le même comportement: Convert.ToInt32("5.5"); envoyait le message d'erreur

Chaîne d'entrée n'était pas dans un format correct.

54voto

deceze Points 200115

En un mot: parce que c'est ce que la spec dit. C'est un utile état d'esprit pour entrer dans de toute façon. ;-)

Maintenant, pourquoi ne le spec dire? Il y a seulement un nombre fini de types de fonction peut accepter comme valide la saisie. L' int fonction tente de couvrir deux types de cas d'utilisation:

  1. convertir une chaîne de caractères de la représentation d'un entier en int
  2. un cast float valeur int, tronquant*

Le troisième cas d'utilisation, "conversion de la représentation de chaîne d'un nombre à virgule flottante à une int" n'est pas couvert par la spec, parce que la langue de créateurs ont décidé de ne pas le couvrir. Ce qui semble être une décision raisonnable à faire, car ils avaient besoin de tracer la ligne quelque part sur ce que les types de la fonction et de ne pas accepter. La représentation sous forme de chaîne d'un nombre à virgule flottante doit être analysé par l' float, pas int.

* En fait: tout objet qui a un __int__ méthode, mais permet de garder les choses simples.


Comme un contre-exemple, en PHP, vous pouvez essayez de lancer une chaîne à un int, et il va essayer de vous donner le meilleur match:

php > echo (int)'3.14';
3
php > echo (float)'3.14';
3.14
php > echo (int)'3 little pigs';
3
php > echo (int)'there are 3 little pigs';
0

Qui, honnêtement, est plutôt fou comportement, surtout que la dernière. Python a une stricte(re) type de système; si vous essayez d'analyser une chaîne de caractères comme un int, il doit être parfaitement valide la représentation d'un nombre entier, pas simplement quelque chose qui contient quelque part quelque chose qui peut être interprétée comme un nombre.

30voto

rodrigo Points 34500

Le problème avec cette ligne est qu'il y a deux conversions impliquées:

 "5.5" (string) -> 5.5 (float) -> 5 (int)
 

Les opérateurs de conversion dans Python n’appliqueront qu’une conversion à la fois, jamais deux chaînées, car cela pourrait prêter à confusion dans de nombreux cas.

La solution consiste à appliquer deux conversions imbriquées:

 int(float("5.5"))
 

5voto

el.pescado Points 7960

Vous pouvez consulter à docs:

class int(x=0)
class int(x, base=10)

Retourner un entier de l'objet construit à partir d'un nombre ou une chaîne de x, ou de retour 0 si aucun argument n'est donné. Si x est un numéro de retour x.__int__(). Pour les nombres à virgule flottante, ce qui tronque vers zéro.

Si x n'est pas un numéro, ou si la base est donné, alors x doit être une chaîne d'octets, ou bytearray instance représentant un entier littéral dans radix de la base. En option, la traduction littérale peut être précédé de + ou - (sans espace entre les deux) et entouré par des espaces. Un base-n littérale se compose de les chiffres de 0 à n-1, avec de a à z (ou Z) ayant des valeurs de 10 à 35. La base par défaut est 10. Les valeurs possibles sont 0 et 2-36. En Base 2, -8, et -16 littéraux peut éventuellement être le préfixe 0b/0B, 0o/0O, ou 0x/0X, comme avec les littéraux entiers dans le code. La Base de 0 signifie interpréter exactement comme un code littéral, de sorte que l'effectif de base est de 2, 8, 10 ou 16, et alors que int('010', 0) n'est pas légale, tout en int('010') est, ainsi en tant que int('010', 8).

Le type integer est décrit dans les Types Numériques - int, float, complexe.

(l'emphase est mienne)

Se référant à docs enseigne que dans la programmation, rien n'est vraiment arbitraire, et les compilateurs/interpréteurs sont simplement des règles suivantes.

3voto

Arne Points 4882

Je pense que je m'y prendrais bien en disant que int(5.5) et int('5.5') ne sont pas ce que vous êtes censé faire. La réponse de rodrigo donne une explication de la raison pour laquelle on travaille encore, mais en expliquant les choses à un enfant, j'essayais de garder les choses aussi explicites que possible, et les conversions implicites ne permettent pas de résoudre ce problème.

Alors, bien que trop explicite, pourquoi ne pas apprendre à aller comme ça:

int(floor(float('5.5')))

Au moins, tout est parfaitement clair et évident.

2voto

Peter Leupold Points 981

Je dirais que le problème derrière cela est la surcharge de l'opérateur , car il y a vraiment deux fonctions int () impliquées: une qui convertit une chaîne (si possible), l'autre qui tronque les flottants. Si l'enfant comprend les types, je pense qu'il / elle comprendra également ce qu'est la surcharge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X