Erreur de typage
helena8686
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
khrug -
khrug -
Bonjour,
Mon but avec la fonction filecarresrouges_aux est d'appliquer la fonction appellecourant_aux (qui renvoie une liste de deux éléments) à chaque élement de ma file.
En réponse, j'ai comme message d'erreur
Est-ce que je peux avoir une explication s'il vous plait ?
Mon but avec la fonction filecarresrouges_aux est d'appliquer la fonction appellecourant_aux (qui renvoie une liste de deux éléments) à chaque élement de ma file.
def filecarresrouges_aux (file) : while file != [] : p = file.pop(0) n, m = p[0], p[1] if n != (-1) : l = appellecourant_aux (n, m) if l[0] != (-1) : file.extend([l[0], l[1]]) filecarresrouges_aux (file)
En réponse, j'ai comme message d'erreur
line 5, in filecarresrouges_aux
TypeError: 'int' object is not subscriptable
Est-ce que je peux avoir une explication s'il vous plait ?
A voir également:
- Erreur de typage
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
6 réponses
Bonsoir.
L'erreur est en ligne 4
L'erreur est en ligne 4
n, m = p[0], p[1], cela signifie que p est un entier, pourquoi ? C'est à toi de voir ce que contient file avant le 1er appel de cette fonction dans ton code.
Bonsoir,
Voici l'entièreté de mon code :
Ainsi, avant le premier appel de filecarresrouge, file est le résultat que retourne la fonction randompremierplastique(), qui est une liste. Ce n'est donc pas un entier ..
Voici l'entièreté de mon code :
def randompremierplastique () : n = 15*randint (0, 39) m = 15*randint (0, 49) while recherche_aux (n, m, listeterre) or recherche (n, m) == "pas de courants marins" : n = 15*randint (0, 39) m = 15*randint (0, 49) f = [n, m] return f def filecarresrouges_aux (file) : p = file.pop(0) n, m = p[0], p[1] l = appellecourant_aux (n, m) if l[0] != (-1) : file.extend(l) filecarresrouges_aux (file) def filecarresrouges (i) : filecarresrouges_aux (randompremierplastique())
Ainsi, avant le premier appel de filecarresrouge, file est le résultat que retourne la fonction randompremierplastique(), qui est une liste. Ce n'est donc pas un entier ..
Oui, c'est une liste, mais
Si tu veux avoir 2 éléments pour l'indice 0 de ta liste file, alors f dans ta fonction randompremierplastique devrait être
file.pop(0)correspond au 1er entier de cette liste...
Si tu veux avoir 2 éléments pour l'indice 0 de ta liste file, alors f dans ta fonction randompremierplastique devrait être
f = [(n, m)]
J'ai changé, mais j'ai maintenant un nouveau problème.
Je suis certain que ma fonction apppellecourant_aux renvoie une liste d'une sous liste à deux éléments (ex : l = [[5,7]]).
Pourtant, j'ai ce message d'erreur :
def randompremierplastique () : n = 15*randint (0, 39) m = 15*randint (0, 49) while recherche_aux (n, m, listeterre) or recherche (n, m) == "pas de courants marins" : n = 15*randint (0, 39) m = 15*randint (0, 49) f = [n, m] return f def filecarresrouges_aux (file) : while file != [] : file2 = [] n, m = file.pop(0), file.pop(0) l = appellecourant_aux (n, m) p2 = l.pop(0) if p2[0] != -1 : file2.extend([p2]) file = file2[0] def filecarresrouges (i) : filecarresrouges_aux (randompremierplastique())
Je suis certain que ma fonction apppellecourant_aux renvoie une liste d'une sous liste à deux éléments (ex : l = [[5,7]]).
Pourtant, j'ai ce message d'erreur :
File "<stdin>", line 7, in filecarresrouges_aux
AttributeError: 'NoneType' object has no attribute 'pop'
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour.
Si python dit que l vaut None, il ne se trompe pas, donc il faut voir ce que retourne ta fonction appellecourant_aux, peut-être qu'il y a un comportement inattendu, un effet de bord, ou alors une simple erreur d'inattention ou de logique du code.
Si python dit que l vaut None, il ne se trompe pas, donc il faut voir ce que retourne ta fonction appellecourant_aux, peut-être qu'il y a un comportement inattendu, un effet de bord, ou alors une simple erreur d'inattention ou de logique du code.
def arrivesurlaterre (n, m) : C.create_rectangle (n+3, m+3, n+12, m+12, fill='yellow') return [[-1, -1]] def pasverslagauche (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) def pasversladroite (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) def pasverslehaut (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : arrivesurlaterre (n, m) def pasverslebas (n, m) : j = randint(0, 4) if j == 0 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] elif j == 1 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] elif j == 2 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : arrivesurlaterre (n, m) #fonctions pour chaque courant (8 chances sur 10 de suivre le courant principal) def courantdroite (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+18, m+3, n+27, m+12, fill='red') return [[n+15, m]] else : pasversladroite (n, m) def courantgauche (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : pasverslagauche (n, m) def couranthaut (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m-12, n+12, m-3, fill='red') return [[n, m-15]] else : pasverslehaut (n, m) def courantbas (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n+3, m+18, n+12, m+27, fill='red') return [[n, m+15]] else : pasverslebas (n, m) def appellecourant_aux (n, m) : r = recherche(n, m) if r == "gauche" : courantgauche (n, m) elif r == "bas" : courantbas(n, m) elif r == "droite" : courantdroite(n, m) elif r == "haut" : couranthaut (n, m) elif r == "pas de courants marins" : if recherche_aux (n+15, m, listeterre) : silyaterreadroite (n, m) elif recherche_aux (n-15, m, listeterre) : silyaterreagauche (n, m) elif recherche_aux (n, m+15, listeterre) : silyaterreenbas (n, m) elif recherche_aux (n, m-15, listeterre) : silyaterreenhaut (n, m) else : j = randint(0, 4) if j == 0 : courantbas (n, m) elif j == 1 : courantdroite (n, m) elif j == 2 : courantgauche (n, m) else : couranthaut (n, m) else : arrivesurlaterre (n, m)
Je dois sûrement être bigleu :') ?
Ça me semble compliqué car il va falloir ajouter beaucoup de return dans tes fonctions.
Prenons le 1er test dans appellecourant_aux, il faut donc faire un return de ce que va renvoyer l'appel à courantgauche
Dans courantgauche, il y a bien un return, mais pas dans le else, donc.
Idem pour pasverslagauche
Et ainsi de suite pour toutes ces fonctions.
Bon courage ^^
Prenons le 1er test dans appellecourant_aux, il faut donc faire un return de ce que va renvoyer l'appel à courantgauche
if r == "gauche" : return courantgauche (n, m)
Dans courantgauche, il y a bien un return, mais pas dans le else, donc.
def courantgauche (n, m) : i = randint(1, 10) if i < 9 : C.create_rectangle (n+3, m+3, n+12, m+12, fill='green') C.create_rectangle (n-12, m+3, n-3, m+12, fill='red') return [[n-15, m]] else : return pasverslagauche (n, m)
Idem pour pasverslagauche
def pasverslagauche (n, m) : # code else : return arrivesurlaterre (n, m)
Et ainsi de suite pour toutes ces fonctions.
Bon courage ^^