Python, probleme de type... [Résolu/Fermé]

Signaler
-
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
-
Bonjour,
je voudrait faire une fonction en python telle que:
Polynome : P(x) = anx**n + an−1x**(n-1) + ...a1x + a0. La fonction recoit une liste de
coefficients [an, an−1, a1, a0] et une valeur x et retourne la valeur de P(x). Par exemple
pour la liste de coefficients [1,−2, 1] et x = 3, la fonction retourne 4.
J'ai écrit ceci:
# 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
J'ai l'impression que le probleme vient du fait qu'il considere A comme un string alors que je pense l'avoir bien convertit...
Merci d'avance pour vos réponses.

4 réponses

Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
125
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
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 :) !!!
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!
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
125
Non , je n'ai rien corrigé: en recopiant ton code, en mettant l'indentation correcte, et run, ça m'affiche 4.

# 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 ?