Python : un problème sûrement très con

Répondre
Partager Rechercher
Salut la populace Jolienne,

J'apprend le Python pour le fun (et pour le boulot) et je rencontre un problème que je n'arrive pas à contourner

le code

Code:
j=0

while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    a=a.split()
    b=b.split()
    p1,c1,E=a[0],a[1],a[2]
    p2,c2,D=b[0],b[1],b[2]
    try :
        p1,c1,E,p2,c2,D=float(p1),float(c1),float(E),float(p2),float(c2),float(D)
        j+=1
    except TypeError:
        print("Les données rentrées sont incorrectes")

Mon try except ne marche pas, si je tourne et que je rentre des infos non chiffrées, il s'arrête sur la tentative de conversion en float
Je pense que je n'ai pas très bien compris le fonctionnement

Et aussi une autre question : au lieu de faire 6 float, j'ai une autre option ?
Code:
j=0

while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    a=a.split()
    b=b.split()
    p1,c1,E=a[0],a[1],a[2]
    p2,c2,D=b[0],b[1],b[2]
    try:
        p1,c1,E,p2,c2,D=float(p1),float(c1),float(E),float(p2),float(c2),float(D)
        j+=1
    except:
        print("Les données rentrées sont incorrectes")
Cela devrait marcher. Ton TypeError semble être le problème.

En plus court :
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    try:
        [p1,c1,E,p2,c2,D,j]= list(map(float,a.split()+b.split()))+[1]
    except:
        print("Les données rentrées sont incorrectes")
Par contre cela ne teste pas s'il y a 3 valeurs dans a et 3 valeurs dans b.

Une autre version qui vérifie aussi le nombre de valeurs dans a et dans b :
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
    except:
        print("Les données rentrées sont incorrectes")
Je ne teste pas c car tu ne le testes pas dans ton code d'origine.

Dernière modification par Melchiorus ; 06/05/2019 à 18h46.
Citation :
Publié par Melchiorus
Code:
j=0

while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    a=a.split()
    b=b.split()
    p1,c1,E=a[0],a[1],a[2]
    p2,c2,D=b[0],b[1],b[2]
    try:
        p1,c1,E,p2,c2,D=float(p1),float(c1),float(E),float(p2),float(c2),float(D)
        j+=1
    except:
        print("Les données rentrées sont incorrectes")
Cela devrait marcher. Ton TypeError semble être le problème.

En plus court :
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    try:
        [p1,c1,E,p2,c2,D,j]= list(map(float,a.split()+b.split()))+[1]
    except:
        print("Les données rentrées sont incorrectes")
Par contre cela ne teste pas s'il y a 3 valeurs dans a et 3 valeurs dans b.

Une autre version qui vérifie aussi le nombre de valeurs dans a et dans b :
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
    except:
        print("Les données rentrées sont incorrectes")
Je ne teste pas c car tu ne le testes pas dans ton code d'origine.
Ah oui la V2 de ta proposition c'était un des trucs à ajouter dans mon problème : vérifier qu'il y ait bien trois valeurs.
Je n'avais pas du tout pensé à un parcours avec un for
Il me reste encore des tonnes à apprendre
Du coup en supprimant le typeerror ça passe

en fait mon c je le testais différemment :

Code:
while i!=1:
        c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
        if c=="":
            P=10
            i+=1
        else:
            try:
                P=int(c)
                i+=1
            except:
                print("Merci d'entrez un nombre ou de laissez vide")
                continue
j'avais l'impression que ça marchait (mais probablement simplifiable)


et le code en entier :
Code:
j=0
i=0
while j!=1:
  while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")

    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
        print("les données sont correctes")
    except:
        print("Les données rentrées sont incorrectes")

    while i!=1:
        c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
        if c=="":
            P=10
            i+=1
        else:
            try:
                P=int(c)
                i+=1
            except:
                print("Merci d'entrez un nombre ou de laissez vide")
                continue

M=0 #On initialise
K=p1 #On définit K et L comme les prix totaux des véhicules (qui, à l'achat, sont égaux au prix d'achat)
L=p2

while L>K: #Tant que la valeur cumulée du diesel est > à celle de l'essence

    K=p1+c1*M*E/100 #On recalcule K et L (première boucle pour m=0)
    L=p2+c2*M*D/100
    M+=P #On incrémente M du pas P définis dans la première partie
    print (M) #on peut supprimer cette ligne pour masquer l'affichage des calculs, qui, selon la valeur du pas peuvent être longs


