Forum Programmation.python Calcul de matrices, erreur "index out of range"

Posté par  . Licence CC By‑SA.
Étiquettes :
2
20
nov.
2018

Bonjour, je suis sur un petit projet en python3 où je dois créer une matrice de probabilité à partir d'un fichier faste (fichier texte spé).
Le programme doit faire appel à 5 paramètres: le 4eme paramètre est la longueur de la chaîne D’ADN (qui doit être supérieur à 0)

Je crée donc une fonction qui récupère ce paramètre, comme ci dessous qui retourne le 4ème élement de la liste *args

def get_row_size(*args): 

    if (args[4]>0):
        return(args[4]) #On retourne le 4eme élément la liste *args
    else:
        raise ValueError

Mon soucis c'est que quand je fait appel à cette fonction:

import sys
seuil = get_row_size(sys.argv)

Cela m'affiche une erreur type IndexError avec un index "out of range" mais je ne vois pas où ? Je suis encore novice donc quelquechose doit surement m'échapper..
Merci d'avance ;)

  • # Indices

    Posté par  (site web personnel) . Évalué à 1.

    Ton paramètre est un Tableau (structure de données), et tu y accèdes en lui indiquant une position. (ici une position négative n'a pas de sens, donc tu contrôle que l'indice est positif). Par contre, combien as tu de lignes et de colonnes dans ton tableau ?

    • [^] # Re: Indices

      Posté par  . Évalué à 4. Dernière modification le 21 novembre 2018 à 11:57.

      et tu y accèdes en lui indiquant une position. (ici une position négative n'a pas de sens, donc tu contrôle que l'indice est positif).

      Pour info en python tu peux mettre une position négative et ça m'a déjà crée un bug bien vicieux
      -1 te renverra la dernière valeur, -2 l'avant dernière etc.
      Par exemple :

      a = [5, 7, 8]
      a[-1]
      8
  • # Opérateur *

    Posté par  (site web personnel) . Évalué à 7. Dernière modification le 20 novembre 2018 à 17:44.

    Soit tu déclares ta fonction comme prenant un seul paramètre (un tuple) et tu l'appelles avec 1 seul paramètre:

    def get_row_size(args):  # <=== pas de '*'
       # ...
    
    get_row_size(sys.argv)

    Soit tu déclares ta fonction comme prenant N paramètres, et tu l'appelles en "explosant" le tuple :

    def get_row_size(*args):
       # ...
    
    get_row_size(*sys.argv)  # <== remarque le '*'

    Actuellement tu mélanges les 2, et ta fonction reçoit bien un seul argument (seul args[0] ne provoquera pas d'erreur, et sera un tuple avec tous tes arguments).

    Quelques remarques:

    • Ce n'est pas très propre que ton programme plante salement si on ne lui passe pas assez d'argument. Tu es censé faire un if len(args) > 3 avant de faire un args[3] par exemple.
    • Comme vérifier tous les arguments c'est pénible, tu peux regarder du côté de argparse qui générera de belles erreurs et un message de doc sur les arguments
    • Attention tu parles de "4eme élément" en écrivant args[4] ; il s'agit bien du 5ème élément (vu que les indices commencent à 0).
    • [^] # Re: Opérateur *

      Posté par  . Évalué à 2.

      Merci beaucoup pour ces explications claires. Ca a arrangé mon problème (Bien vu pour l'indice 0= nom de l'executable à prendre en compte)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.