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 :

boucle infinie que je comprends pas


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Par défaut boucle infinie que je comprends pas
    J'ai commencé à apprendre python hier et je ne comprends ps où peut-être mon erreur dans le bout de code suivant,
    quand je lance, ça me fait une boucle infinie...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    year=input("entrer une année") 
    year=int(year) 
     
    while year < 2040:
    	if year % 4 == 0 and year % 100 != 0:
    		print("this", year,"is bisex")
    	else:
    		print()
    else:
    	print()
    merci

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Si ton indentation est voulue, alors il y a une mauvaise comprehension de la boucle while. While signifie "tant que". Il n'y a donc pas par nature de "sinon" (else). Si tu souhaite sortir d'une boucle while tu as deux façons, soit tu ne satisfait plus la condition (dans ton cas year<2040) soit tu force la sortie en plaçant un "break", qui comme son nom l'indique "casse" la boucle.

    Bref, si tu veux que quelqu'un cherche une année bissextile il te faut plutôt faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while True:
        year = input("Entrer une annee") 
        year = int(year) 
        if year % 4 == 0 and year % 100 != 0:
            print("this", year," is bisex")
            break
    Si tu souhaites rajouter des conditions sur l'année, par exemple inférieure à 2040, tu peux ajouter un autre "if" avec un break.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while True:
        year = input("Entrer une année") 
        year = int(year) 
        if year > 2040:
            break
        if year % 4 == 0 and year % 100 != 0:
            print("this", year," is bisex")
            break
    Mais c'est peut-être pas là où tu voulais en venir.

    J

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Par défaut
    Salut,

    c'est pas une fonctionalité qu'on retrouve souvent dans un langage, mais en python, on peut bien avoir un else après une boucle.
    la clause else est exécutée si la boucle s'est terminée "normalement", c'est à dire autrement que par une instruction break.

    ça peut avoir son utilité des fois.


    ne sachant pas réellement ce que tu veux faire lamwat, c'est difficile de te donner une solution mais on peut au moins t'expliquer pourquoi ça boucle indéfiniment.
    ta boucle while tourne tant que la variables year est strictement inférieure à 2040. hors le seul endroit ou tu donnes une valeur à year se trouve avant la boucle et cette variable ne change plus de valeur après.
    donc...
    • soit tu entres une année supérieure ou égale à 2040 et tu ne rentres jamais dans la boucle
    • soit tu entres une année inférieure à 2040, tu entres dans la boucle et tu n'en ressors jamais car year ne changeant jamais de valeur, le résultat du test de ta boucle ne risque pas de changer

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Par défaut
    Citation Envoyé par Tryph Voir le message
    Salut,

    c'est pas une fonctionalité qu'on retrouve souvent dans un langage, mais en python, on peut bien avoir un else après une boucle.
    la clause else est exécutée si la boucle s'est terminée "normalement", c'est à dire autrement que par une instruction break.

    ça peut avoir son utilité des fois.


    ne sachant pas réellement ce que tu veux faire lamwat, c'est difficile de te donner une solution mais on peut au moins t'expliquer pourquoi ça boucle indéfiniment.
    ta boucle while tourne tant que la variables year est strictement inférieure à 2040. hors le seul endroit ou tu donnes une valeur à year se trouve avant la boucle et cette variable ne change plus de valeur après.
    donc...
    • soit tu entres une année supérieure ou égale à 2040 et tu ne rentres jamais dans la boucle
    • soit tu entres une année inférieure à 2040, tu entres dans la boucle et tu n'en ressors jamais car year ne changeant jamais de valeur, le résultat du test de ta boucle ne risque pas de changer
    j'ai vu çà dans les cours que j'ai commencé hier soir... donc je rajoute un système de year+1 pour forcer la boucle à augmenter la valeur de year à chaque répétition et ça devrait marcher.

    Est ce que sur Python on peut ajouter une annexe à la bouche pour qu'elle cesse d'elle même après un certains temps, peu importe le résultat ?

    Le petit programme que je souhaite réaliser devrait lister les années bissextiles jusqu'à 2040 et ce à partir d'une année précisée par l'utilisateur (input). Y'a pas d'utilité en soi au logiciel, seulement d'apprendre.

    merci beaucoup pour la correction

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Citation Envoyé par Tryph Voir le message
    Salut,

    c'est pas une fonctionalité qu'on retrouve souvent dans un langage, mais en python, on peut bien avoir un else après une boucle.
    la clause else est exécutée si la boucle s'est terminée "normalement", c'est à dire autrement que par une instruction break
    Honte sur moi, je ne l'avais jamais rencontré et j'en avais déduit que ça n'existais pas (d'autant plus que ça me paraissait totalement normal). Maintenant je vois quelques cas de figures où cette feature peut être utile.

    Merci Tryph!


    J

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Honte sur moi, je ne l'avais jamais rencontré et j'en avais déduit que ça n'existais pas (d'autant plus que ça me paraissait totalement normal). Maintenant je vois quelques cas de figures où cette feature peut être utile.

    Merci Tryph!
    y a pas de honte à avoir. python est le seul langage que je connais qui permet ça et du coup on s'attend pas forcément à avoir une telle fonctionalité à disposition.


    Citation Envoyé par lamwat Voir le message
    j'ai vu çà dans les cours que j'ai commencé hier soir... donc je rajoute un système de year+1 pour forcer la boucle à augmenter la valeur de year à chaque répétition et ça devrait marcher.
    ça devrait effectivement marcher

    Citation Envoyé par lamwat Voir le message
    Est ce que sur Python on peut ajouter une annexe à la bouche pour qu'elle cesse d'elle même après un certains temps, peu importe le résultat ?
    si tu veux être certain que ta boucle finira par se terminer, tu peux utiliser une boucle for au lieu d'une boucle while.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Par défaut
    je viens de découvrir def du coup je l'utilise et je suis arrivé à çà

    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
    >>> def bissex(year, max=2040):
          year=int(year)  
          if year % 4 == 0 and year % 100 != 0: # Si year est divisible par 4 et non par 100
                      print("this", year + 1,"is bissex") # Afficher this year is bisex
                      year += 1 # Incrémente la variable year de 1
          else:
                      print("nothing to show1")
     
     
    >>> bissex(2030)
    nothing to show1
    >>> bissex(2020)
    this 2021 is bissex
    >>> bissex(2009)
    nothing to show1
    >>> bissex(2011)
    nothing to show1
    >>>
    ça fonctionne presque sauf que la boucle ne continue pas (sic) et je n'obtiens pas de liste d'années bissextiles. Je vais aller voir for mais je n'ai pas tout à fait compris comment je pouvais l'utiliser dans mon cas.

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

Discussions similaires

  1. Diff IE7 et Firefox que je comprends pas
    Par syl2042 dans le forum Mise en page CSS
    Réponses: 15
    Dernier message: 20/09/2007, 10h35
  2. [FTP] Pb sur foreach que je comprend pas
    Par Shandler dans le forum Langage
    Réponses: 3
    Dernier message: 28/12/2006, 18h31
  3. Erreur que je comprends pas
    Par makohsarah dans le forum Langage
    Réponses: 1
    Dernier message: 30/08/2006, 18h14
  4. Petit truc tout simple que je comprend pas
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2005, 16h56
  5. Réponses: 13
    Dernier message: 27/06/2005, 14h36

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