print("La distance à parcourir avant que le diesel ne devienne intéressant est de {}km".format(M))
Je garde ta proposition pour le test qui me simplifie la vie !
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
        print("Les données sont correctes")
    except:
        print("Les données rentrées sont incorrectes")
P=10
while j!=2:
    c=input("Par défaut, le pas en km à tester est fixé à 10km, si vous souhaitez le changer, entrez la valeur, sinon valider.")
    if c=="":
        j=2
    else:
        try:
            P=int(c)
            j=2
        except:
            print("Merci d'entrez un nombre ou de laissez vide")
Par contre je ne comprends pas pourquoi tu le fais de cette manière.
Le c (ou P) ne sert à rien.
Pour déterminer quand le diesel devient intéressant, tu as juste à résoudre un système de deux équations à deux inconnues.
Cette boucle avec un pas de P semble inutile.
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
    except:
        print("Les données rentrées sont incorrectes")
if c1*E<c2*D:
    print("La distance à parcourir avant que l'essence ne devienne intéressant est de {}km".format(int(max(0,100*(p2-p1)/(c1*E-c2*D)))))
if c1*E==c2*D:
    if p1<p2:
        print("L'essence est tout le temps plus intéressant")
    if p1==p2:
        print("Les deux coûtent le même prix")
    if p1>p2:
        print("Le diesel est tout le temps plus intéressant")
if c1*E>c2*D:
    print("La distance à parcourir avant que le diesel ne devienne intéressant est de {}km".format(int(max(0,100*(p2-p1)/(c1*E-c2*D)))))

