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

Résolu/Fermé
kilvui Messages postés 41 Date d'inscription dimanche 16 juin 2013 Statut Membre Dernière intervention 22 octobre 2016 - Modifié par kilvui le 23/04/2016 à 14:50
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 24 avril 2016 à 12:25
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.
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 24/04/2016 à 12:09
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
0
kilvui Messages postés 41 Date d'inscription dimanche 16 juin 2013 Statut Membre Dernière intervention 22 octobre 2016
24 avril 2016 à 12:21
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
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 avril 2016 à 12:25
De rien, bonne continuation :-)
0