Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2008, à 18:13

thibaultg

Python utilisation raw_input et input[resolu]

Bonjour,
 

option=input("entrer un chiffre")

Je voudrait que l'utilisateur ne puisse entrer que des chiffres, et si il rentre autre chose que des chiffres alors qu'on lui redemande de saisir un chiffre. Mais j'y arrive pas et je trouve pas d'exemple sur les forum.
Vous pouvez m'aider?

J'ia bien penser faire des truc comme

drapo=0
while(drapo=!1):
    option=raw_input("entrez un chiffre")
           if(int(option)):
                        drapo=1
           else:
                         print "ce n'est pas un chiffre"

Mais cela ne marche pas en python

Dernière modification par thibaultg (Le 27/01/2008, à 19:38)

Hors ligne

#2 Le 27/01/2008, à 19:16

reeth

Re : Python utilisation raw_input et input[resolu]

Attention à  ne pas inverser les caractère : c'est != pou différent et non =!
Et fais aussi attention à  l'indentation qui doit être homogène et bien présente en python wink

Hors ligne

#3 Le 27/01/2008, à 19:29

thibaultg

Re : Python utilisation raw_input et input[resolu]

Oui merci, mais cette faute frappe et d'indentation ne sont pas presente dans mon programme.

J'ai cependant toujours la même question comment connaà®tre le type d'une variable, c'est a dire si c'est un string ou un integer
J'ai résolu mon problème de programmation( mais je me pose toujours la question de dessus), en faisant comme ceux_ci:

def verifie_coef_chiffre(texte):
	option=-1
	drapo=0
	while(drapo!=1):
		try:
			#print text
			option=input(texte)
			drapo=1
		except:
			print "vous ne pouvez taper que des chiffres et rien d'autre"
	return option

Dernière modification par thibaultg (Le 27/01/2008, à 19:31)

Hors ligne

#4 Le 27/01/2008, à 19:37

thibaultg

Re : Python utilisation raw_input et input[resolu]

Bon avec mon google, et surtout que ma question n'été pas tres compliqué, j'ai trouvait:
http://www.developpez.net/forums/showth … p?t=423157
http://fr.wikibooks.org/wiki/Programmation_Python/Type

Hors ligne

#5 Le 29/01/2008, à 01:31

reeth

Re : Python utilisation raw_input et input[resolu]

Pour connaître le type c'est type(). Si tu veux savoir si c'est bien un int :

if (type(a)==int):
    print 'int'
else:
    print 'autre'

par exemple.

Hors ligne

#6 Le 29/01/2008, à 14:37

thibaultg

Re : Python utilisation raw_input et input[resolu]

Lol merci c'est justement ce qui est marqué dans les lien que j'ai mis juste au-dessus mais merci beaucoup, le forum de ubuntu est toujours aussi sympa.
Merci a toi

Hors ligne

#7 Le 29/01/2008, à 17:30

aleph

Re : Python utilisation raw_input et input[resolu]

Autant prendre de bonnes habitudes; tester ce qui peut l'être *avant* de laisser une application se débrouiller.

>>> def isi(s):
        """isi(string) - > Boolean\n\nTeste si l'argument peut représenter un entier."""
        if not s or (s.startswith('0') and len(s) > 1):
            return False
        for c in s:
            if c not in '0123456789':
                return False
        return True
        
>>> while True:
        r = raw_input('nombre entier :')
        if isi(r):
            val = int(r)
            break
            
nombre entier :00
nombre entier :04
nombre entier :z
nombre entier :/
nombre entier :234
>>> isi.__doc__
isi(string) - > Boolean

Teste si l'argument peut représenter un entier.
>>> #pour info
>>> isinstance(val, int)
True
>>>

#8 Le 30/01/2008, à 22:14

reeth

Re : Python utilisation raw_input et input[resolu]

@aleph : il est plus conseillé de parcourir les éléments '0123456789' que d'utiliser une fonction comme type()? Et 0 n'est-il pas un int (comme d'ailleurs 001, 0289)?

Sinon merci de donner ces codes toujours clairs et précis wink

Hors ligne

#9 Le 31/01/2008, à 00:07

kaer

Re : Python utilisation raw_input et input[resolu]

Python 2.5.1 (r251:54863, Oct  5 2007, 13:36:32)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.1 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: def is_integer(s):
    try: int(str(s))
    except: return False
    else: return True
   ....:     
   ....:     

In [2]: is_integer(55)
Out[2]: True

In [3]: is_integer('55')
Out[3]: True

In [4]: is_integer(55.5)
Out[4]: False

In [5]: is_integer('55.5')
Out[5]: False

In [6]: is_integer('5f5.5')
Out[6]: False

Hors ligne

#10 Le 31/01/2008, à 10:28

aleph

Re : Python utilisation raw_input et input[resolu]

> il est plus conseillé de parcourir les éléments '0123456789' que d'utiliser une fonction comme type()?

1) Il est *toujours* préférable d'essayer de prévenir une erreur plutôt que corriger celle-ci après coup.
Cas classique: division de a par b.

2) La fonction type devrait être utilisée à bon escient. L'utiliser pour *déterminer* un type de variable, oui. L'utiliser pour *tester* la validité d'une variable est plus délicat. (subtile nuance). Retour à la case 1)

3) La mise en place d'un *bon* gestionnaire d'erreur est toujours une tâche très délicate. Autant l'éviter. Retour à la case 1)

4) type() à la vie dure. isinstance() est conseillé (plus moderne, cela à voir avec l'unification "type - new style class")


> Et 0 n'est-il pas un int (comme d'ailleurs 001, 0289)?

Dans ma petite fonction sans prétention, je teste le zéro pour la beauté. Attention toutefois à la pervesité d'un zéro avant un nombre. Selon le contexte, cela peut signifier un nombre octal.

>>> chr(043)
#
>>> chr(43)
+
>>> #et logiquement
>>> chr(048)
  File "<psi last command>", line 1
    chr(048)
          ^
SyntaxError: invalid token

#11 Le 31/01/2008, à 11:02

kaer

Re : Python utilisation raw_input et input[resolu]

aleph a écrit :

1) Il est *toujours* préférable d'essayer de prévenir une erreur plutà´t que corriger celle-ci après coup.
Cas classique: division de a par b.

Ca c'est une grosse boulette ! En tous cas en Python, il vaut trés souvent mieux risquer l'erreur et catcher l'exception: c'est souvent plus propre, plus concis, plus lisible. Il y a des exceptions quand récupérer une erreur est trop "couteux" par rapport à  l'anticiper. J'ai un souvenir vague que Martelli a écrit une ou deux pages là -dessus dans un de ses bouquins (je me souviens de "better fogive than ask permission" ou quelque chose comme ça).

Le point 3 est aussi plus que discutable ... le script aussi et si on veut absolument faire ça, il y a string.digits !

Au lieu d'inventer des régles, je suggére de s'en tenir au "Zen of Python":

In [9]: import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

In [10]: import string

In [11]: string.digits
Out[11]: '0123456789'

Il y a même une traduction française qui vaut ce qu'elle vaut mais a au moins le grand mérite d'exister: http://laurent.pointal.org/python/docs/zen

Hors ligne

#12 Le 31/01/2008, à 15:16

aleph

Re : Python utilisation raw_input et input[resolu]

Tant qu'à  faire autant le faire proprement, cad déjà  renvoyer une valeur si celle-ci est correcte. Cela évite une deuxième future conversion. (Pas très différent de "is_integer").

def is_integer2(s):
    try:
        return int(s)
    except ValueError:
        return None
    else:
        return None

A noter qu'une telle construction sur ce modèle échouera pour tester un "float".

> il y a string.digits !

Ce fut une omission volontaire pour la clarté de l'explication. Ma préférence irait plutà´t à  un

>>> '123'.isdigit()
True

> Zen of Python, Explicit is better than implicit.

C'est exactement mon intention. Explicitement tester l'entrée et agir en conséquence plutà´t que de laisser implicitement l'application se débrouiller, surtout quand ce genre de test est très simple à  réaliser.

> ...discutable...
Effectivement tout l'est. Ma petite fonction sans prétention - mais malgré tout assez solide - avait uniquement pour but de démontrer les propos cités dans le paragraphe précédent.

Il existe de nombreux modules pour tester la validité d'une entrée, les GUI possèdent généralement une/des fonction/s  de validation. Tous ces outils ont un but commun, tester avant d'entreprendre.

#13 Le 01/02/2008, à 21:44

reeth

Re : Python utilisation raw_input et input[resolu]

Ok merci pour toutes ces précisions.

Hors ligne