Problème avec fonction et return [Résolu]

Signaler
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020
-
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
-
Bonjour,
j'essaye de faire un petit programme pour exécuter un jeu du pendu. Cependant, dans ma fonction 'test_lettre' qui sert à justement tester la lettre et chercher si elle appartient bien au mot, je dois return deux éléments, le nombre de tentatives (pour mettre fin au jeu si il y a trop de tentatives) et le mot sous la forme ' _ _ _ _ _ A _ ' par exemple pour l'utilisateur. J'ai donc décidé de mettre le deux éléments dans une liste afin de le récupérer plus facilement.
Mais lorsque je cherche justement à le récupérer, je fais test_lettre[1 ou 2] et le programme refait donc toutes les opérations de la fonction, et donc tous les print() qui vont avec la fonction.
Est-ce possible d'uniquement récupérer une des deux valeurs ? ^^
(Je ne sais pas si j'ai été clair...)
Merci d'avance

11 réponses

Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
Bonjour
Pour poster ton code, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020

#JEU DU PENDU
from tab_util import*
mot='casserole'
mot1=list(mot)
tenta=0
mot_c=len(mot)*['_']

def test_lettre(mot, mot_c, tenta):
    nbr_lettre=0
    tenta_f=tenta
    lettre=input('Quelle lettre ?')
    for i in range(len(mot)):
        if lettre==mot[i]:
            nbr_lettre=nbr_lettre+1
            mot_c[i]=mot[i]
    if nbr_lettre==0:
        print('La lettre ', lettre, 'n\'est pas dans le mot')
        print(" ".join(mot_c))
        tenta_f=tenta_f+1

    else:
        print('La lettre', lettre, 'est ', nbr_lettre, 'fois dans le mot')
        print(" ".join(mot_c))


    return [mot_c, tenta_f]

while tenta<10:
    test_lettre(mot1, mot_c, tenta)
    tenta=tenta+test_lettre(mot1, mot_c, tenta)[1]
    print(tenta)
    mot_c=test_lettre(mot1, mot_c, tenta)[0]
    print(mot_c)
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
tu n'as pas bien lu le tuto....
Le résultat ne doit pas être un pavé gris tout moche
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020
>
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020

Oui c'est rectifié (normalement ^^') merci !
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
bon voyons ce bout de code

while tenta<10:
    test_lettre(mot1, mot_c, tenta) #ici tu lances une foi ta fonction, sans récupérer le résultat
    tenta=tenta+test_lettre(mot1, mot_c, tenta)[1] #ici tu la relances en récupérant seulement l'élément '1', et tu additionnes cet élément à tenta
    print(tenta)
    mot_c=test_lettre(mot1, mot_c, tenta)[0] #et là tu la relances une troisième fois
    print(mot_c)



Si on analyse ce que ça fait
on démarre la boucle, tenta vaut 0
       Teste la lettre 'd', c'est pas bon, mais on n'en tient pas compte
       Teste la lettre 'z', c'est pas bon, dans la fonction tentaF est passé de 0 à 1, donc tenta = tenta + 1 = 1
       On affiche tenta
       Teste la lettre 'y', c'est pas bon, on affiche la liste des caractères 

Deuxième tour de boucle, tenta vaut 1 même après trois erreurs
      Teste la lettre 'x', c'est pas bon, mais on n'en tient pas compte
      Teste la lettre 'w', c'est pas bon, dans la fonction tentaF est passé de 1 à 2, donc tenta = tenta + 2 = 3
       On affiche tenta
       Teste la lettre 'm', c'est pas bon, on affiche la liste des caractères 

etc...


Vois tu ce qui cloche?
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020

Je refais 3 fois la fonction, et il faudrait que je récupère les deux valeurs en la faisant qu'une seule fois ?

mot_c, tenta=test_lettre(mot1, mot_c, tenta)[0], test_lettre(mot1, mot_c, tenta)[1]

mais je fais quand même deux fois la fonction ^^'
je pense voir le problème, mais pas la solution :/
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
Si je te demande de calculer le cosinus d'une variable A et de mettre le résultat retourné dans une variable B, quel code vas tu écrire?
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020

Euh, j'me rends compte que mes bases sont (vraiment) bancales ^^'

from math import*
def cosinus(A):
    return cos(A)
B=cosinus(A)
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
Ok, donc là ta fonction retourne un double que tu stockes dans une variable qui sera de fait un double.

Revenons à test_lettre, cette fonction retourne une liste que peux tu en faire?
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020

while tenta<10:
    result=test_lettre(mot1, mot_c, tenta)
    mot_c=result[0]
    tenta=result[1]
    print(tenta)
    print(mot_c)


Ca doit être bon maintenant ?
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
Ca doit être bon maintenant ?

A toi de me le dire, tu as essayé?
Messages postés
7
Date d'inscription
samedi 24 octobre 2020
Statut
Membre
Dernière intervention
24 octobre 2020

Ca m'a l'air de marcher ! Merci beaucoup ! (surtout de m'avoir guidé et pas donné directement la solution :D )
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
C'est pas fini.

Cette façon de faire est valable dans tous les langages, si une fonction retourne une collection (tableau, liste, etc....) pour ne pas l'appeler n fois, il faut stocker le résultat dans une seconde collection et utiliser cette seconde collection par la suite.

Mais Python permet autre chose, si tu sais que la collection retournée contient n élément, tu peux directement affecter le résultat à n variables
def Truc():
    Valeur1 = "test 1"
    Valeur2 = "test 2"
    return Valeur1, Valeur2
    #return [Valeur1, Valeur2]  et ça marche avec ou sans les crochets
    
resutat1, resutat2 = Truc()
print(resutat1)
print(resutat2)



surtout de m'avoir guidé et pas donné directement la solution :D

C'est une règle ici, on ne fait pas le travail des autres à leur place et s'ils ne jouent pas le jeu, on ne les aide pas
Messages postés
14906
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 octobre 2020
595
si c'est bon pour toi, pense à marquer le sujet résolu