IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Interruption d'une boucle - variable non définie


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Interruption d'une boucle - variable non définie
    Bonjour à tous,

    Essayant de coder un jeu d'aventure avec interface texte sous IDLE, et ayant mis en place une boucle afin de demander au joueur ce qu'il veut faire, je me trouve face à un problème: comment éviter l'interruption de cette boucle suite à l'entrée d'une variable non définie?

    En simplifié, cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def agir () :
        Action = input("Que faire?")
        #suite à cela, la fonction analyse ce qui est entré au clavier
        agir()
    Je souhaiterais qu'en entrant une variable non définie, IDLE n'interrompe pas la boucle, et m'imprime "je ne peux pas faire ça", suivi d'un retour à la fonction "agir".

    Merci d'avance!

    Sérendipité

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Regardez du coté de while (pas mal d'exemples sur le Forum).

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    je pense que tu veux plutôt parler d'une valeur non prévue, et non d'une variable non définie, non ? Cause là ta variable est bien définie, c'est 'Action'

    Et puis ton raisonnement est aussi bien qu'un while, c'est un raisonnement récursif. Et c'est très bien.

    Mais ton problème est très simple, il te suffit soit d'établir une liste des valeurs attendues de action, puis de verifier si action est dans la liste ou non, si non, alors "printer" machn chose puis faire un appel à la fonction agir(). Ou bien anticiper chaque valeur attendues dans une structure if elif, puis à la fin, else sert précisément à dire "dans tous les autres cas"... d'ailleurs même dans la première solution proposée on se sert de else. On ne peut faire autrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def agir():
        valid_actions = (0,1,2,4)
        action = input('que faire ?')
        if action not in valid_actions:
            print 'inconnu'
            agir()
        else :
            if actionn ==1 :
                 return action*4
            [...]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses.

    L'interface fonctionne à base de mots-clefs; ce qui mènera à entrer des choses comme: "EXAMINER SALLE", "MANGER POMME", "COMBINER CHAUSSETTE AVEC BÂTON".

    Je tiens à entrer ces mots-clef sans guillemets, IDLE les prend donc pour des variables ; j'ai contourné le problème en leur affectant à chacun une valeur.
    N.tox, suivant ta réponse, je me retrouve avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def agir () :
        MotsClef = (EXAMINER, UTILISER, PRENDRE, COMBINER, AVEC, SUR) #une valeur a été assignée à chacun de ces mots-clef auparavant
        Action = input ("Que faire?")
        if Action not in MotsClef : print "Je ne peux pas faire ca!"
        else :
            analyse (Action) #fonction qui décodera l'entrée. 
        agir()
    Le problème ici est que quand j'entre un truc au pif (ex: afterglürkladakapok), IDLE interrompt la boucle et me sort quelque chose se terminant par:

    Action = input ("Que faire?")
    File "<string>", line 1, in <module>
    NameError: name 'afterglürkladakapok' is not defined


    ...là où je souhaiterais qu'il me dise "je ne peux pas faire ca!", suivi d'un retour à la boucle "que faire?"

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ahhhhh..... eh bien il y a deux formes d'input ! input() lui attends un int ou un float, et raw_input() qui lui interprète l'input en tant que texte, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> test=input('press something\n')
    press something
    56
    >>> test
    56
    >>> type(test)
    <type 'int'>
    >>> test=raw_input('press something\n')
    press something
    5679
    >>> test
    '5679'
    >>> type(test)
    <type 'str'>
    Bon, ceci dit le NameError suggère que à un moment dans ton code tu cherches à faire appel à l'objet 'afterglürkladakapok' (sachant qu'en python tout est objet même les int), or rien dans le bout de code que tu montre ne suggère une telle action, si effectivement l'execution de ce code soulève un NameError, cela ne vient pas de la fonction "agir"...

    essayes déja de remplacer input() par raw_input()...

    Quoi qu'il en soit pourriez vous montrer les valeurs affecter aux variable globales EXAMINER & co ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    CA MAAAARCHE!!! \/

    ...hem. Heu, oui, ça fonctionne; je ne connaissais point le "raw_input", merci, N.Tox, pour tes réponses rapides et précises!

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Citation Envoyé par N.tox Voir le message
    Et puis ton raisonnement est aussi bien qu'un while, c'est un raisonnement récursif. Et c'est très bien.
    Il vas falloir m'expliquer N.tox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def agir():
        print('tutu')
        agir()
     
    agir()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RuntimeError: maximum recursion depth exceeded

    @+
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bon ok...

    Explication

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import sys
     
    sys.setrecursionlimit(3)
     
    def agir():
        test=raw_input('press something : ')
        print test
        agir()
     
    agir()
    Recommander raw_input ? Pas sur si Sérendipité passe demain en Python 3

    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par PauseKawa Voir le message

    Recommander raw_input ? Pas sur si Sérendipité passe demain en Python 3


    ...mais encore?

  10. #10
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonsoir,



    Il vas falloir m'expliquer N.tox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def agir():
        print('tutu')
        agir()
     
    agir()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RuntimeError: maximum recursion depth exceeded

    @+
    Ah oui c'est vrai, je ne me souvenais plus de ça. Mais lorsque j'ai dis que la recursivité était aussi bien qu'un while, j'avais surtout à l'esprit la petite gymnastique mentale que cela implique, qui dans certains cas est la solution la plus adaptée... et pas forcément la plus évidente pour tout le monde.

    Ceci dit, je ne sais pas non plus quelle est la limite de recusion par défault ; elle doit être suffisament grande pour ne pas devenir gênante lors l'utilisation contrôlée de cette technique parfois nécessaire (ex: parcours complet d'un disque), non ?

    Mais je me dois alors de reconnaître que dans le contexte de Serenpidité, c'est un peu limite, étant alors obligé de savoir jusqu'à quelle profondeur de récursion le jeu peut aller...

    Et au sujet de raw_input dans python 3, je veux bien moi aussi quelques précisions pour ma curiosité, cause pour l'instant je n'ai pas l'intention d'y passer et donc ne me renseigne pas vraiment dessus. Es-tu en train de dire que cette fonction ne sera plus ?

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    @N.tox : Il me semble que la limite est de 1000. C'est peut être suffisant ici.
    Je suis d'accord sur le fait que penser récursif c'est bien mais comme Sérendipité est en 'phase d'apprentissage' nous nous devons de lui indiquer que cela risque de planter.

    @Sérendipité : Il existe une limite à la récursion. C'est une protection pour éviter tout débordement (comprendre plantage).
    Une fonction ne se rappelle pas elle même sans y arriver.
    La seule manière dans ce cas la c'est d'utiliser un autre objet pour la rappeler.

    Pour ce qui est de raw_input il est remplacer par input en Python 3. Action = input("Que faire ?") fonctionne sans souci en Python 3.
    Et le problème c'est qu'en Python 2.x input évalue l'entrée de l'utilisateur (d'où l'erreur)...

    Je ne suis (vraiment) pas un adepte de while mais si la condition est bien gérée je dois avouer que dans votre cas c'est plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import sys
     
    if sys.version_info[0] == 2:
        input = raw_input
     
    def analyse(Action):
        print(Action)
     
    def agir():
        MotsClef = ('EXAMINER', 'UTILISER', 'PRENDRE', 'COMBINER', 'AVEC',
            'SUR')
        flag = True
        while flag:
            Action = input("Que faire ?\n")
            if Action == 'QUIT':
                flag = False
            elif Action not in MotsClef:
                print("Je ne peux pas faire ca!")
            else:
                analyse(Action)
     
    agir()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  12. #12
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Petits compléments

    Dans la doc de Python 2.x:
    input([prompt])

    Equivalent to eval(raw_input(prompt)).

    Warning

    This function is not safe from user errors! It expects a valid Python expression as input; if the input is not syntactically valid, a SyntaxError will be raised. Other exceptions may be raised if there is an error during evaluation. (On the other hand, sometimes this is exactly what you need when writing a quick script for expert use.)

    If the readline module was loaded, then input() will use it to provide elaborate line editing and history features.

    Consider using the raw_input() function for general input from users.
    drive into python 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    raw_input() and input() global functions#
    
    Python 2 had two global functions for asking the user for input on the command line. The first, called input(), expected the user to enter a Python expression (and returned the result). The second, called raw_input(), just returned whatever the user typed. This was wildly confusing for beginners and widely regarded as a “wart” in the language. Python 3 excises this wart by renaming raw_input() to input(), so it works the way everyone naively expects it to work.
    Notes	Python 2	Python 3
    ①	raw_input()	input()
    ②	raw_input('prompt')	input('prompt')
    ③	input()	eval(input())
    
       1. In the simplest form, raw_input() becomes input().
       2. In Python 2, the raw_input() function could take a prompt as a parameter. This has been retained in Python 3.
       3. If you actually need to ask the user for a Python expression to evaluate, use the input() function and pass the result to eval().
    @++
    Merci d'utiliser le forum pour les questions techniques.

  13. #13
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    @N.tox : Il me semble que la limite est de 1000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    patrice@Zeus:~$ /usr/bin/python3.1
    Python 3.1.2 (release31-maint, Sep 17 2010, 20:34:23) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> print(sys.getrecursionlimit())
    1000
    >>> quit()
    patrice@Zeus:~$ /usr/bin/python2.6
    Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> print sys.getrecursionlimit()
    1000
    Merci d'utiliser le forum pour les questions techniques.

  14. #14
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Ahhh, merci bien pour toutes ces précision

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    De même!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2014, 12h53
  2. ++ sur une variable non définie
    Par sabotage dans le forum Langage
    Réponses: 3
    Dernier message: 31/10/2008, 16h19
  3. Test multiple sur une variable non définie
    Par Rei Angelus dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/12/2007, 22h01
  4. une variable non définie?
    Par Maxence45 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 25/11/2007, 12h23
  5. Problème de variable non définie
    Par Mimi Bulles dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2006, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo