[python] exercice de listes

Fermé
tarang Messages postés 12 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 décembre 2007 - 23 nov. 2006 à 15:03
 aureargo - 11 juil. 2011 à 11:36
Hello,

Je suis débutant version alpha en programmation. Je me suis pourtant plongé dans l'aventure avec Python pour mon plaisir personnel. C'est donc de façon autodidacte et probablement maladroite que je débute .
Je lis actuellement le livre "apprendre a programmer avec Python" de G.Swinnen et termine le chapitre des listes.
Voici un petit exercice personnel que je n'arrive pas a résoudre:

soit une liste de caractères CDEFGAB (hé oui, vous devinez ma source d'inspiration)
comment faire afficher une harmonisation d'accords de trois sons a partir de chaque degré (CEG * DFA * EGB ... etc.)
Ma syntaxe doit probablement être fausse car il m'affiche une erreur à la 9e ligne

voici:

# -*- coding:Latin-1 -*-
ch = "CDEFGAB"
lc = len(ch)
i = 0
nch = ""
c1, c2, c3 = 0, 2, 4

while i<lc:
nch = nch + "*" + ch[c1] + ch[c2] + ch[c3]
i = i + 1
c1 = c1 + 1
c2 = c2 + 1
c3 = c3 + 1
print nch



merci d'avançe

11 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:23
Dans beaucoup de cas, on peut se passer du while et utiliser plutôt le FOR.
C'est le principe des itérateurs.

Beaucoup d'objets Python sont des itérateurs (chaînes, fichiers, listes, dictionnaires, etc).
Cela permet de les parcourir facilement avec FOR sans avoir utiliser et incrémenter une variable d'index (i).
1
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:38
Qu'est-ce qui cloche dans ma ligne 9?

Tu essaie d'accéder à un caractère dont l'indice est plus grand que le tableau.

Exemple:
ch = "CDEFGAB" 
print ch[12]



Traceback (most recent call last):
  File "a.py", line 2, in <module>
    print ch[12]
IndexError: string index out of range



"index out of range" veut dire que tu as essayé d'utiliser un index hors des valeurs possible (range).
(normal puisque ma chaîne ne fait que 7 caractères, je peux donc seulement utiliser les indexes 0,1,2.. jusqu'à 6).

1
dans ton cas, lors du quatrième passage de while:
i=3, lc=7, c3=7 et ch[7]= "index out of range": indice en dehors de la chaine de 7 éléments [0,1,2,3,4,5,6]
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:13
Note: Met ton code entre deux balises < code> sinon on ne voit pas correctement l'indentation.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:17
Voici comment je ferais:
ch = "CDEFGAB" 
ch2 = ch*2  # (Deux fois la longueur de ch)
for i in range(len(ch)):
    print ch2[i] + ch2[i+2] + ch2[i+4]



Ce qui donne:
CEG
DFA
EGB
FAC
GBD
ACE
BDF
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:19
Mais pour faire plus propre, on devrait plutôt faire:
ch = "CDEFGAB" 
lc = len(ch)
for i in range(lc):
    print ch[i%lc]+ch[(i+2)%lc]+ch[(i+4)%lc]


(% est l'opération de modulo (reste de la division entière))
0
tarang Messages postés 12 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 décembre 2007
23 nov. 2006 à 15:28
merci pour cette réponse rapide et efficace
ce code est effectivement beaucoup plus court
je découvre cette commande "for i in range". Est-ce une instruction loop, dans ce cas i s'indente? Bref, j'ai de quoi étudier
Qu'est-ce qui cloche dans ma ligne 9?
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 15:35
Est-ce une instruction loop, dans ce cas i s'indente? Bref, j'ai de quoi étudier

En faisant: for a in b
L'instruction for va extraire élément par élément tout ce que contient b.
A chaque étape, il met la valeur dans a.
A l'intérieur du for, il n'y a plus qu'à faire ce que tu veux avec la valeur a extraite de b.

Exemple:

mot = "coucou"
for lettre in mot:
    print lettre.upper()

ce qui affiche:
C
O
U
C
O
U



range(n) va créer une liste [0,1,2,3,4,5...n-1]

Exemple:
print range(5)
[0, 1, 2, 3, 4]


Donc for i in range(5) est équivalent à for i in [0, 1, 2, 3, 4]

0
tarang Messages postés 12 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 décembre 2007
23 nov. 2006 à 16:58
limpide ... merci
voila qui me donne de quoi avançer
je pense installer un shell sur mon palm, c'est vraiment gai Python
A++
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
23 nov. 2006 à 17:00
Très sympa comme langage.

Je m'amuse bien avec:
https://sebsauvage.net/webgobbler/

Voir aussi les trucs et astuces Python (en anglais):
https://sebsauvage.net/python/snyppets/

Et aussi le wiki francophone:
http://wikipython.flibuste.net
0
tarang Messages postés 12 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 11 décembre 2007
23 nov. 2006 à 17:47
programme très amusant, chapeau! On dirait Armand Pierre
merci pour les liens
0
je suis en G2 info de gestion et je cherhe de exercices sur les listes
0