WHAOU! Python et ses surprises de transtypage avec int() Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
tony
Membre
Membre
Messages : 447
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

salut,
je qualifierai ce genre de problème de "tordu"! Vraiment. [ finalement, non, une fois l'explication trouvée ]

J'ai écrit un script pour transformer les nombres d'une liste en nombres entiers, et donc j'utilise la fonction int() censée faire la conversion d'une chaîne de caractères ou d'un nombre quelconque en un nombre entier, si j'interprète correctement ceci, source = https://www.pythontutorial.net/python-b ... ython-int/
Introduction to the Python int() constructor
The int() accepts a string or a number and converts it to an integer.
Effectivement int(6.3) donne 3, mais si je place ça dans un script, rien ne va plus:

Code : Tout sélectionner

numbers = input("enter a list of numbers separated by commas: ")
           
enter a list of numbers separated by commas: 1, 6.3
list = numbers.split(",")
     
list_integers = []
for numbers in list:
           integers = int(numbers)
           list_integers.append(integers)
           print(list_integers)
  
[1]
Traceback (most recent call last):
  File "<pyshell#91>", line 2, in <module>
    integers = int(numbers)
ValueError: invalid literal for int() with base 10: ' 6.3'
j'ai trouvé la réponse ici https://stackoverflow.com/questions/184 ... th-base-10 mais je ne la comprends pas. Quel est ce tour de passe-passe, qui fonctionne très bien d'ailleurs, qui consiste à d'abord convertir un nombre avec virgule à l'aide de float() puis de revenir à int() pour faire la conversion recherchée? [ en fait float () convertit'6.3', qui n'est pas un nombre mais une chaîne, en un nombre flottant que int() pourra évaluer puis traiter]

Et donc en modifiant la ligne "integers = int(numbers)" qui devient "integers = int(float(numbers))" tout fonctionne.

PS: openclassrooms ne précisait pas que sa liste dans "input" ne devait contenir que des nombres entiers. Je me demande comment les autres utilisateurs de leur site ont réagi.
Debian 12/ Xfce
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 6132
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Bonjour,
tes question sur Python deviennent très spécifique à ce langage, tu trouveras peu de réponses ici.
Tu devrais t'inscrire sur un site d'aide python en français.
Tu peux aussi utiliser un LLM comme le chat de mistral.
Mais il ne faut pas prendre les réponses comme une vérité absolue, mais plutot comme un guide pour te donner des pistes à vérifier.
tony
Membre
Membre
Messages : 447
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

je me suis inscrit sur un forum du site python.org. On va voir ce qu'ils en pensent.

PS: la solution qu'on m'a proposée est la même que celle du site stackoverflow, et voici les explications qui vont avec :
int()can operate in two ways.

If you pass in a floating point number, it will truncate the number and return an integer value.

If you pass in a string that represents an integer, it will convert the string to a number and return that integer.

It does not take a string that represents a floating point number and do both steps of converting from the string and truncation. If you want to do that, you might instead do int(float(x)).
Debian 12/ Xfce
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 6132
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Tu peux consulter la doc python
https://docs.python.org/3/library/functions.html
Et pense à bien documenter ton code. Par ex depuis python 3, tu peux directement indiquer le type de chaque variable, y compris la valeur de sortie d'une fonction. C'est une bonne habitude à prendre, ça aide parfois à structurer sa pensée
Prend aussi l'habitude d'utiliser toujours la même convention pour nommer tes variables. Il en existe plusieurs , choisis en une, et utilise là.
https://peps.https://fr.python-3.com/?p ... /pep-0008/
tony
Membre
Membre
Messages : 447
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

piratebab a écrit : 02 oct. 2025, 23:21 .......
Et pense à bien documenter ton code. Par ex depuis python 3, tu peux directement indiquer le type de chaque variable, y compris la valeur de sortie d'une fonction
maintenant que c'est devenu un peu plus clair je m'aperçois que la sortie de nombres.split(",") est en fait une liste dont les éléments sont du type"str" même si elle est constituée de nombres en langage courant.

Code : Tout sélectionner

>>> liste = nombres.split(",")
>>> print(liste)
['1', ' 6.3']
>>> type(liste[1])
<class 'str'>
Dans int() on entre donc une chaîne représentant des nombres décimaux ou entiers, pas les nombres eux-mêmes, ce que je pensais au tout début, et c'était mon erreur. Et donc, tu as effectivement raison de souligner que le type de la variable qu'on entre et la valeur de sortie qui va être traitée plus en aval sont importants pour comprendre ce qu'il se passe. Ça s'applique bien au cas présent.

Il me reste quand même un point à éclaircir, que je n'arrive pas à trouver dans la doc: pourquoi une chaîne représentant une valeur décimale ne peut pas être directement traitée par la fonction int(). La doc doit bien le signaler à quelque part, mais je ne le vois pas. Je reprendrais ça après un temps de décantation.

PS:

Code : Tout sélectionner

>>> x = str('10')
>>> type(x)
<class 'str'>
>>> print(x)
10
>>> 
pas facile de se convaincre que 10 est du type chaîne de caractères, je ne me trompe pas?
Debian 12/ Xfce
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 6132
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Quand tu écris "10", c'est ton biais social qui fait que tu l’interprètes directement comme un nombre décimal, une quantité.
Le logiciel n'a pas ce biais social, c'est à toi de lui dire ce que c'est. Ca peut très bien être un nombre binaire , soit 2 en décimal ....
Lorsque tu pratiques plusieurs langages de programmations, tu découvres qu'il existe des langages typés (comme le C), ou non typés.
Le langages typés sont très strict, tu dois systématiquement définir manuellement le type de ta variable, et il ne peux plus changer.
Les non typés essaient de deviner le type en fonction du contexte. Ca simplifie la vie du codeur, mais c'est source d'erreurs difficiles à trouver.
C'est pour ça que dans python3, il est recommandés d'indiquer le type de la variable, mais ce n'est qu'a titre d"info afin de faciliter la lecture du code.
https://docs.python.org/3/library/typing.html
C'est une bonne habitude à prendre
Je ne suis pas du tout un expert des langages informatiques, mais j'ai appris de mes erreurs ...
tony
Membre
Membre
Messages : 447
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

bon, je pense avoir compris où ça bloquait:
Converting a string to a number involves interpreting the characters in the string as a numerical value
[correspond à ceci dans la doc De Python]
If the argument is not a number or if base is given, then it must be a string, bytes, or bytearray instance representing an integer in radix base.
Or ce qui entrait dans int() dans mon script était la chaîne '6.3'. Le point décimal n'a aucune valeur numérique, int() ne peut donc interpréter cette chaîne.

J'ai jeté un œil à https://docs.python.org/3/library/typing.html, ça n'a pas l'air évident à faire en pratique, mais lorsque j'en aurai fini avec le cours de openclassrooms, j'y reviendrai. Je vais plutôt me concentrer sur ce qui m'a posé problème avec la fonction int() et identifier le type des variables que je manipule en ajoutant des instructions telles que print(type()). À voir ce que ça donne en pratique.

PS: le lien dans
Prend aussi l'habitude d'utiliser toujours la même convention pour nommer tes variables. Il en existe plusieurs , choisis en une, et utilise là.
https://peps.https://fr.python-3.com/?p ... /pep-0008/
n'est pas ou plus valable, mais je pense que la convention dite "du serpent" va me convenir.
Debian 12/ Xfce
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 6132
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Je ne sais plus si c'est celle qui est recommandée par la communauté Python, mais l’essentiel est de rester cohérent dans tout ce qui écrit
tony
Membre
Membre
Messages : 447
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

piratebab a écrit : 03 oct. 2025, 16:25 Je ne sais plus si c'est celle qui est recommandée par la communauté Python, mais l’essentiel est de rester cohérent dans tout ce qui écrit
je viens de faire une révision, nécessaire, et j'ai vu ceci, que j'avais loupé lors de la première lecture:
Suivez une convention d’appellation commune. Il est recommandé de suivre la convention d'appellation du snake case en Python, conformément à la PEP8 qui est le standard de la syntaxe en Python
Debian 12/ Xfce
Répondre