[python] exercice de listes

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

  1. Modérateur
    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. Modérateur
      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]
    2. Modérateur
      Note: Met ton code entre deux balises < code> sinon on ne voit pas correctement l'indentation.
      1. Modérateur
        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
        1. Modérateur
          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))
          1. 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?
            1. Modérateur
              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]

              1. limpide ... merci
                voila qui me donne de quoi avançer
                je pense installer un shell sur mon palm, c'est vraiment gai Python
                A++
                1. programme très amusant, chapeau! On dirait Armand Pierre
                  merci pour les liens
                  1. je suis en G2 info de gestion et je cherhe de exercices sur les listes