Bonjour à vous ! J'aurais deux questions assez simples je suppose pour les experts que vous êtes
choix = int(input("1 ou 2 ? : "))
if choix == 1 :
print("Salut c'est cool !")
elif choix == 2 :
print("Salut c'est aussi cool !")
J'aimerais que dans cet input(c'est un exemple), l'utilisateur ne puisse que rentrer 1 ou 2, sinon cela lui dirait que ce choix n'existe pas. Comment faire , a part passer par une boucle ou je devrais écrire tous les choix possible, cela devient vite encombrant quand il y a beaucoup de choix ? J'aimerais passer par les exceptions mais je n'ai pas très bien compris ...
Sinon deuxième question dans le même genre, j'aimerais aussi savoir comment faire pour que dans un input l'utilisateur ne puisse rentrer que des entiers, si il entre une chaîne de caractère cela lui mettrai une erreur.
Merci de m'avoir lu et j'espère que vous aurez des réponses clairs et simples car je ne suis pas un expert ! Oh et je suis sous 3.3 aussi !
"The best thing about now, is that there's another one tomorrow."
while True:
choice = input("1 or 2? : ")
if choice not in ['1', '2']:
print("Illegal input")
else:
break
choice = int(choice)
# Ton code:
if choice == 1 :
print("Salut c'est cool !")
elif choice == 2 :
print("Salut c'est aussi cool !")
Merci pour vos deux réponses ! Celle de stackOverflow me correspond mieux merci bien, mais par curiosité quel est l'effet du "break" ? Juste sortir de la boucle c'est ça ?
"The best thing about now, is that there's another one tomorrow."
Celle de stackOverflow me correspond mieux merci bien
Loin de moi l'idée de dénigrer la solution de stackOverflow, mais ma solution me semble plus évolutive. Si tu as un entier entre 1 et 100 au lieu d'entre 1 et 2, range(1, 100) est clairement plus rapide à écrire (et à exécuter puisqu'il s'agit d'un itérateur).
Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
Perso, c'est un peu plus compliqué, mais je m'y prendrais plutôt comme ça :
def salut():
print('Salut !')
def bonjour():
print('Bonjour !')
actions = {
'1': salut,
'2': bonjour}
while True:
choix = input('Votre choix ({}): '.format('|'.join(sorted(actions.keys()))))
if choix in actions:
actions[choix]()
break
else:
print("Ce choix n'est pas valable")
</pre>
Votre choix (1|2): plop
Ce choix n'est pas valable
Votre choix (1|2): 3
Ce choix n'est pas valable
Votre choix (1|2): 1
Salut !
Ça a le mérite de simplifier l'ajout de nouvelles fonctionnalités : il suffit de créer la fonction et de l'ajouter dans le dictionnaire actions.
En fait, s'il s'agit de faire ce genre de menu, il y a moyen d'aller encore plus loin en le générant automatiquement (oui j'avais quelques minutes à perdre) :
def salut():
"""Dire 'Salut !'."""
print('Salut !')
def bonjour():
"""Dire 'Bonjour !'."""
print('Bonjour !')
def quitter():
"""Quitter le programme."""
print('Au revoir !')
raise SystemExit
def menu():
"""Afficher le menu."""
for choix in possibilites:
print('{0}:\t{1}'.format(choix, actions[choix].__doc__))
print()
actions = {
'1': salut,
'2': bonjour,
'3': menu,
'4': quitter}
possibilites = sorted(actions.keys())
# Afficher le menu une première fois
print('MENU:')
menu()
while True:
choix = input('Votre choix ({}): '.format('|'.join(possibilites)))
try: # plus pythonique qu'un 'if' dans ce cas
actions[choix]()
except KeyError:
# /!\ Attention, je précise bien 'KeyError' !
# C'est l'exception qui est levée si le choix n'est pas dans le dictionnaire.
# Si je mettais juste 'except:', on ne pourrait pas quitter le programme.
print("Ce choix n'est pas valable")
MENU:
1: Dire 'Salut !'.
2: Dire 'Bonjour !'.
3: Afficher le menu.
4: Quitter le programme.
Votre choix (1|2|3|4): plop
Ce choix n'est pas valable
Votre choix (1|2|3|4): 1
Salut !
Votre choix (1|2|3|4): 2
Bonjour !
Votre choix (1|2|3|4): 3
1: Dire 'Salut !'.
2: Dire 'Bonjour !'.
3: Afficher le menu.
4: Quitter le programme.
Votre choix (1|2|3|4): 4
Au revoir !
Perso je n'aime pas trop l'utilisation de variables globales.
Elles ne sont pas globales : il s'agit de variables de module, qui ne se trouvent pas dans le scope global du programme, mais dans celui du module auquel elles appartiennent.
La différence est de taille : elles ont tous les avantages des variables globales (en gros, se simplifier la vie) sans en avoir les inconvénients (name clashes etc.).
Pour bien faire et coller à la PEP-8, par contre, j'aurais dû les nommer ACTIONS et POSSIBILITES tout en majuscule. Mais vu que le code n'est déjà pas en anglais, je pense qu'on n'est plus à ça près.
Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?
Je suis pas sur de comprendre l'enjeu.
PS:
shashimee a écrit:
Merci bien nohar (Arnaud en verlan ?) !
nohar c'est aussi "jeunesse" en hebreu. Ce pseudo regorge de subtilites, et de secrets encore inconnus!
Il n'empêche que dans certains cas ça peut foirer (si possibilites était un itérateur par exemple on ne pourrait afficher qu'une seule fois le menu). Là ça va c'est une petite fonction, mais sur des grosses fonctions on peut ne plus se rappeler que la variable n'est pas locale à la fonction et la modifier par inadvertance. D'une manière générale, je trouve ça aussi moins lisible, dans un gros script il peut être difficile de retrouver où a été défini/modifié la variable.
nohar a écrit:
Pour bien faire et coller à la PEP-8, par contre, j'aurais dû les nommer ACTIONS et POSSIBILITES tout en majuscule. Mais vu que le code n'est déjà pas en anglais, je pense qu'on n'est plus à ça près.
Certes
stackOverflow a écrit:
Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?
C'est pas si simple, ce sont des fonctions de callback là.
- Edité par PyTony 4 mars 2013 à 21:09:51
Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
dans un gros script il peut être difficile de retrouver où a été défini/modifié la variable.
En fait la PEP-8 est bien faite : si ta variable est tout en majuscules, c'est que c'est une variable de module, donc ça limite les modifications par erreur. Ensuite pour retrouver sa définition, tous les bons éditeurs permettent un truc de ce genre. Par exemple dans Vim, dans le mode normal, il suffit de se positionner sur le nom de variable et d'appuyer sur * pour rechercher ses occurences dans le fichier courant.
Quoi qu'il en soit je suis quand même d'accord avec toi. Les variables de module simplifient la vie dans les petits scripts qu'on hacke en 2 minutes, et elles évitent de se prendre la tête, mais ce n'est pas non plus un way of life.
Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?
C'est pas si simple, ce sont des fonctions de callback là.
Tu peux developper? J'ai bien trouve ca, mais je vois pas trop le rapport avec l'exemple de nohar.
Quelles sont les alternatives aux variables de modules dans notre cas?
Ah non pardon ce ne sont pas vraiment des callbacks, j'avais la tête ailleurs. Donc oui on peut passer actions et possibilites en paramètres. Ça me semble plus propre d'ailleurs.
Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
Ici, actions et possibilites (s'il elle avaient été déclaré en majuscule) pourrait plutôt être assimilé à des constantes, puisqu'elles ne sont modifiées nulle part.
Ah non pardon ce ne sont pas vraiment des callbacks, j'avais la tête ailleurs. Donc oui on peut passer actions et possibilites en paramètres. Ça me semble plus propre d'ailleurs.
On peut, mais ça oblige de passer un dictionnaire et une liste à tout un tas de fonctions qui n'en ont pas besoin (alors qu'une seule a besoin d'elles), donc c'est bancal.
Ce qui peut se faire, aussi, c'est un bind grâce à une lambda (la magie de l'évaluation différée !) :
def salut():
"""Dire 'Salut !'."""
print('Salut !')
def bonjour():
"""Dire 'Bonjour !'."""
print('Bonjour !')
def quitter():
"""Quitter le programme."""
print('Au revoir !')
raise SystemExit
def menu(actions):
"""Afficher le menu."""
items = sorted(actions.keys())
for choix in items:
print('{0}:\t{1}'.format(choix, actions[choix].__doc__))
print()
choix = input('Votre choix ({}): '.format('|'.join(sorted(ACTIONS.keys()))))
try:
ACTIONS[choix]()
except KeyError:
print("Ce choix n'est pas valable")
</pre>
Notez que j'avais défini POSSIBILITES à part simplement parce que j'aimais pas l'idée de ré-évaluer et re-trier les clés à chaque fois qu'on en a besoin, m'enfin dans le cas d'un menu on s'en cogne un peu des considérations sur les performances...
Encore merci pour cette aide qui m'a été précieuse, c'est exactement le genre de réponse que je cherchais, je l'ai d'ailleurs intégré à mon programme (un petit jeu sympa) Et oui nohar m'inspire beaucoup comme pseudo haha, on pourrait trouver de nombreuses significations ... des réponses de la part de l'interessé ?
Une autre question à la va-vite, m'évitant de créer un nouveau topic :
J'ai enregistrer une fonction dans un fichier avec mon amis "pickle" de cette manière :
import pickle
import time
def scenario():
print("Oh mon dieu mais c'est ...")
time.sleep(2)
print("UN OUUUURS !")
with open("Testi.txt","wb") as fichier:
a = pickle.Pickler(fichier)
a.dump(scenario())
Mais je ne sais absolument pas comment la récuperer car si je fais :
import pickle
with open("Testi.txt","rb") as fichier:
a = pickle.Unpickler(fichier)
scenario = a.load()
scenario()
Cela ne marche pas bien évidemment car le "scenario" n'est plus une fonction ... Mais alors comment faire ? La redéfinir dans une autre fonction ? J'essaie depuis 30 minutes mais je cale ... Une solution facile ?
"The best thing about now, is that there's another one tomorrow."
Encore merci pour cette aide qui m'a été précieuse, c'est exactement le genre de réponse que je cherchais, je l'ai d'ailleurs intégré à mon programme (un petit jeu sympa) Et oui nohar m'inspire beaucoup comme pseudo haha, on pourrait trouver de nombreuses significations ... des réponses de la part de l'interessé ?
Je pense que la réponse se trouve juste à la première ligne sous son pseudo sur sa page de profile.
shashimee a écrit:
Une autre question à la va-vite, m'évitant de créer un nouveau topic :
J'ai enregistrer une fonction dans un fichier avec mon amis "pickle" de cette manière :
import pickle
import time
def scenario():
print("Oh mon dieu mais c'est ...")
time.sleep(2)
print("UN OUUUURS !")
with open("Testi.txt","wb") as fichier:
a = pickle.Pickler(fichier)
a.dump(scenario())
Mais je ne sais absolument pas comment la récuperer car si je fais :
import pickle
with open("Testi.txt","rb") as fichier:
a = pickle.Unpickler(fichier)
scenario = a.load()
scenario()
Cela ne marche pas bien évidemment car le "scenario" n'est plus une fonction ... Mais alors comment faire ? La redéfinir dans une autre fonction ? J'essaie depuis 30 minutes mais je cale ... Une solution facile ?
Je pense que tu devrais plutôt ouvrir un nouveau sujet. Cette question n'ayant aucun lien avec la première.
- Edité par PyTony 5 mars 2013 à 0:51:22
Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
Je te propose une autre solution (tu en auras pour tout les goût) :
class Input:
def __init__ (self, generator = input):
"""Use 'generator' as input"""
self.generator = generator
def __next__ (self):
"""Forth and give 'item'"""
self.forth ()
return self.item
def forth (self):
"""Ask a new item"""
self.item = self.generator ()
def satisfy (self, pred):
"""Ask an item checking 'pred'"""
self.forth ()
if (not pred (self.item)):
self.satisfy (f)
i = lambda: input ("1 or 2? ")
f = lambda x: int (x) in range (1, 2)
a = Input (i)
a.satisfy (f)
if a.item == '1':
print ("it is 1")
else:
print ("it is 2")
- Edité par Conaclos 6 mars 2013 à 8:44:41
Choix restreint ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.