Problème de compréhension sur une ligne de code

[Résolu/Fermé]
Signaler
Messages postés
41
Date d'inscription
dimanche 16 juin 2013
Statut
Membre
Dernière intervention
22 octobre 2016
-
Messages postés
30127
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
-
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 :
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.

1 réponse

Messages postés
30127
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
7 176
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/

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.boules
fait référence au membre
boules
de la classe (mettons
class Billard
) dans laquelle la fonction que tu regardes est codée.
self
est 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
zip
va 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
Messages postés
41
Date d'inscription
dimanche 16 juin 2013
Statut
Membre
Dernière intervention
22 octobre 2016

Bonjour, merci beaucoup de votre réponse qui m'a appris beaucoup de choses. Je vous remercie pour ces explications très claires.
Bonne fin de journée, cordialement
Kilvui
Messages postés
30127
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
7 176
De rien, bonne continuation :-)