Problème de compréhension sur une ligne de code
Résolu
Bonjour,
je travaille sur un projet où je dois réaliser un jeu de billard en python (élève de terminale S). Pour cela, je m'aide d'internet. J'ai récemment trouvé un programme qui m'aide, mais je ne comprends par la formulation d'une boucle for :
Je n'arrive pas à comprendre pourquoi il y a tant de variables dans cette boucle...
Je peux également mettre le reste du programme si cela est nécessaire.
Cordialement, Kilvui.
je travaille sur un projet où je dois réaliser un jeu de billard en python (élève de terminale S). Pour cela, je m'aide d'internet. J'ai récemment trouvé un programme qui m'aide, mais je ne comprends par la formulation d'une boucle for :
for i,(boule,x,y,dx,dy,r) in zip(range(0,len(self.boules)),self.boules)
Je n'arrive pas à comprendre pourquoi il y a tant de variables dans cette boucle...
Je peux également mettre le reste du programme si cela est nécessaire.
Cordialement, Kilvui.
A voir également:
- Problème de compréhension sur une ligne de code
- Code ascii - Guide
- Partage de photos en ligne - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
1 réponse
Bonjour,
Conseils préalables
En python n'hésite pas à mettre des print pour voir ce que contiennent les variables pendant que tu exécutes ton programme. La fonction type permet également de voir le type d'une variable.
Encore mieux, tu peux utiliser pdb pour le faire (je passe rapidement là dessus, si tu es intéressé tu regarderas tranquillement comment ça s'utilise).
Pré-requis
Lis par exemple ceci pour comprendre ce que fait la fonction zip :
https://www.saltycrane.com/blog/2008/04/how-to-use-pythons-enumerate-and-zip-to/
Du coup
Par convention, dans ce qui suit, les noms commençant par une majuscule correspondent à un nom de classe (donc un type), à ne pas confondre avec une instance de cette classe (qui est donc une variable de ce type).
Assigner des variables dans une boucle for
Python sait, lorsqu'il itère sur des paires, les attribuer à un ensemble de variables.
Exemple :
Plus généralement il sait le faire pour des n-uplets, et même des n-uplets de contenant des n-uplets. Complexifions notre exemple pour le vérifier :
Retour à ton bout de code :
Reprenons le premier lien : la fonction
Ainsi i,(boule,x,y,dx,dy,r) permet d'initialiser les variables i (index de la Boule), boule (la Boule), x, y, dx, dy et r pour chaque BouleInfo stockée dans self.boules.
Bonne chance
Conseils préalables
En python n'hésite pas à mettre des print pour voir ce que contiennent les variables pendant que tu exécutes ton programme. La fonction type permet également de voir le type d'une variable.
Encore mieux, tu peux utiliser pdb pour le faire (je passe rapidement là dessus, si tu es intéressé tu regarderas tranquillement comment ça s'utilise).
Pré-requis
Lis par exemple ceci pour comprendre ce que fait la fonction zip :
https://www.saltycrane.com/blog/2008/04/how-to-use-pythons-enumerate-and-zip-to/
len(x)renvoie la longueur de
x.
range(0, n)renvoie [0, 1, 2, ..., n-1]
Du coup
range(0,len(self.boules))permet de compter de 0 jusqu'au nombre de boules -1 (en d'autres terme : la première boule correspond à l'index 0, la seconde à l'index 1 et ainsi de suite).
Par convention, dans ce qui suit, les noms commençant par une majuscule correspondent à un nom de classe (donc un type), à ne pas confondre avec une instance de cette classe (qui est donc une variable de ce type).
self.boulesfait référence au membre
boulesde la classe (mettons
class Billard) dans laquelle la fonction que tu regardes est codée.
selfest l'instance considérée de cette classe (ou si tu préfère, le Billard considéré).
Assigner des variables dans une boucle for
Python sait, lorsqu'il itère sur des paires, les attribuer à un ensemble de variables.
Exemple :
>>> l = [(i, i*i) for i in range(0, 10)]
>>> print l
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81)]
>>> for i, j in l:
... print i, j
...
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
Plus généralement il sait le faire pour des n-uplets, et même des n-uplets de contenant des n-uplets. Complexifions notre exemple pour le vérifier :
>>> l = [(i, (i*i, i*i*i)) for i in range(0, 10)]
>>> print l
[(0, (0, 0)), (1, (1, 1)), (2, (4, 8)), (3, (9, 27)), (4, (16, 64)), (5, (25, 125)), (6, (36, 216)), (7, (49, 343)), (8, (64, 512)), (9, (81, 729))]
>>> for i, (carre, cube) in l:
... print i, carre, cube
...
0 0 0
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
Retour à ton bout de code :
Reprenons le premier lien : la fonction
zipva permettre d'énumérer des couples de type
(int, BouleInfo), où BouleInfo correspond au type
(Boule, int, int, int, int, int).
Ainsi i,(boule,x,y,dx,dy,r) permet d'initialiser les variables i (index de la Boule), boule (la Boule), x, y, dx, dy et r pour chaque BouleInfo stockée dans self.boules.
Bonne chance
Bonne fin de journée, cordialement
Kilvui