Meilleur moyen d'écrire

autant pour la lisibilité que pour les perf

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonjour,

alors que je fesais un exercice de prog en python je me suis demandé quelle était la meilleure manière d’écrire une boucle qui s’arrête si un nombre négatif est donnée par l'utilisateur

j'hésite entre cette ecriture :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
while not inputNote < 0 :
    print("Nbr note :", len(notes), "| Note la plus élevée :", highest, "| Note la plus basse :", lowest, "| Moyenne :", average)
    inputNote = float(input(">"))
    if inputNote < 0 :
        continue

    notes.append(inputNote)
    if inputNote > highest :
        highest = inputNote

    if inputNote < lowest :
        lowest = inputNote

    average = sum(notes)/len(notes)

et celle là :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
while True :
    print("Nbr note :", len(notes), "| Note la plus élevée :", highest, "| Note la plus basse :", lowest, "| Moyenne :", average)
    inputNote = float(input(">"))
    if inputNote < 0 :
        break

    notes.append(inputNote)
    if inputNote > highest :
        highest = inputNote

    if inputNote < lowest :
        lowest = inputNote

    average = sum(notes)/len(notes)

J'attends vos réponses pour me fixer et vous remercie d'avance

Édité par LudoBike

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0
Staff

La première est pas du tout clair. Faire un continue pour passer dans le test du while c'est moche car tu sais que ça va couper, donc autant faire le break et mettre un while True. L'autre solution pour garder le test (qui serait plus lisible en mettant while inputNote > 0: plutôt que le not) serait de faire la demande de nouvelles note en fin de boucle. Tu pourrais ainsi éviter le break.

Côté perf on s'en fout un peu, tu fais des io avec l'utilisateur. Ce sera toujours un millions de fois plus lent que les pouillemme que tu pourrais gagner avec une solution ou une autre.

Enfin, perso ce genre de code je le sépare en général en deux : une partie qui manipule les io et qui va remplir une liste, puis en dessous une autre qui va évaluer les stars. C'est beaucoup plus clair que de mélanger la demande d'Io et les évaluations au passage (d'autant que la tu calcul des moyennes pour rien, seule la dernière compte)

edit:

en gros moi je ferais ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
input_note = 0
notes = []
while input_note >= 0:
    input_note = float(input(">"))
    notes.append(input_note)
notes.pop(-1)

average = sum(notes)/len(notes)
highest = max(notes)
lowest = min(notes)

print("Nbr note :", len(notes), "| Note la plus élevée :", highest, "| Note la plus basse :", lowest, "| Moyenne :", average)

Au passage inputNote c'est pas un nom PEP8 compliant

Édité par Kje

+3 -0

en gros moi je ferais ça :

1
2
3
4
5
6
input_note = 0
notes = []
while input_note >= 0:
    input_note = float(input(">"))
    notes.append(input_note)
notes.pop(-1)

Kje

On peut faire plus simple :

1
notes = list(iter(lambda: float(input('> ')), 0))

Édité par yoch

+1 -0
Auteur du sujet

Désolé pour le retard,

La première est pas du tout clair. Faire un continue pour passer dans le test du while c'est moche car tu sais que ça va couper, donc autant faire le break et mettre un while True.

Kje

C'est bien ce que je pensais au début (il faut que j'arrête de remettre en question ma 1er intuition)

Enfin, perso ce genre de code je le sépare en général en deux : une partie qui manipule les io et qui va remplir une liste, puis en dessous une autre qui va évaluer les stars. C'est beaucoup plus clair que de mélanger la demande d'Io et les évaluations au passage (d'autant que la tu calcul des moyennes pour rien, seule la dernière compte)

Kje

Oui je pense que c'est ce que j'aurais fais normalement mais tous mettre dans la boucle étais une consigne de l'exercice

6.15 Écrire une boucle de programme qui demande à l'utilisateur d'entrer des notes d'élèves. La boucle se terminera seulement si l'utilisateur entre une valeur négative. Avec les notes ainsi entrées, construire progressivement une liste. Après chaque entrée d'une nouvelle note (et donc à chaque itération de la boucle), afficher le nombre de notes entrées, la note la plus élevée, la note la plus basse, la moyenne de toutes les notes.

Gérard Swinnen : Apprendre à programmer avec Python3

Au passage inputNote c'est pas un nom PEP8 compliant

Kje

C'est quoi un nom PEP8 compliant ?

Et aussi j'ai lu la doc sur iter() mais j'ai pas trop compris vous pouvez m'expliquer vite fais s'il vous plait ?

Édité par LudoBike

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0

C'est quoi un nom PEP8 compliant ?

PEP8 est le guide du style à adopter en python, ce n'est pas obligatoire mais c'est considéré comme une bonne pratique.

Et aussi j'ai lu la doc sur iter() mais j'ai pas trop compris vous pouvez m'expliquer vite fais s'il vous plait ?

LudoBike

Dans ce cas d'utilisation, le passage qui nous intéresse est :

Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. […] If the second argument, sentinel, is given, then object must be a callable object. The iterator created in this case will call object with no arguments for each call to its __next__() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.

Pour bien comprendre, il faut connaitre le concept d'itération en python. En gros, ça veut dire que dans le cas où tu passe à iter deux arguments, le premier doit être une fonction sans arguments qui est appelée à chaque itération et renvoie une valeur, et le second représente la valeur "sentinelle" qui va faire stopper l'itération dès qu'elle est rencontrée.

Édité par yoch

+0 -0

Oui mais le problème est qu'il veut que ça stop à tout nombre négatif (et d'ailleurs 0 est une note possible).

Kje

Avec la bonne fonction en premier argument, c'est vite réglé. C'est la solution la plus pythonique, mais je doute que ce soit du niveau de l’exercice.

+0 -0
Auteur du sujet

Ok merci pour le PEP8 je vais le lire.

Avec la bonne fonction en premier argument, c'est vite réglé. C'est la solution la plus pythonique, mais je doute que ce soit du niveau de l’exercice.

psycopy

Non c'est un peu difficile a comprendre a ce niveaux du cour :)

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0
Auteur du sujet

Du coup pour le PEP8 ou même pour les normes d'autres langage il faudrait faire des tutos pour les expliquer car il y des personnes qui comme moi en ignorait totalement leur existence et aussi je pense que beaucoup se décourage de lire la doc bien longue et en anglais

Dite moi ce que vous en pensé ou sinon intégrer une partie les expliquant directement dans le tuto du langage associé

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0

On peut faire plus simple :

1
notes = list(iter(lambda: float(input('> ')), 0))

yoch

C'est vraiment subjectif de dire plus simple, je trouve cela plus complexe et plus illisible, je crois vraiment que l'expérience nous permet pas toujours de se rendre compte des difficultés de l'apprenant. On devrait tous relire le zen de python

La solution de Kje est bien plus adaptée au niveau du PO !

+1 -0
Staff

On a pas encore de tuto Python ici. C'est un problème d'auteurs ça. Je connais mal les autres langages à ce niveau mais les conventions en Python sont importante. Un vrai tuto ou cours Python devrait en parler. Ça fais presque parti du langage tellement tout le monde les respects. Un tuto Python qui en parle pas devrait être refusé selon moi.

+1 -0
Staff

Je connais mal les autres langages à ce niveau mais les conventions en Python sont importante. Un vrai tuto ou cours Python devrait en parler. Ça fais presque parti du langage tellement tout le monde les respects. Un tuto Python qui en parle pas devrait être refusé selon moi.

Kje

Un bon cours de Python ne devrait pas seulement en parler, mais carrément passer la moitié de son temps à montrer, expliquer, rappeler les conventions. C'est pareil pour tous les langages aussi maléables que Python (je pense à Lisp) : on a le droit de sortir des rails, à la seule condition de savoir qu'on est en train de sortir des rails. Et les rails en question, ce sont les conventions.

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte