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 :

Stopper boucle d'input pour liste [Python 3.X]


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
    Mai 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 25
    Par défaut Stopper boucle d'input pour liste
    Bonjour à tous,

    J'espère que je poste mon topic au bon endroit.

    Je débute la programmation sur Python en faisant plusieurs exercices.
    J'ai rencontré un petit problème assez récurrent auquel j'aurais voulu trouver une solution.
    Je souhaite créer une liste de plusieurs nombres, ces nombres étant déterminés par l'user via la fonction input. Pour ce faire je créé une boucle while dans laquelle l'user est amené à input ses choix. Mon soucis vient du fait que je n'arrive pas à stopper cette boucle sans interdire à l'user l'usage d'un nombre spécifique.

    voici mon exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste = []
    entrée = 0
    while entrée != -1:
        entrée = int(input("entrez votre nombre: "))
        if entrée == -1:
            break
        liste.append(entrée)
    print(liste)
    dans cet exemple je suis obligé de "condamner" l'utilisation du nombre -1 pour sortir de ma boucle. (par ailleurs, je pense, mais vous pourrez me le confirmer que la condition avec le "break" est sans doute redondante). J'ai essayé plusieurs variantes comme par exemple celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste = []
    entrée = 0
    while entrée != "":
        entrée = int(input("entrez votre nombre: "))
        if entrée == "":
            break
        liste.append(entrée)
    print(liste)
    mon problème vient alors du fait que l'input du user n'est pas un integer et que donc le programme plante. et si j'enlève l'integer (que je ne convertis pas l'input) je ne peux plus utiliser ma liste pour y appliquer des opérations mathématiques par exemple.

    J'espère que j'ai été clair dans mes propos.
    est ce que quelqu'un aurait une idée pour résoudre mon problème?
    Merci d'avance.

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

    Citation Envoyé par benja92 Voir le message
    est ce que quelqu'un aurait une idée pour résoudre mon problème?
    Plutôt que d'appliquer int a une chaine qui peut être vide, la tester avant voire s'assurer qu'en plus elle ne contient que des nombres semble logique.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par benja92 Voir le message
    J'espère que je poste mon topic au bon endroit.
    Exactement l'endroit où il fallait

    Citation Envoyé par benja92 Voir le message
    dans cet exemple je suis obligé de "condamner" l'utilisation du nombre -1 pour sortir de ma boucle.
    ...
    mon problème vient alors du fait que l'input du user n'est pas un integer et que donc le programme plante. et si j'enlève l'integer (que je ne convertis pas l'input) je ne peux plus utiliser ma liste pour y appliquer des opérations mathématiques par exemple.
    Tu as grosso-modo deux façons de résoudre le souci
    1. tu peux d'abord récupérer simplement l'input, sans tenter de le convertir en int. Donc tu obtiens une string que tu peux tester par rapport à un mot clef (ex "quit"). Et si la string n'est pas le mot clef, alors là tu la convertis en int
      Exemple
      Code python : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      while True:
          entree = input("entrez votre nombre: ")
          if entree == "quit":
              break
          liste.append(int(entree))
      # while
      Evidemment là on part du principe que la conversion en int est toujours faisable
    2. tu peux utiliser un try/except pour récupérer l'exception "la string n'est pas convertible en int" et dans ce cas, cela signifie que tu dois quitter. Ok cela fait appel à une notion de "gestion des exceptions" à laquelle tu n'es peut-être pas encore arrivé


    Citation Envoyé par benja92 Voir le message
    (par ailleurs, je pense, mais vous pourrez me le confirmer que la condition avec le "break" est sans doute redondante).
    Exact. Ce n'est pas la condition avec le break qui est redondante (il faut tester si tu sors ou pas), mais celle dans le while qui alors ne sert à rien. L'usage dans ce cas de figure est de partir sur une boucle infinie (while True).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 25
    Par défaut
    Bonjour,

    Merci à tous les deux pour vos réponses.

    Plutôt que d'appliquer int a une chaine qui peut être vide, la tester avant voire s'assurer qu'en plus elle ne contient que des nombres semble logique.
    Tout à fait d'accord et j'implanterai ce genre de test pour des programmes plus avancés (et quand mes compétences seront plus développées également), mais je partais du principe que l'user ne commettrait pas d'erreur.


    tu peux d'abord récupérer simplement l'input, sans tenter de le convertir en int. Donc tu obtiens une string que tu peux tester par rapport à un mot clef (ex "quit"). Et si la string n'est pas le mot clef, alors là tu la convertis en int
    Aaaah magnifique, c'est exactement ca que je cherchais. effectivement convertir en int au moment d'append la liste est une excellente idée.*


    tu peux utiliser un try/except pour récupérer l'exception "la string n'est pas convertible en int" et dans ce cas, cela signifie que tu dois quitter. Ok cela fait appel à une notion de "gestion des exceptions" à laquelle tu n'es peut-être pas encore arrivé
    J'ai été exposé à ce concept (try/except) mais je ne l'ai encore jamais appliqué/utilisé. je vais essayer de le mettre en application progressivement, dans des exercices plus avancés.

    Exact. Ce n'est pas la condition avec le break qui est redondante (il faut tester si tu sors ou pas), mais celle dans le while qui alors ne sert à rien. L'usage dans ce cas de figure est de partir sur une boucle infinie (while True).
    Il me semble qu'avec la solution numéro 1, je peux entrer des strings. en conséquence je peux vérifier la condition soit dans l'initialisation de la boucle (par exemple: while entrée != ""), soit en son sein avec while True et le mot clé break. est ce que l'une des ces 2 méthodes est préférée/conseillée?

    Merci encore pour vos aides et solutions.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benja92 Voir le message
    effectivement convertir en int au moment d'append la liste est une excellente idée
    Un des fondamentaux de la prog. Ne traiter les données que quand elles ont besoin d'être traitées et non 3 semaines avant au risque de traiter des données qui seront en réalité jetées.

    Citation Envoyé par benja92 Voir le message
    J'ai été exposé à ce concept (try/except) mais je ne l'ai encore jamais appliqué/utilisé. je vais essayer de le mettre en application progressivement, dans des exercices plus avancés.
    C'est souvent une solution plébiscitée en Python. On part du principe que l'action est faisable et on détecte le cas "elle n'a pas pu se faire". C'est souvent plus facile que tester la faisabilité et le faire (avec le risque que la faisabilité change entre le test et l'action si par exemple la faisabilité d'appuie sur un critère modifiable depuis l'extérieur et qu'on bosse en environnement multi-users)

    Citation Envoyé par benja92 Voir le message
    Il me semble qu'avec la solution numéro 1, je peux entrer des strings. en conséquence je peux vérifier la condition soit dans l'initialisation de la boucle (par exemple: while entrée != ""), soit en son sein avec while True et le mot clé break. est ce que l'une des ces 2 méthodes est préférée/conseillée?
    Si tu pars que sur un while entree != "", comment feras-tu ensuite, une fois l'input reçu de l'utilisateur, pour détecter que cet input est ou n'est pas à convertir en int ? Tu seras obligé de re-tester if entree == "" (accessoirement on préfère écrire if not entree).
    Donc entre la méthode "je ne fais qu'un test" et la méthode "je fais le même test deux fois"...

    PS: les accents dans les noms de variables c'est en général plutôt déconseillé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Perso, moi qui n'aime pas les whiles (chutttt, on ne discute pas sur les goûts et les couleurs^^), je trouve les boucles for plus dans l'esprit de python.
    Et pour cela nous disposons de iter() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste_int = []
    for data in iter(input, ""):  #Pour sortir de la boucle appuyer sur la touche return sans faire de saisie
        try:
            liste_int.append(int(data))
        except:
            print("Erreur. Je veux des entiers !")
     
    print(liste_int)
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    10
    40
    FFF
    Erreur. Je veux des entiers !
    88
     
    [10, 40, 88]
    >>>

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Une autre manière de faire avec while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    numbers = []
    while x := input("entrez votre nombre: "):
        if x.isdigit():
            numbers.append(x)
    print(numbers)
    Je présente la solution isdigit car ici on ne peut pas parler d'optimisation...

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Et pour cela nous disposons de iter()
    Joli coup !!! iter(input, ""). Je n'y aurais jamais pensé

    Citation Envoyé par fred1599 Voir le message
    Je présente la solution isdigit car ici on ne peut pas parler d'optimisation...
    Tu as surtout présenté le tout nouvel opérateur morse := auquel on n'est pas encore tous habitués

    C'est probablement une des plus grande difficultés de Python: trouver immédiatement, parmis la masse d'outils existants, celui qui pourra s'appliquer parfaitement à la problématique (nécessité de connaitre alors tous les outils offerts et de se maintenir à flot avec tous ceux qui sortent en permanence)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Oui mais :

    Citation Envoyé par benja92 Voir le message
    je partais du principe que l'user ne commettrait pas d'erreur.
    Et après on pourrait quand même gérer les erreurs de saisie. Car gérer les erreurs de saisie, ou bien s'assurer qu'on a rentrer le bon nombre d'input sont 2 problemes indépendant.

    Suffirait de faire qqch comme ca (ca rejoins les autres réponses, mais on a pas à avoir un mot clé pour terminer la séquence de saisie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def get_user_int_input(msg=''):
        x=input(msg)
        while not x.isdigit():
             print("Vous devez saisir un chiffre, svp, recommencez.")
             x=input(msg)
        return int(x)
     
    n=get_user_int_input("Nombre d'entree ?")
    numbers = [ get_user_int_input() for i in range(n) ]

  10. #10
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Car gérer les erreurs de saisie, ou bien s'assurer qu'on a rentrer le bon nombre d'input sont 2 problemes indépendant.
    Oui, tu as entièrement raison

    Et puisque, j'ai affirmé que je n'aime pas les while^^:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def get_user_int_input(msg=''):
        x=input(msg)
        if x.isdigit():
            return int(x)
        else:
            print("Vous devez saisir un chiffre, svp, recommencez.")
            get_user_int_input()
     
    n=get_user_int_input("Nombre d'entree ?")
    numbers = [ get_user_int_input() for i in range(n) ]

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    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
    def get_user_int_input(msg='', result=None, n=0):    
        if result is None:
            result = []
        if n == 0:
            return result
        x = input(msg)
        if x.isdigit():
            result.append(int(x))
            n -= 1
        else:
            print("Vous devez saisir un chiffre, svp, recommencez.")
        return get_user_int_input(msg=msg, result=result, n=n)
     
     
    numbers = get_user_int_input(msg="Valeur: ", n=5)  # 5 valeurs à entrer dans une liste initialisée vide
    print(numbers)
    ?

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

Discussions similaires

  1. [XL-2016] boucle pour liste sans doublon
    Par motivator dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/01/2020, 23h50
  2. Boucle en sql pour liste de résultats
    Par Lolitaaa dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/07/2009, 18h52
  3. Réponses: 3
    Dernier message: 07/05/2009, 10h28
  4. Réponses: 2
    Dernier message: 01/08/2005, 16h55
  5. Réponses: 8
    Dernier message: 08/05/2004, 13h58

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