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

Python Discussion :

Fonction récursive dans except


Sujet :

Python

  1. #1
    Nouveau membre du Club Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Points : 31
    Points
    31
    Par défaut Fonction récursive dans except
    Débutant avec Python 3.5

    Je voudrais tester si les données rentrées sont bien des int. sinon reprendre la fonction.
    Il doit y avoir des façons plus simples pour faire cela, mais j'aimerais comprendre pourquoi ça ne marche pas
    Merci pour vos réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def ajouterAge():
        age = input("donner son âge(arrondi en années) : ")
        if age == '':
            return
        try:
            ageint = int(age)
            return ageint
        except:
            print("attention !!!")
            ajouterAge()
     
    son_age = ajouterAge()
    print(son_age)
    je rentre df puis 34 et c'est None qui apparaît.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> 
    donner son âge(arrondi en années) : df
    attention !!!
    donner son âge(arrondi en années) : 34
    None
    >>>

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    En Python, None est ce que retournent les fonctions "par défaut":
    i.e., si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> def foo(): pass
    ...
    vous obtenez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> print (foo())
    None
    >>>
    Dit autrement, s'il n'y a pas un "return" de quelque chose à la fin de la fonction, çà retourne "None".
    Et les fonctions récursives ne sont qu'un cas particulier.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par temabul Voir le message
    Débutant avec Python 3.5

    Je voudrais tester si les données rentrées sont bien des int. sinon reprendre la fonction.
    Il doit y avoir des façons plus simples pour faire cela, mais j'aimerais comprendre pourquoi ça ne marche pas
    Merci pour vos réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def ajouterAge():
        age = input("donner son âge(arrondi en années) : ")
        if age == '':
            return
        try:
            ageint = int(age)
            return ageint
        except:
            print("attention !!!")
            ajouterAge()
     
    son_age = ajouterAge()
    print(son_age)
    je rentre df puis 34 et c'est None qui apparaît.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> 
    donner son âge(arrondi en années) : df
    attention !!!
    donner son âge(arrondi en années) : 34
    None
    >>>
    Bosoir,
    Lors d'une erreur, la fonction s'appelle. Au deuxième niveau, en cas de donnée entière, le retour est cette valeur. Et elle est transmise à la fonction appelante… Qui est donc la fonction dans laquelle s'était produite l'erreur… Oui?
    Cette dernière ne contient pas de "return" (après le "except")… Elle renvoie donc "None"…

    Clodion

    PS: une solution (bof) serait de rajouter un paramètre à valeur par défaut et un retour de cette valeur!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def ajouterAge(val=25):
        age = input("donner son âge(arrondi en années) : ")
        if age == '':
            return
        try:
            ageint = int(age)
            return ageint
        except:
            print("attention !!!")
            val=ajouterAge()
        return val
     
    son_age = ajouterAge()
    print(son_age)
    Mais ce n'est vraiment pas beau!

  4. #4
    Nouveau membre du Club Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Merci Clodion, je n'avais pas compris que le déroulement du programme revient dans la partie except après appel à la fonction "ajouterAge()". Il doit bien y avoir un moyen pour que cela fasse comme si on repartait à zéro avec la fonction "ajouterAge()" ?
    Mais alors là je ne suis certainement pas clair.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par temabul Voir le message
    Merci Clodion, je n'avais pas compris que le déroulement du programme revient dans la partie except après appel à la fonction "ajouterAge()". Il doit bien y avoir un moyen pour que cela fasse comme si on repartait à zéro avec la fonction "ajouterAge()" ?
    Mais alors là je ne suis certainement pas clair.
    Bonsoir,
    Personnellement, j'utiliserais plutôt quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def retourne_age():
        while 1:
            age = input("donner son âge(arrondi en années) : ")
            if age.isnumeric():
                return int(age)
            print("attention !!!")
     
    print(retourne_age())
    Sinon, mais cela ne me conviens pas trop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def retourne_age():
        while 1:
            try:
                return int(input("donner son âge(arrondi en années) : "))
            except:
                print("attention !!!")
     
    print(retourne_age())
    Clodion

  6. #6
    Nouveau membre du Club Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Clodion, merci pour tes deux solutions.

    Utiliser la méthode "isnumeric" (que je ne connaissais pas) est intéressante.
    Mais comme à un autre endroit je dois vérifier si les entrées correspondent à des "float", je crois que la solution qui ne te convient pas trop, en fait n'est pas si mauvaise.

  7. #7
    Membre averti Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Points : 388
    Points
    388
    Par défaut

    vu que ce sont des chaînes de caratères que tu traites, essaies dans le terminal " help('str') " tu verras pleins de trucs utiles.... (c'etait juste pour aider même si çà sent le HS à plein nez)
    Toute chose dépend de la valeur qu'on lui attribue !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Si la question est "pourquoi mon appel récursif retourne None", il suffit d'ajouter "return":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def ajouterAge():
        age = input("donner son âge(arrondi en années) : ")
        if age == '':
            return
        try:
            ageint = int(age)
            return ageint
        except:
            print("attention !!!")
            return ajouterAge()
     
    son_age = ajouterAge()
    print(son_age)
    Saisir une chaîne de caractères, s'assurer qu'il s'agit d'un entier, le retourner.... sous différentes formes, voilà ce qu'on apprend dans un tuto. comme le Swinnen

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau membre du Club Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Bonjour wiztricks,

    Quitter et puis ré-effectuer la fonction :

    Voilà ce qui correspond exactement à ce que je cherchais.
    Quand on le voit c'est archi évident.

    Merci pour les réponses et bonne journée.

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

Discussions similaires

  1. Fonction récursive dans une page XHTML
    Par kotakota dans le forum JSF
    Réponses: 0
    Dernier message: 13/07/2012, 17h13
  2. Fonction récursive dans une classe
    Par Aloneghost dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 01/10/2010, 15h22
  3. [MySQL] Fonction récursive dans une boucle
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/02/2008, 12h18
  4. Fonction récursive dans une classe
    Par Orbiplanax dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 16h24
  5. Réponses: 7
    Dernier message: 22/06/2007, 10h56

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