Python, probleme de type...
Résolu/Fermé
pyhtnewbie
-
10 mars 2010 à 11:57
heyquem
heyquem
- Messages postés
- 759
- Date d'inscription
- mercredi 17 juin 2009
- Statut
- Membre
- Dernière intervention
- 29 décembre 2013
A voir également:
- Python, probleme de type...
- Le langage Python est faiblement typé - Conseils pratiques - Mythes et légendes
- Python, probleme de type... ✓ - Forum - Python
- Python changer le type d'une variable ✓ - Forum - Python
- Python object of type 'int' has no len() - Forum - Programmation
- Un équivalent au type() de Python en C++ ? ✓ - Forum - C++
4 réponses
heyquem
10 mars 2010 à 13:54
- Messages postés
- 759
- Date d'inscription
- mercredi 17 juin 2009
- Statut
- Membre
- Dernière intervention
- 29 décembre 2013
10 mars 2010 à 13:54
Bonjour,
De quel problème parles-tu ? Il faut indiquer ce qui ne va pas, et même poster le message d'erreur pour être aidé plus facilement.
Python a une gestion des erreurs très intéressante , il faut en profiter. Non seulement en postant le message d'erreur, mais en l'analysant. Ça m'étonnerait que sur un programme aussi simple, le message d'erreur ne permette pas de comprendre rapidement la source d'un problème.
J'ai essayé ton code: il tourne correctement. Pas vu de problème.
Par contre il peut être amélioré dans sa rédaction.
Inutile de faire
Il faut prendre l'habitude de te dire que Python ne laisse pas au progammeur la charge de taches aussi bas niveau. Il y a plus d'aisance à utiliser Python. Le I=len(n)-1 , il le fait lui même dans xarnge(len())
for i in xrange(1,4) signifie que i prend les valeurs 1, 2,3 et s'arrète AVANT 4
for i in xrange(4) signifie que i prend les valeurs 0,1,2,3. Le zéro comme premier argument est implicite.
for i in xrange(1,16,3) sgnifie que le pas d'itération est 3: i prend les valeurs 1,4,7,0,13 (il s'arrête AVANtT 16
Et ensuite, si tu veux itérer en sens inverse, Python s'en occupe aussi
for i in xrange(20,12,-3) : i prend les valeurs 20,18,16,14 (il s'arrête AVANT 12)
Donc ton code peut devenir:
Ensuite, il faut t'imprégner de l'esprit Python:
quand le programme s'y prête , on a la facilité de pouvoir itérer sur les objets eux mêmes et non pas leur indice dans une liste:
On itère sur les objets mais ça n'empêche pas de sélectionner les objets par jeu d'indices:
donne
artichaut
456
vinaigrette
89
Et avec des pas
donne
artichaut
vinaigrette
salami
donne
876
12
89
456
donne
876
coriandre
12
salami
89
vinaigrette
456
artichaut
18
Ton code peut donc encore se simplifier en
Ce n'est pas fini, on peut encore simplifier. Mais je te laisse absorber ceci.
PS
jette un œil sur la fonction enumerate() : elle est très très utile, et très rapide, et peut être utilisée pour ton code
De quel problème parles-tu ? Il faut indiquer ce qui ne va pas, et même poster le message d'erreur pour être aidé plus facilement.
Python a une gestion des erreurs très intéressante , il faut en profiter. Non seulement en postant le message d'erreur, mais en l'analysant. Ça m'étonnerait que sur un programme aussi simple, le message d'erreur ne permette pas de comprendre rapidement la source d'un problème.
J'ai essayé ton code: il tourne correctement. Pas vu de problème.
Par contre il peut être amélioré dans sa rédaction.
Inutile de faire
I=len(n)-1 while I>=0: .... I=I-1 ....
Il faut prendre l'habitude de te dire que Python ne laisse pas au progammeur la charge de taches aussi bas niveau. Il y a plus d'aisance à utiliser Python. Le I=len(n)-1 , il le fait lui même dans xarnge(len())
for i in xrange(1,4) signifie que i prend les valeurs 1, 2,3 et s'arrète AVANT 4
for i in xrange(4) signifie que i prend les valeurs 0,1,2,3. Le zéro comme premier argument est implicite.
for i in xrange(1,16,3) sgnifie que le pas d'itération est 3: i prend les valeurs 1,4,7,0,13 (il s'arrête AVANtT 16
Et ensuite, si tu veux itérer en sens inverse, Python s'en occupe aussi
for i in xrange(20,12,-3) : i prend les valeurs 20,18,16,14 (il s'arrête AVANT 12)
Donc ton code peut devenir:
# coding: utf-8 def coef(x,n): C=0 F=0 for I in xrange( len(n)-1,-1,-1): A=n[I] int(A) F=F+A*(x**C) C=C+1 return F
Ensuite, il faut t'imprégner de l'esprit Python:
quand le programme s'y prête , on a la facilité de pouvoir itérer sur les objets eux mêmes et non pas leur indice dans une liste:
liste = [18,'artichaut',456,'vinaigrette',89,'salami',12,'coriandre',876] for u in liste: print u
On itère sur les objets mais ça n'empêche pas de sélectionner les objets par jeu d'indices:
liste = [18,'artichaut',456,'vinaigrette',89,'salami',12,'coriandre',876] for u in liste[1:5]: print u
donne
artichaut
456
vinaigrette
89
Et avec des pas
liste = [18,'artichaut',456,'vinaigrette',89,'salami',12,'coriandre',876] for u in liste[1:7:2]: print u
donne
artichaut
vinaigrette
salami
liste = [18,'artichaut',456,'vinaigrette',89,'salami',12,'coriandre',876] for u in liste[8:0:-2]: print u
donne
876
12
89
456
liste = [18,'artichaut',456,'vinaigrette',89,'salami',12,'coriandre',876] for u in liste[::-1]: print u
donne
876
coriandre
12
salami
89
vinaigrette
456
artichaut
18
Ton code peut donc encore se simplifier en
# coding: utf-8 def coef(x,n): C=0 F=0 for A in n[::-1]: F=F+A*(x**C) C=C+1 return F
Ce n'est pas fini, on peut encore simplifier. Mais je te laisse absorber ceci.
PS
jette un œil sur la fonction enumerate() : elle est très très utile, et très rapide, et peut être utilisée pour ton code
Pour l'éreur:
line 10, in coef
F=F+A*(x**C)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Si je rajoute:
F=F+int(A*(x**C))
Il n'y a plus d'ereurs mais le résultat est tout a fait abérant...
Sinon merci beaucoup pour tes conseil de simplification: je débute et toute aide est la bien venue :) !!!
line 10, in coef
F=F+A*(x**C)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Si je rajoute:
F=F+int(A*(x**C))
Il n'y a plus d'ereurs mais le résultat est tout a fait abérant...
Sinon merci beaucoup pour tes conseil de simplification: je débute et toute aide est la bien venue :) !!!
Je vient de trouver la solution et je suis vraiment trop bete: j'ai écrit int(A) au lieu de A=int(A), éreur que tu a dus corriger sans meme t'en rendre compte ^^'...En tout cas je travaille sur tes simplifications, merci!
heyquem
10 mars 2010 à 15:14
- Messages postés
- 759
- Date d'inscription
- mercredi 17 juin 2009
- Statut
- Membre
- Dernière intervention
- 29 décembre 2013
10 mars 2010 à 15:14
Non , je n'ai rien corrigé: en recopiant ton code, en mettant l'indentation correcte, et run, ça m'affiche 4.
Mais je passe une liste d'entiers à la fonction, pas une liste de strings. Le int(A) ne sert à rien dans ce cas et ne cause pas non plus d'errreur
Est-ce que toi tu passes une liste de strings ?
# coding: utf-8 def coef(x,n): I=len(n)-1 C=0 F=0 while I>=0: A=n[I] int(A) F=F+A*(x**C) I=I-1 C=C+1 return F print coef(3,[1,-2,1])
Mais je passe une liste d'entiers à la fonction, pas une liste de strings. Le int(A) ne sert à rien dans ce cas et ne cause pas non plus d'errreur
Est-ce que toi tu passes une liste de strings ?