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 :

Problème avec Input


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut Problème avec Input
    Bonjour à tous,

    Je souhaite créer un programme qui recherche des éléments dans une liste en fonction de valeurs maximum que tape l'utilisateur. Mon problème réside dans les Input NULL ou l'utilisateur ne rentre rien, que je ne sais pas (encore) gérer.
    Une condition en bas affiche tout les éléments de la liste qui correspond aux critères donnés.

    Voici mon code :

    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
    28
    29
    30
    31
    32
    33
    34
     
    pente_max_parcelles = input("pente max = ")
    altitude_max_parcelle = input("altitude max = ")
    orientation_max_parcelle = input("orientation max = ")
    nom_proprietaire = input("nom_proprietaire = ")
     
    compt = 0
     
    mes_parcelles = [12, 128, 256, "POSTEL"], [8, 140, 16, "RADE"], [40, 1458, 30, "POLO"], [36, 540, 30, "RADI"], [69, 1240, 201, "XAVI"], [45, 30, 58, "SAID"]
     
    if pente_parcelles == "":
    	pente_parcelles = int(pente_parcelles)
    	pente_parcelles = 99999
    else:
    	pente_parcelles = int(pente_parcelles)
     
    if altitude_parcelle == "":
    	altitude_parcelle = int(altitude_parcelle)
    	altitude_parcelle = 99999
    else:
    	altitude_parcelle = int(altitude_parcelle)
     
    if orientation_parcelle == "":
    	orientation_parcelle = int(orientation_parcelle)
    	orientation_parcelle = 99999
    else:
    	orientation_parcelle = int(orientation_parcelle)
     
     
    for raw in mes_parcelles:
    	if (raw[0] < pente_parcelles) and (raw[1] < altitude_parcelle) and (raw[2] < orientation_parcelle) and (raw[3] == nom_proprietaire):
    		print (mes_parcelles[compt])
    	else:
    		compt = compt + 1
    On part du principe que si l'utilisateur de rentre rien parmi les critères ci-dessus, c'est qu'il accepte n'importe quelle valeur.
    Comme on peut le voir, j'ai tenté de me dépatouiller avec mes moyens pour gérer les Input vides, afin que la valeur soit toujours vrai au niveau de la condition. Cela ne marche évidemment pas (un entier ne peut être vide).

    J'ai pensé à faire une condition "dynamique" qui n'interroge que les éléments entrés par l'utilisateur, malheureusement cela dépasse mes connaissances.

    Merci à vous.

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

    Citation Envoyé par preliator Voir le message
    Comme on peut le voir, j'ai tenté de me dépatouiller avec mes moyens pour gérer les Input vides, afin que la valeur soit toujours vrai au niveau de la condition. Cela ne marche évidemment pas (un entier ne peut être vide).
    Relisez votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if pente_parcelles == "":
    	pente_parcelles = int(pente_parcelles)
    	pente_parcelles = 99999
    else:
    	pente_parcelles = int(pente_parcelles)
    Quel est l'intérêt de faire int(pente_parcelles) alors que vous savez que çà va planter lorsque la chaine de caractères est vide et que vous allez assigner, dans ce cas, une valeur par défaut à pente_parcelles?
    Votre truc est tout simplement incohérent (pour ne pas dire que c'est n'importe quoi).

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Merci beaucoup pour ta réponse.

    Je ne l'ai pas indiqué ci-dessus, mais j'aimerais pouvoir garder l'entièreté de ma condition. Le problème que j'ai rencontré, c'était si l"utilisateur laisse vide un élément en int. Sachant que j'ai besoin d'un élément de type Numéric pour ne pas faire buguer le "(raw[0] < pente_parcelles)", je n'ai pas trouvé d'autre solution que d'écrire cette formule. Je suis en train de chercher un moyen de rendre ces valeurs toujours vrai, même si elle est vide.

    PS : Effectivement, lorsqu'on débute sur Python, on est très fortement tenté de faire des trucs "tout simplement incohérents" et parfois même "n'importe quoi" ; c'est dans l'ordre des choses. C'est la raison pour laquelle on va chercher de l'aide pour tenter de progresser.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par preliator Voir le message
    Effectivement, lorsqu'on débute sur Python, on est très fortement tenté de faire des trucs "tout simplement incohérents" et parfois même "n'importe quoi" ; c'est dans l'ordre des choses. C'est la raison pour laquelle on va chercher de l'aide pour tenter de progresser.
    Dans les tutos. il y a des exercices corrigés. Et normalement vous êtes supposé avoir ouvert un tuto. avant de poster.

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par preliator Voir le message
    Effectivement, lorsqu'on débute sur Python, on est très fortement tenté de faire des trucs "tout simplement incohérents" et parfois même "n'importe quoi" ; c'est dans l'ordre des choses. C'est la raison pour laquelle on va chercher de l'aide pour tenter de progresser.
    C'est pas une question de Python, c'est une question de bon sens et de réflexion et ça, aucun forum ne pourra les remplacer
    1. tu écris pente_parcelles = int(pente_parcelles) dans l'alternative if et dans le else. Dans ce cas, sors-là du corps de l'alternative
    2. tu écris pente_parcelles = int(pente_parcelles) puis pente_parcelles = autre_chose. Autrement dit, tu la remplis deux fois (la première est alors inutile)

    Et ça, ce n'est pas parce que tu débutes en Python que tu ne pouvais pas t'en rendre compte tout seul.

    Citation Envoyé par preliator Voir le message
    Le problème que j'ai rencontré, c'était si l"utilisateur laisse vide un élément en int.
    Ca signifie quoi "l'utilisateur laisse vide un élément en int" ? En Python, c'est le contenu qui fait la nature. Si tu écris var=123, alors "var" est int. Mais si tu écris ensuite var="123" alors "var" devient string. Et le retour d'un input() est toujours string. Donc tu commences par le traiter comme string et selon son contenu tu peux décider de quoi faire.

    Citation Envoyé par preliator Voir le message
    Je suis en train de chercher un moyen de rendre ces valeurs toujours vrai, même si elle est vide.
    Pareil, la préposition "même si elle est vide" est complètement inutile après la partie "rendre une valeur toujours vraie" puisque tu la veux "toujours" vraie. Te suffit d'écrire val=True et elle sera toujours vraie dans tous les cas (y compris si elle est vide). Ce qui ce conçoit bien s'énonce clairement.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not pente_parcelles:
    	pente_parcelles = 99999
    else:
    	pente_parcelles = int(pente_parcelles)

    Bon bien entendu, si l'utilisateur saisi "toto" au lieu d'un nombre, la valeur ne sera pas vide mais int() ne fonctionnera quand-même pas. Dans ce cas, il faut t'orienter vers try...except
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
    	pente_parcelles = int(pente_parcelles)
    except ValueError:
    	pente_parcelles = 99999

    Et ça, ça marche même si "pente_parcelles" est vide.
    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 confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Un grand merci à toi cela résout complètement mon problème.

    Pour le "nom_propriétaire" qui est au format texte de base, j'ai pu résoudre mon problème avec ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if not nom_proprietaire:
        func_comp_proprietaire = lambda value: True
    else:
        func_comp_proprietaire = lambda value: value == nom_proprietaire
    Pour finalement avoir ce rendu :

    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
    28
    29
    30
    31
    32
    33
    34
     
    pente_parcelles = input("pente = ")
    altitude_parcelle = input("altitude = ")
    orientation_parcelle = input("orientation = ")
    nom_proprietaire = input("nom_proprietaire = ")
     
    compt = 0
     
    mes_parcelles = [12, 128, 256, "POSTEL"], [8, 140, 16, "RADE"], [40, 1458, 30, "POLO"], [36, 540, 30, "RADI"], [69, 1240, 201, "XAVI"], [45, 30, 58, "SAID"]
     
    if not pente_parcelles:
    	pente_parcelles = 99999
    else:
    	pente_parcelles = int(pente_parcelles)
     
    if not altitude_parcelle:
    	altitude_parcelle = 99999
    else:
    	altitude_parcelle = int(altitude_parcelle)
     
    if not orientation_parcelle:
    	orientation_parcelle = 99999
    else:
    	orientation_parcelle = int(orientation_parcelle)
     
    if not nom_proprietaire:
        func_comp_proprietaire = lambda value: True
    else:
        func_comp_proprietaire = lambda value: value == nom_proprietaire
     
     
    for raw in mes_parcelles:
    	if (raw[0] < pente_parcelles) and (raw[1] < altitude_parcelle) and (raw[2] < orientation_parcelle) and func_comp_proprietaire(raw[3]):
    		print (raw)
    Merci à vous.

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

    On peut écrire simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (raw[0] < pente_parcelles) and (raw[1] < altitude_parcelle) and (raw[2] < orientation_parcelle) and nom_proprietaire == raw[3]
    ou mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_proprietaire == raw[3] and raw[0] < pente_parcelles and (raw[1] < altitude_parcelle and raw[2] < orientation_parcelle)
    Et si on emballe dans une fonction la relation de comparaison nom_proprietaire == raw[3] dans une fonction, "être cohérent" demanderait d'emballer aussi les comparaisons raw[0] < pente_parcelles, raw[1] < altitude_parcelle, ... pour autant que çà serve à quelque chose.

    Par contre, écrire les répétitions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if not pente_parcelles:
    	pente_parcelles = 99999
    else:
    	pente_parcelles = int(pente_parcelles)
     
    if not altitude_parcelle:
    	altitude_parcelle = 99999
    else:
    	altitude_parcelle = int(altitude_parcelle)
     
    if not orientation_parcelle:
    	orientation_parcelle = 99999
    else:
    	orientation_parcelle = int(orientation_parcelle)
    Sans avoir le réflexe d'écrire une fonction du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def get_int(prompt, default=99999):
          s = input(prompt)
          return int(s) if s else default
    pour remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pente_parcelles = input("pente = ")
    altitude_parcelle = input("altitude = ")
    orientation_parcelle = input("orientation = ")
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pente_parcelles = get_int("pente = ")
    altitude_parcelle = get_int("altitude = ")
    orientation_parcelle = get_int("orientation = ")
    montre que vous auriez intérêt à passer du temps à ouvrir un tuto. pour apprendre à programmer...

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

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

Discussions similaires

  1. Problème avec input control
    Par fred33 dans le forum Jasperserver
    Réponses: 3
    Dernier message: 27/10/2010, 14h19
  2. problème avec input file
    Par sky88 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 04/01/2010, 13h54
  3. problème avec input
    Par inès83 dans le forum Images
    Réponses: 5
    Dernier message: 02/12/2009, 12h24
  4. problème avec <input="reset"/>
    Par Dakuan dans le forum Langage
    Réponses: 6
    Dernier message: 17/06/2008, 11h39
  5. [Conception] Problème avec input type="text"
    Par adrix26 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/03/2007, 10h52

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