Favicon
NSI Première

Correction - Notions avancées sur les fonctions

Première erreur :


Traceback (most recent call last):
  File "nim.py", line 24, in 
    afficher_tas()
  File "nim.py", line 6, in afficher_tas
    for allumette in jeu:
NameError: name 'jeu' is not defined		    		    
		    

Cette erreur est typique d'une variable locale ( jeu ) non initialisée dans la fonction afficher_tas.

En effet, cette fonction est destinée à l'affichage du tas d'allumettes, codé dans la variable globale tas dans le programme principal.

D'où deux solutions :


def afficher_tas(jeu):
    for allumette in jeu:
        print(allumette, end = '')
        
afficher_tas(tas) # ligne 24
            

Deuxième erreur


Traceback (most recent call last):
  File "nim.py", line 27, in 
    jouer(nombre)
  File "nim.py", line 11, in jouer
    N = N - nombre
UnboundLocalError: cannot access local variable 'N' where it is not associated with a value		    		    
		    

Là, on cherche à modifier la variable globale N dans la fonction jouer, ce qui est bien entendu impossible.

La meilleure solution, comme on l'a vu, est de passer la variable N comme argument lors de l'appel de la fonction jouer, et de lui réaffecter le résultat renvoyée par cette fonction :


def jouer(N, nombre):
    if nombre < 4:
        N = N - nombre
    return N
        
N = jouer(N, nombre) # ligne 28
            

Dernier problème

Il ne s'agit pas là d'une erreur, mais d'un problème à l’exécution : l'affichage du tas d'allumettes restantes ne change jamais, il y a toujours 20 allumettes affichées...

L'interprétation est moins évidente, ce qui fait que ce genre d'erreur est plus difficile à détecter : la fonction modifier_tas prend bien la variable globale tas comme argument, mais dans cette fonction, c'est une autre variable locale, appelée aussi tas, qui est modifiée ( d'où d'ailleurs cette maladresse d'avoir donné le même nom à ces deux variables...).

Donc, là aussi, la solution est de renvoyer la variable locale tas modifiée, et de réaffecter ce résultat à la variable globale tas :


def modifier_tas(tas):
    tas = "|"*N
    return tas
        
tas = modifier_tas(tas) # ligne 30
            

Code complet


#################FONCTIONS###################
def creer_tas(N):
    return "|"*N

def afficher_tas(jeu):
    for allumette in jeu:
        print(allumette, end = '')

def jouer(N, nombre):
    if nombre < 4:
        N = N - nombre
    return N

def modifier_tas(tas):
    tas = "|"*N
    return tas

##########PROGRAMME PRINCIPAL################
N = 20
tas = creer_tas(N)

while N > 0:
    print()
    afficher_tas(tas)
    print()
    nombre = int(input("Nombre d'allumette(s) prise(s) (1, 2 ou 3 ) ? "))
    N = jouer(N, nombre)
    tas = modifier_tas(tas)

print("Gagné !")