Perdu dans un code Python!

Perdu dans un code Python! - Python - Programmation

Marsh Posté le 10-01-2010 à 11:36:47    

Bonjour,

 

J'ai un examen d'informatique dans quelques jours, je m'exerce donc à résoudre des questions Python des années précédentes. Notre examen se fait sans ordinateur et il faut comprendre le code dans les moindres détails. Il faut expliquer à quoi sert le code et en donner le résultat.
Voici l'énoncé:

 

Expliquez brièvement le rôle du petit code Python qui suit et indiquez très précisément ce qui
sera affiché à l’écran en exécutant les quatre dernières lignes du code. L’instruction « list.append(a) » ajoute « a » à la liste « list ».

 
Code :
  1. >>> def find(li1, li2):
  2.     lx = []
  3.     lx2 = []
  4.     y = z1 = z2 = xx = yy = zz2 = 0
  5.     for a1 in li2:
  6.         y = y+1
  7.     z1 = 1
  8.     for a2 in li1:
  9.         z2 = 1
  10.         for a3 in li2:
  11.             if a2 == a3 and z2 == zz2 + 1:
  12.                 lx.append(z1)
  13.                 xx = xx + 1
  14.                 zz2 = z2
  15.                 z2 = z2 + 1
  16.                 if (xx == y):
  17.                     lx2.append(lx[0])
  18.                     lx = []
  19.                     xx = 0
  20.                     zz2 = 0
  21.             z2=z2+1
  22.         z1 = z1 + 1
  23.     return lx2
  24. >>> find('gta','gt')
  25. >>> find('aagtaaaa','aaa')
  26. >>> find('gtcgtcgtc','gtc')
  27. >>> find('gtaaacgtcgaataac','gtc')


Réponses finales:

 
Code :
  1. >>> find('gta','gt')
  2. [1]
  3. >>> find('aagtaaaa','aaa')
  4. [1, 6]
  5. >>> find('gtcgtcgtc','gtc')
  6. [1, 4, 7]
  7. >>> find('gtaaacgtcgaataac','gtc')
  8. [1, 7, 10]


Je sais ce que fait le code mais je suis perdu dans les indentations, le rôle des variables,...

 
  • Dans le cas où "xx" n'est pas égal à "y" (ligne 16), je ne sais pas à quel niveau il faut remonter dans le code (=> indentations). Et si on reprend la même lettre de "li1" et qu'on passe à la lettre suivante de "li2" ou autrement?
  • Je ne sais pas non plus à quel moment on peut utiliser les compteurs "z2=z2+1" et "z1=z1 +1" (lignes 21 & 22) (=> indentations)?
  • ...


Bref, je suis bien perdu dans ce code...

 

D'avance, merci beaucoup pour l'aide  :)

 

Thibault


Message édité par td871 le 11-01-2010 à 10:21:13
Reply

Marsh Posté le 10-01-2010 à 11:36:47   

Reply

Marsh Posté le 11-01-2010 à 09:45:16    

Citation :

Dans le cas où "xx" n'est pas égal à "y" (ligne 16), je ne sais pas à quel niveau il faut remonter dans le code (=> indentations).

Si xx n'est pas égal à y à la ligne 16, alors python va à la ligne qui suit le pavé du if. Ce pavé (ou bloc) est constitué par toutes les lignes qui sont un peu plus indentées que le if. Ce pavé est donc constitué des lignes 17 à 20 incluses. Donc la ligne qui est exécutée après le test du if, dans le cas ou xx est différent de y, est la ligne 21.

Citation :

si on reprend la même lettre de "l1" et qu'on passe à la lettre suivante de "l2" ou autrement?

Je vois li1 et lx, mais pas je ne vois pas "l1".

Citation :

à quel moment on peut utiliser les compteurs "z2=z2+1" et "z1=z1 +1" (lignes 21 & 22)

La ligne 21 est exécutée dans les conditions suivantes :
- juste après la ligne 20
- ou juste après la ligne 16, si le test échoue (si xx différent de y)
- ou juste après la ligne 11 si le test de cette ligne échoue.
 
La ligne 22 est exécutée après que la boucle for de la ligne 10 se soit terminée.

Reply

Marsh Posté le 11-01-2010 à 10:52:09    

Merci beaucoup Oliv, tu éclaires ma lanterne!  :)  
 
Pour "l1" et "l2", je voulais dire "li1" et "li2" respectivement.
 
J'ai encore des doutes pour le rôle des variables:
 
"y" ? —> est le nombre d'éléments "a1" dans "li2" ??
 
"z1" ?
 
"z2" ?
 
"xx" ?
 
"zz2" ?
 
"yy" ? —> je suppose que celle-ci ne joue aucun rôle puisqu'on ne s'en sert pas dans la suite du code??  
 
 
Je suppose que "a1" et "a3" sont équivalents?
 
 
 

Reply

Marsh Posté le 11-01-2010 à 13:25:23    

Oui y est le nombre d'éléments dans li2
 
z1 est le nombre d'éléments + 1 dans li1, quand on arrive à la fin de la boucle de la ligne 8. Mais dans la boucle, par exemple ligne 12, z1 est l'indice de l'élément de li1 qui est en cours de traitement. Donc z1 est une sorte de pointeur sur le caractère en cours d'examen de la chaine li1.
 
z2 est le nombre d'éléments + 1 dans li2, quand on arrive à la fin de la boucle de la ligne 10. Mais dans la boucle, z2 est l'indice de l'élément en cours de traitement. Donc z2 est une sorte de pointeur sur le caractère en cours d'examen de la chaine li2.
 
xx est une sorte de pointeur sur le dernier caractère ajouté dans la chaine lx.
 
zz2 est l'ancien z2. Cela sert pour la comparaison de la ligne 11.
 
yy est zéro tout le temps. C'est probablement une variable prévue pour un traitement futur, ou pour un traitement qui a été enlevé pour simplifier ce code.
 
Je ne vois pas a1.
Si la question est de savoir si a2 et a3 sont équivalents, la réponse est non, car a2 est une lettre de li1, et a3 est une lettre de li2. Parfois, les deux lettres sont les mêmes, mais pas nécessairement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed