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

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x=input("entrez votre nombre: ")
    while x:
        if x.isdigit():
            numbers.append(x)
        x=input("entrez votre nombre: ")
    Ca c'est l'algorithme qu'on apprend dans les cours d'algo, l'algorithme "scolaire". Celui où on reste bien sage et où on écoute le professeur qui dit que le "break" c'est pas propre et que le "continue" c'est une hérésie et qu'une fonction doit n'avoir qu'un seul "return". Celui où on dit "oui professeur" et où on lui offre une pomme à la fin du cours.
    Ensuite, on arrive dans le vrai monde, celui où on se dit que si on peut n'écrire qu'une instruction au lieu de deux identiques quitte à mettre un petit break qui ne mange pas de pain c'est sympa, celui où on préfère sortir de la fonction dès qu'elle a obtenu une certitude via un return en plein milieu et celui où on a inventé le while ((x=input(...)) != valeur_finale) qui a été porté en Python v3.8 tellement c'était pratique sous le nom d'opérateur morse.
    Et là on se dit que l'école c'était bien joli mais bon, maintenant il faut arrêter de se pignoler avec la théorie et faire du concret (en essayant de ne pas tomber dans l'excès car en réalité c'est lui qui est néfaste et non les outils qu'on utilise).

    Citation Envoyé par Hominidé Voir le message
    Et puisque, j'ai affirmé que je n'aime pas les while^^:
    Ca par exemple c'est un excès. while est un très bon outil s'il est employé dans son concept d'usage. Et inversement ne pas l'utiliser là où il serait nécessaire juste pour une question de goût c'est se priver d'une possibilité pratique et devoir la remplacer alors par d'autres outils dans une écriture bien souvent plus chaotique.

    Citation Envoyé par Hominidé Voir le message
    Code python : 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) ]
    Parfait exemple illustratif. Remplacer ce qui aurait été si simple avec un while par un appel récursif. L'appel récursif qui va devoir sauvegarder le contexte de travail pour générer un nouveau sous-contexte vierge (ce n'est pas gratuit en terme de RAM et de proc), et ce autant de fois qu'on se trompe dans la saisie. Bon ok tu me diras que la récursion est limitée à 1000 sous Python donc tu peux admettre que le gogol qui répond ne se trompera probablement pas 1000 fois mais qui te dit que ce que tu codes ne deviendra pas demain une librairie utilisable par d'autres et donc y compris par certains qui définiront cette limite à 3, 2 ou 1 ?
    Sinon il reste que cela peut amener des erreurs d'étourderie qui n'y auraient pas été avec un while comme ce "else" inutile (mais qui est traité par le proc) ou oublier de replacer le prompt à afficher dans l'appel récursif.
    Accessoirement la liste en intension c'est une bonne idée (content que tu aies bien pigé le truc) mais si "numbers" n'a pas vocation à évoluer on conseille plutôt le tuple que la liste qui prend moins de place en RAM.

    Code python : 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=''):
        while True:
            x=input(msg)
            if x.isdigit(): return int(x)
            print("Vous devez saisir un chiffre, svp, recommencez.")
        # while
    # get_user_input()
     
    n=get_user_int_input("Nombre d'entree ?")
    numbers = tuple(get_user_int_input() for i in range(n))
    Ma fonction fait 7 lignes (avec les commentaires) là où la tienne en a 7 (sans les commentaires). Ne pas oublier les principes zen de Python dont l'un deux dit que simple est mieux que complexe (https://www.python.org/dev/peps/pep-0020/)
    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]

  2. #22
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    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 : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    m'enfin Sve@r, fallait pas prendre tout au premier degrès. Tu n'as pas vu que je faisais mumuse?

    Fred lui à jouer le jeu... D'ailleurs Bravo pour sa solution qui n'utilise ni while, ni for ...
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    m'enfin Sve@r, fallait pas prendre tout au premier degrès.
    m'enfin tu n'as pas vu mes smileys ?

    Citation Envoyé par Hominidé Voir le message
    D'ailleurs Bravo pour sa solution qui n'utilise ni while, ni for ...
    Mouais. On bascule de l'autre côté du miroir
    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. #24
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Effectivement, lorsqu'on a une suite d'informations à saisir, savoir combien il va y en avoir ou gérer un marqueur de fin sont des solutions.

    On peut aussi entrer une suite d'entiers séparés par des espaces ou des virgules voire proposer d'aller les lire dans un fichier (histoire que l'utilisateur puisse vérifier et avoir quelque chose de reproductible).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> [ int(z) for z in input('nombres: ').split() ]
    nombres: 1 2 3
    [1, 2, 3]
    >>>
    Pour chaque interface, une cuisine un peu différente pour retourner la même liste d'entiers et commencer (enfin!) à pouvoir en faire quelque chose (le plus important).

    Car oui, écrire çà avec le Python qu'on connaît sans se prendre le chou à optimiser quoi que ce soit (çà n'ira pas plus vite que ce que tape l'utilisateur...) pour commencer les choses sérieuses...

    D'ailleurs, la saisie, je ne commence jamais par là, je préfère écrire la fonction qui va en faire quelque chose pour lui passer directement la liste et voir si elle en fait ce que j'attends.

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

  5. #25
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    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 : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    m'enfin tu n'as pas vu mes smileys ?
    Joli sourire. Cool
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  6. #26
    Membre à l'essai
    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
    Points : 10
    Points
    10
    Par défaut
    Hello hello,

    je vois que ca s'est un peu emballé ahah ^^. Merci pour vos commentaires.

    Je pense que je comprends à peu près tout à l'exception de la dernière ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numbers = tuple(get_user_int_input() for i in range(n))
    Je comprends et connais le concept de tuple pas de soucis avec cela. En revanche je ne comprends pas pourquoi on rappelle une fois encore la fonction get_user_int_input() alors qu'on vient juste de l'appeler au dessus pour avoir le nombre n (nombre de chiffre à demander). Je suis perdu ^^

  7. #27
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par benja92 Voir le message
    En revanche je ne comprends pas pourquoi on rappelle une fois encore la fonction get_user_int_input() alors qu'on vient juste de l'appeler au dessus pour avoir le nombre n (nombre de chiffre à demander). Je suis perdu ^^
    Initialement, votre difficulté était de décomposer int(input(....)) pour tester la fin de la saisie. Quelque part, lire du code (comme le ferait l'interpréteur Python) pour y décortiquer les opérations de base qui la composent n'est pas encore acquis.

    Ce n'est pas grave... vous avez juste plein de choses à apprendre et un gros potentiel de progression.

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

  8. #28
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benja92 Voir le message
    je vois que ca s'est un peu emballé ahah ^^. Merci pour vos commentaires.
    Ouais, c'est souvent le cas ici. On se challenge un peu sur des conneries
    C'est effectivement plus facile en Python, avec sa syntaxe, offre tout un tas de façons d'arriver au résultat qu'avec d'autres langages plus rigides.

    Citation Envoyé par benja92 Voir le message
    Je comprends et connais le concept de tuple pas de soucis avec cela. En revanche je ne comprends pas pourquoi on rappelle une fois encore la fonction get_user_int_input() alors qu'on vient juste de l'appeler au dessus pour avoir le nombre n (nombre de chiffre à demander). Je suis perdu ^^
    On commence par demander combien de chiffres on va devoir saisir, puis on fait saisir effectivement ces chiffres qu'on stocke alors dans une liste (pour Hominidé) et dans un tuple (pour moi). Je considère le tuple comme préférable à la liste (moins gourmand) quand cette liste n'a pas besoin d'évoluer ensuite.
    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. #29
    Membre à l'essai
    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
    Points : 10
    Points
    10
    Par défaut
    Salut

    Je pense avoir finalement compris le code. très smart comme solution. Mais je pense avoir besoin de la "digérer" avant de pouvoir l'intégrer immédiatement et de tête à mes codes sans devoir la regarder ^^

    Merci à tous pour vos inputs.
    Mais comme ils étaient brillants, je me vois dans l'obligation d'ouvrir un nouveau sujet pour bénéficier de votre savoir ahah.
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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