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 :

Boucles - while - while True, while if, while else


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    aquaboniste
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : aquaboniste

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut Boucles - while - while True, while if, while else
    Bonjour a tous.
    j'apprends doucement a utiliser ce que j'ai appris et a me faire comprendre par l'interpreteur.
    La boucle while a ce stade m'interesse car elle est proche de la langue parlee et du comportement de l'homme quand il calcule "a la main".
    Cependant la peinture a la "while" c'est bien difficile meme si ce n'est pas ce qu'il y a de plus" for"!
    J'ai un trou dans "while True".

    Voici un extrait de wikipedia sur les boucles:


    In fact, what you will see a lot of in Python is the following -

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while True:
        n = raw_input("Please enter 'hello':")
        if n.strip() == 'hello':
            break
    As you can see, this compacts the whole thing into a piece of code managed entirely by the while loop. Having True as a condition ensures that the code runs until it's broken by n.strip() equalling 'hello'. The only problem with this is that it slows things down a lot - this is due to first testing the True condition for the while, then again testing the n.strip() value compared to the string 'hello'. Another version you may see of this type of loop uses 1 instead of True - this is exactly the same, though in Python 2.*, using while 1 is minutely faster, due to the ability to reassign True to a different value - the interpretor needs to look up the value of the variable, as opposed to loading a constant.

    As a programmer, it is up to you which style to use - but always remember that readability is important, and that speed is also important.


    Je ne comprends pas ce que veut dire "while True", c'est quoi qui doit être vrai?

    Ici on voit l'utilisation de while / if au lieu de while / else

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    Citation Envoyé par sirelion Voir le message
    Je ne comprends pas ce que veut dire "while True", c'est quoi qui doit être vrai?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while <expression>:
       ...
    Dans la boucle while ci-dessus, <expression> est évaluée (à chaque itération) et, si elle est "vraie", la suite des instructions est exécutée.

    un while True: correspond donc à ce qu'on appelle généralement une "boucle infinie" : l'expression est constante et vaut True : la condition pour continuer à boucler est toujours remplie.

    On en sort via un break (voir l'exemple Wikipedia que tu as posté : on sort de la boucle uniquement si l'on saisit 'hello')

  3. #3
    Membre averti
    Homme Profil pro
    aquaboniste
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : aquaboniste

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut @plxpy
    Bonsoir et merci beaucoup ainsi qu'a Tyrtamos et Wiztricks
    J'ai trouve un joli tutorial qui m'a aide a bien mieux ordonner dans ma tete les "flows control".
    Le voici. Je l'ai ajouter a mon petit carnet.
    http://www.tutorialspoint.com/python...op_control.htm
    Il manque un peu de consistance quand il explique la difference entre les roles de "else" dans la boucle "for" et dans la boucle "while"/

    En conclusion provisoire:
    Quant on PASS a la peinture a l'WHILE et qu'on CONTINUE on se sent tres FOR mais ca ne casse pas toujours des BREAK parce que quand on LOOP son coup ca peut faire pas mal de degat; par exemple si on est expedit-IF, et qu'on utilise des TRUE ELSE ou que l'enceFALSE precipite.

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Sors de ce corps, Boby Lapointe !

    trêve de plaisanterie (allez, c'est Noël !), poste tes vraies questions. Les "en rouge" et méga-sizes n'aident pas ...

  5. #5
    Membre averti
    Homme Profil pro
    aquaboniste
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : aquaboniste

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut OK plxpy
    Oui, c'est ca la question:
    Dans le tutoriel dont j'ai envoyé le lien, il est dit que dans la boucle "for in range ()", le else intervient quand la boucle a fini de passer la succession des valeurs du "range".
    Et c'est différent pour la boucle while car celle-ci est par définition en continuation quand sa variable de proposition est vraie et donc être fini c'est attribuer la valeur de vérité "False" a sa variable de proposition. Maintenant vérifions dans l'exemple proposé (qui coïncide avec ma première question sur les nombres premiers):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for num in range(10,20):  #to iterate between 10 to 20
       for i in range(2,num): #to iterate on the factors of the number
          if num%i == 0:      #to determine the first factor
             j=num/i #to calculate the second factor
             print '%d equals %d * %d' % (num,i,j)
             break #to move to the next number, the #first FOR
       else:        # else part of the loop
          print num, 'is a prime number'
    on voit que la proposition alternative "else" intervient quand la boucle pour un nombre candidat a la primauté s'est déroulée de 2 a n - 1.
    Mais alors pourquoi ca s'appelle else qui est un ou exclusif?. On ne peut pas dire que ca veut dire "si num est a l'extérieur du range c.-à-d. si la proposition for n'est pas vérifiée. Le mot else n'est surement pas le fruit d'un hasard! A

    Dans le "while" je comprends facilement que ca s'appelle else: par exemple si la proposition tant que a < 10 est vraie, alors imprimons a, sinon (else) écrivons une phrase et arrêtons la boucle.

    Ca c'est une question toute bête mais tant qu'il y a des choses qui m'empêchent de lire ca comme il faut je bloque. (remarque que je me conforme a ta demande de ne pas mélanger des plaisanteries, )

    Remarque: La boucle infinie while true ne serait-ce pas ce qu'on appelle la boucle "untill" en langage Ruby.
    Je m'excuse pour les blagues, a mon epoque on utilisait pas les emoticones (ce n'est pas une blague). Merci d'avance pour les eclaircissements.

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    La ligne 7 ne serait-elle pas inutile ?
    Dans ce cas, on pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for num in range(10,20):  #to iterate between 10 to 20
       for i in range(2,num): #to iterate on the factors of the number
          if num%i == 0:      #to determine the first factor
             j=num/i #to calculate the second factor
             print ('%d equals %d * %d' % (num,i,j))
             break #to move to the next number, the #first FOR
       print (num, 'is a prime number')

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    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 704
    Par défaut
    Salut,

    Citation Envoyé par sirelion Voir le message
    Dans le tutoriel dont j'ai envoyé le lien, il est dit que dans la boucle "for in range ()", le else intervient quand la boucle a fini de passer la succession des valeurs du "range".
    Et c'est différent pour la boucle while car celle-ci est par définition en continuation quand sa variable de proposition est vraie et donc être fini c'est attribuer la valeur de vérité "False" a sa variable de proposition. Maintenant vérifions dans l'exemple proposé (qui coïncide avec ma première question sur les nombres premiers):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for/while ...:
         ...
             break
         ...
    else:  # no break!
        ....
    Que ce soit avec "for" ou "while", le "else" associé ne sera exécuté que si le block ("for" ou "while") ne s'est pas terminé par "break".
    Il eut été intéressant de remplacer ce "else" là par une instruction "no_break".

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

  8. #8
    Membre averti
    Homme Profil pro
    aquaboniste
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : aquaboniste

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut @wiztricks & @marco056
    L’explication de Wiztricks est éclairante pour for en ce sens que le else est la "double negation" de "break", l'interruption de la boucle.

    Je vais reprendre pour voir si j'ai bien compris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    l = range(1,100)
    for x in l:
        if x == 100:
            print x
            break
        else: # ICI ON N" A PAS BREAKE PARCE QU"ON N"A PAS TROUVE LE 100!
            print x," is not 100"
    else:
        print "100 not found in range"
    pour le while: (et tant pis (!!!!!!!!!!!!!!!!!!!!!!!!!!) si je ne comprends pas pourquoi on l'appelle else) puisqu'il n'y a pas de break avant dans ma tête çà doit s'appeler no "break"
    a moins que le while ne soit une sorte d'arret par mise en echec(?!?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x = 5
    y = x
    while y > 0:
        print y
        y = y - 1
    else:  # ICI ON EST ARRIVE A LA FIN DU DÉROULEMENT DONC ON N'A PAS BREAKE 
        print x
    les codes sont copies ici (http://en.wikibooks.org/wiki/Python_...g/Control_Flow)

    la remarque de marco056 touche au fait que l'on puisse utiliser le degré d'indentation pour revenir au bloc plus a gauche (bloc incluant, plus global). Je m'y suis essaye plusieurs fois et la console me renvoie un truc sur l'indentation. c'est sur ca que j'echoue le plus. Je vais reprendre.

  9. #9
    Membre averti
    Homme Profil pro
    aquaboniste
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : aquaboniste

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut Allez, c'est pas en ayant peur de se ridiculiser qu'on apprend @marco056
    voici.
    Tu as l'air de savoir manipuler les indentations en repartant a gauche apres les sous-boucles. C'est la que je n'ai rien compris:

    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
    27
    # Un nombre premier est divisible uniquement par 1 et par
    # lui-meme.
    somme = 2
    total = 0
     
    while total < 1000:
        total = 1
        for x in range (3, 1000000):
    		for d in range (2, x):
    			if x % d == 0:
    				break
    			else:
    				somme = somme + x
    """ ici la console va me dire"  File "somme_de_nombres_premiers.py", line 15
        total += 1
                 ^
    IndentationError: unindent does not match any outer indentation level
    "   """			    
    	total += 1  #
     
    	print(x, " est un nombre premier!", somme, " est la somme actuellement.", total, " est le total de nombres premiers trouves." )
     
     
     
     
        else:
    		print("La somme totale est ", somme)
    Pourtant je pensais qu'ayant fini avec les "for" ca incrementerait la variable "total".
    Quel est le principe que j'ai compris de travers?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2015, 22h14
  2. insertion de données issues d'un array sans boucles de type for each ou while.
    Par piotrowski-s dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 05/09/2012, 11h27
  3. Boucle imbriquée avec for each et while
    Par guen dans le forum Access
    Réponses: 7
    Dernier message: 01/03/2007, 17h36
  4. Réponses: 6
    Dernier message: 24/01/2006, 13h31

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