Dernière modification par Melchiorus ; 06/05/2019 à 21h09.
Citation :
Publié par Melchiorus
Par contre je ne comprends pas pourquoi tu le fais de cette manière.
Le c (ou P) ne sert à rien.
Pour déterminer quand le diesel devient intéressant, tu as juste à résoudre un système de deux équations à deux inconnues.
Cette boucle avec un pas de P semble inutile.
Code:
j=0
while j!=1:
    a=input("entrez les carac du véhicule essence sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    b=input("Entrez les carac du véhicule diesel sous la forme <prix d'achat> <consommation mixte> <tarif de l'essence>")
    try:
        [[p1,c1,E],[p2,c2,D],[j]]=[[float(i) for i in a.split()],[float(i) for i in b.split()],[1]]
    except:
        print("Les données rentrées sont incorrectes")
if c1*E<c2*D:
    print("La distance à parcourir avant que l'essence ne devienne intéressant est de {}km".format(int(max(0,100*(p2-p1)/(c1*E-c2*D)))))
if c1*E==c2*D:
    if p1<p2:
        print("L'essence est tout le temps plus intéressant")
    if p1==p2:
        print("Les deux coûtent le même prix")
    if p1>p2:
        print("Le diesel est tout le temps plus intéressant")
if c1*E>c2*D:
    print("La distance à parcourir avant que le diesel ne devienne intéressant est de {}km".format(int(max(0,100*(p2-p1)/(c1*E-c2*D)))))
L'algo et le python arrivent doucement aux programmes l'an prochain chez nous : je préfère une méthode plus longue mais plus simple.

D'ailleurs j'ai aussi écris une version bien plus longue mais plus lisible du programme (avec autant de variables que de paramètres mais cela fait beaucoup d'inputs) pour les élèves.

Cette version c'est du perfectionnement pour moi histoire de level up+ mon niveau pour quand le geek de la classe va me coincer sur Python qu'il utilise depuis ses 3 ans ou il a développé son premier bot

D'ailleurs si je devais acheter un livre sur Python tu aurais un conseil ?
Citation :
Publié par Fugo
L'algo et le python arrivent doucement aux programmes l'an prochain chez nous : je préfère une méthode plus longue mais plus simple.

D'ailleurs j'ai aussi écris une version bien plus longue mais plus lisible du programme (avec autant de variables que de paramètres mais cela fait beaucoup d'inputs) pour les élèves.

Cette version c'est du perfectionnement pour moi histoire de level up+ mon niveau pour quand le geek de la classe va me coincer sur Python qu'il utilise depuis ses 3 ans ou il a développé son premier bot

D'ailleurs si je devais acheter un livre sur Python tu aurais un conseil ?
Si tu veux des livres sur Python, il y a la collection O'Reilly sur Humble Bundle : https://www.humblebundle.com/books/p...n=tile_index_3

C'est extrêmement touffu, dans les 400-500 pages par livre, à lire d'ailleurs de préférence en pdf sur PC parce que y a pas mal de liens aussi.
Citation :
Publié par Fugo
je préfère une méthode plus longue mais plus simple.
Elle n'est pas si compliquée (en fait c'est juste une résolution d'inéquation avec une seule inconnue donc du niveau d'un élève en seconde).

Mon autre problème c'est que tu n'envisages que le cas "le diesel est plus avantageux à partir d'un certain nombre de km" alors qu'il y a en tout 5 cas.
Oui en fait le postulat de départ de l'exercice est naze : la voiture essence est moins chère à l'achat et on prend le prix du carburant comme étant une constante.
A partir de la, on a un prix total (achat+carburant) qui ne fait que monter pour les deux véhicules.

Dans le livre où j'ai tapé l'exo (qui se fait papier) je pense que l'idée est de faire réfléchir sur un certain nombre de km total pour un véhicule voire par an pour aller plus loin

Avec les données actuelles (diesel<essence au litre encore chez nous) on arrive forcément à un kilométrage ou il devient intéressant d'acheter un diesel

Mais je suis d'accord que comme beaucoup d'exos qui se veulent réalistes c'est pas fantastique

@Von merci je regarderai ça, c'est gros !

Dernière modification par Fugo ; 07/05/2019 à 14h14.
Citation :
Publié par Fugo
Oui en fait le postulat de départ de l'exercice est naze : la voiture essence est moins chère à l'achat et on prend le prix du carburant comme étant une constante.
A partir de la, on a un prix total (achat+carburant) qui ne fait que monter pour les deux véhicules.

Dans le livre où j'ai tapé l'exo (qui se fait papier) je pense que l'idée est de faire réfléchir sur un certain nombre de km total pour un véhicule voire par an pour aller plus loin
Par curiosité, c'était dans quel livre ?
Citation :
Publié par Melchiorus
Par curiosité, c'était dans quel livre ?
Euh ... Un random bouquin de maths

di essence diesel.png

L'utilisation de Python est bien entendu overkill mais le but est de réfléchir à une méthode d'automatisation basée sur un algorithme qui teste toutes les solutions possibles jusqu'à tester la bonne comme étant une méthode de résolution possible.
Bien sûr, on peut poser le problème sous forme mathématiques, mais l'essence de nos """""nouveaux programmes""""" est de travailler la mise en algorithme (et si possible de les programmer en Python) de ces problèmes """"complexes"""" pour les élèves.

Comme d'hab, moi il me faut du concret pour apprendre, j'ai un peu du mal à suivre un truc genre MOOC sur le Python alors je mets les mains dans le cambouis
Citation :
Publié par Melchiorus
Je suis prof de maths en lycée, c'est pourquoi je voulais la référence exacte pour savoir si je l'avais.
Yep, mais pour être honnête, on a choisis ça en formation avant les vacances (sur les nouveaux programmes de LP, vous devez déjà avoir Python depuis quelques temps non?) et on a pris une photo de l'exercice. Du coup impossible de retrouver là comme ça.

Du coup si tu enseignes déjà Python, ça passe comment avec les élèves ?
Citation :
Publié par Fugo
Du coup si tu enseignes déjà Python, ça passe comment avec les élèves ?
En fait non, les nouveaux programmes s'appliquent l'année prochaine donc je n'ai jamais enseigné Python aux élèves.

(En plus, je préfère enseigner aux élèves comment programmer sur leur calculatrice à la place.)
Ah, j'avoue que j'suis pas trop au fait sur ça, madame n'a que du collège et moi je suis en LP.


Pour la calculatrice, on réfléchit en équipe sur ce qu'on va demander l'an prochain, jusqu'à maintenant graph25 faisait le bon compromis Q/P pour nos élèves qui les perdent/volent etc) mais l'an prochain y'aura pas de graph25 avec Python alors on réfléchit ... Numworks ? Graph 35 ? C'est 70€ et ça fait chier surtout qu'on va pas s'en servir beaucoup je pense ...
Enfin à voir

En tout cas Python est un langage assez sympa à étudier quand on aime ça, je me marre bien depuis un mois et je trouve que c'est assez abordable quand on cherche pas à tout optimiser (aka on peut faire marcher assez vite des trucs simples même si on pourrait faire la même chose en 10 fois moins de lignes)
Juste deux remarques, comme le reste a été répondu par @Melchiorus :

  • Essaie de suivre une norme, la plus répandue est pep8 (qui vaut ce qu'elle vaut). Tu as des linter automatiques selon ton ide/éditeur de texte, ça rends le code plus lisible. Typiquement ça aère ton code avec des espaces judicieusement placés.
  • Utilises plutôt des `break` pour sortir de tes boucles plutôt que d'assigner une variable sans la réutiliser (et un `while True` si tu as besoin d'une boucle infinie).
Citation :
Publié par Whinette
  • Utilises plutôt des `break` pour sortir de tes boucles plutôt que d'assigner une variable sans la réutiliser (et un `while True` si tu as besoin d'une boucle infinie).
Oui enfin ça c'est très subjectif. Il y a beaucoup de personnes qui sont totalement contre l'utilisation des break (dont moi).
Encore plus quand cela rentre dans le cadre de l'enseignement des algorithmes.
Citation :
Publié par Fugo
L'utilisation de Python est bien entendu overkill mais le but est de réfléchir à une méthode d'automatisation basée sur un algorithme qui teste toutes les solutions possibles jusqu'à tester la bonne comme étant une méthode de résolution possible.
Bien sûr, on peut poser le problème sous forme mathématiques, mais l'essence de nos """""nouveaux programmes""""" est de travailler la mise en algorithme (et si possible de les programmer en Python) de ces problèmes """"complexes"""" pour les élèves.
Plutôt que tester toutes les solutions, un truc itératif qui augmente (ou diminue) le kilométrage si l'essence est moins (ou plus) chère que le diesel serait plus adapté et ça aurait plus de sens algorithmique.
On peut introduire par la suite les cas particuliers quand l'algo sort des résultats aberrants (kilométrage négatif ou boucle infinie) : égalité entre les deux, voiture essence plus chère ou essence moins chère que le gasoil.
Une boucle while avec un nombre d'itérations maximum est une bonne habitude à prendre, tu peux leur même dire que quand leur smartphone rame c'est qu'un programmeur a oublié de faire ça
Citation :
Publié par kermo
Plutôt que tester toutes les solutions, un truc itératif qui augmente (ou diminue) le kilométrage si l'essence est moins (ou plus) chère que le diesel serait plus adapté et ça aurait plus de sens algorithmique.
On peut introduire par la suite les cas particuliers quand l'algo sort des résultats aberrants (kilométrage négatif ou boucle infinie) : égalité entre les deux, voiture essence plus chère ou essence moins chère que le gasoil.
Une boucle while avec un nombre d'itérations maximum est une bonne habitude à prendre, tu peux leur même dire que quand leur smartphone rame c'est qu'un programmeur a oublié de faire ça
Tu veux dire de mettre en place une méthode de pseudo dichotomie ? On teste une valeur au hasard de km et selon où on se place (E>D ou E<D) on ajuste cette valeur en la divisant par deux ou en l'augmentant de 50% ?

Et la boucle while avec nombre maximum d'itération intuitivement j'aurai tendance à la fabriquer en ajoutant une nouvelle variable locale qui s'incrémente tout le temps, mais il y a mieux pour faire ça ?
Citation :
Publié par Fugo
Tu veux dire de mettre en place une méthode de pseudo dichotomie ? On teste une valeur au hasard de km et selon où on se place (E>D ou E<D) on ajuste cette valeur en la divisant par deux ou en l'augmentant de 50% ?

Et la boucle while avec nombre maximum d'itération intuitivement j'aurai tendance à la fabriquer en ajoutant une nouvelle variable locale qui s'incrémente tout le temps, mais il y a mieux pour faire ça ?
Le while à itérations limitées j'aurais aussi tendance à le faire avec une variable counter = 0, et incrémentation counter +=1 à chaque itération, et enfin un if counter == 10, break. Y a probablement plus élégant ceci dit

Après, dans le même esprit, pourquoi ne pas du coup faire simplement un for i in range(0, 10) ?
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés