Bonjour, je fais l'exercice sur ZCasino et je cherche à comprendre pourquoi les variables ajoutent automatiquement des espaces. Merci d'avance.
#!/usr/bin/python3.6
# -*-coding:Utf-8 -*
# Import de la fonction randrange du module random
from random import randrange
# Import de la fonction ceil du module math
from math import ceil
# Initialisation de la variable step
step = 0
# Affectation d'une couleur en fonction de la parité du chiffre
def color(i):
if i % 2 == 0:
j = "noire"
else:
j = "rouge"
return j
# Choix du chiffre joué
while step == 0:
nb = input("Choisissez un nombre entre 0 et 49 : ")
try:
nb = int(nb)
assert nb >= 0
assert nb <= 49
except ValueError:
print("Veuillez saisir un nombre.")
except AssertionError:
print("Le nombre doit être compris entre 0 et 49.")
else: step = 1
# Choix de la mise
while step == 1:
bet = input("Choisissez votre mise (1$ - 100$) : ")
try:
bet = int(bet)
assert bet > 0
assert bet < 101
except ValueError:
print("Veuillez saisir un nombre.")
except AssertionError:
print("La mise doit être comprise entre 1 et 100.")
else: step = 2
# Définition de la couleur et lancement de la roulette
while step == 2:
nbcol = color(nb)
print("Vous avez misé", bet, "sur le chiffre", nb, "dont la couleur est", nbcol, ".")
result = randrange(50)
resultcol = color(result)
input("Appuyer sur ENTREE pour lancer la roulette.")
print("Rien ne va plus...")
print("Le résultat est", result, "et la couleur est", resultcol, ".")
if nb == result:
gain = bet * 3
elif nbcol == resultcol:
gain = ceil(bet / 2)
else:
gain = 0
print("Votre gain est de", gain)
step = 3
input("Appuyez sur ENTREE pour fermer ce programme...")
Hmm et sauriez-vous pourquoi sur mes lignes 46 et 49 la variable stack renvoie $None dès qu'il y a un except.
#!/usr/bin/python3.6
# -*-coding:Utf-8 -*
# Import de la fonction randrange du module random
from random import randrange
# Import de la fonction ceil du module math
from math import ceil
# Initialisation de la variable stack
stack = 100
# Affectation d'une couleur en fonction de la parité du chiffre
def color(i):
if i % 2 == 0:
j = "noire"
else:
j = "rouge"
return j
# Choix du chiffre joué
def nbChoice():
nb = input("Choisissez un nombre entre 0 et 49 : ")
try:
nb = int(nb)
assert nb >= 0
assert nb <= 49
break
except ValueError:
print("Veuillez saisir un nombre.")
nbChoice()
except AssertionError:
print("Le nombre doit être compris entre 0 et 49.")
nbChoice()
else: return nb
# Choix de la mise
def betChoice(stack):
bet = input("Choisissez votre mise (1$ -" + str(stack) + "$) : ")
try:
bet = int(bet)
assert bet > 0
assert bet <=stack
break
except ValueError:
print("Veuillez saisir un nombre.")
betChoice(stack)
except AssertionError:
print("La mise doit être comprise entre 1 et " + str(stack) + ".")
betChoice(stack)
else: return bet
# Définition de la couleur et lancement de la roulette
def roulette(nb, bet, stack):
nbcol = color(nb)
print("Vous avez misé", bet, "\b$ sur le chiffre", nb, "dont la couleur est", nbcol, "\b.")
result = randrange(50)
resultcol = color(result)
input("Appuyer sur ENTREE pour lancer la roulette.")
print("Rien ne va plus...")
print("Le résultat est", result, "et la couleur est", resultcol, "\b.")
# test si le nombre est le même
if nb == result:
gain = bet * 3
# test si la couleur est la même
elif nbcol == resultcol:
gain = ceil(bet / 2)
# sinon c'est perdu
else:
gain = 0 - bet
print("Votre gain est de", gain, "\b$")
stack = stack + gain
print("Vous diposez maintenant de", stack, "\b$")
redo = input("Retentez votre chance ? (O/N)")
if redo == 'O':
print("Vous disposez de " + str(stack) + "$ pour jouer.")
roulette(nbChoice(), betChoice(stack), stack)
nb = nbChoice()
bet = betChoice(stack)
roulette(nb, bet, stack)
input("Appuyez sur ENTREE pour fermer ce programme...")
- Edité par EmmanuelJean 8 juillet 2019 à 15:36:49
Déjà, enlève tous les break que tu as mis dans les try parce que c'est une erreur de syntaxe et que c'est inutile. Ensuite, une fonction qui se termine sans rencontrer de return renvoie None. Dans le cas où l'utilisateur fait une erreur, nbChoice et betChoice se terminent sans rien retourner.
11 juillet 2019 à 14:09:47
- Message modéré pour le motif suivant : Merci de créer votre propre sujet et d'utiliser le bouton code du forum pour insérer du code
Bonjour à tous. J'en suis actuellement au TP sur le pendu. Mon problème est en lien avec l'importation des données en provenance du fichier "donnees.txt" (je préfère faire du .txt plutôt que du .py, mais je doute que ça ait une important étant donné que c'est enregistré en binaire). Mon programme ne reconnaît pas les variables que je veux importer de donnees.txt. Mes codes:
Mon fichier qui permet d'importer des valeurs de base pour mes variables à stocker.
import pickle
pseudos_liste = {}
mots_liste = ["table","chaise","marron"]
with open("donnees.txt", "wb") as donnees:
donneeswrite = pickle.Pickler(donnees)
donneeswrite.dump(pseudos_liste)
donneeswrite.dump(mots_liste)
Mon fichier fonction.py :
def identification(pseudo):
for cles in pseudos_liste.keys():
if cles == pseudo:
print("Bienvenue, {} !".format(pseudo))
break
else:
pseudos_liste.add(pseudo, 0)
print("""Bienvenue, {}. Les règles du jeu sont simples, celles d'un pendu classique.
Tu as 8 vies à chaque partie. Tu peux améliorer ton score en trouvant le mot
le plus rapidement possible ! Amuse toi bien !""".format(pseudo))
def pendu():
rand = random.randint(0,len(mots_liste))
global pseudos_liste
prop_joueur = []
vies = 8
while vies > 0 and win != 1:
lettercount = 0
lettercountlosel = 0
prop_joueur.append(input())
for i in mots_liste[rand]:
if i in prop_joueur[:]:
print(i, end = '')
lettercount += 1
else:
print("*", end = '')
if i != prop_joueur[-1]:
lettercountlosel += 1
if lettercountlosel == len(mots_list[rand]):
vies -= 1
if lettercount == len(mots_liste[rand]):
win += 1
if win == 1:
print("Félicitations ! Vous avez gagné {} point(s)".format(vies))
pseudos_liste[pseudo] += vies
else:
print("Vous avez perdu.")
Finalement, mon fichier pendu.py:
import pickle
import random
from fonctions import *
with open("donnees.txt", "rb") as donnees:
donneesload = pickle.Unpickler(donnees)
donneesload.load()
print("Veuillez entrer votre pseudo afin de charger votre score.")
identification(input()) pendu()
with open("donnees.txt", "wb") as donnees:
donneesdump = pickle.Pickler(donnees)
donneesdump.dump(pseudos_liste)
Si je cherche à lancer le programme pendu.py, voilà l'erreur retournée:
Je me doute qu'il y a encore des erreurs, mais je n'ai pas besoin de plus d'aide que par rapport à ce problème pour l'instant Merci d'avance !
D'abord, c'est quoi cette erreur ? Je ne comprends pas ton message.
Ensuite, je ne comprendspas pourquoi tu cherches à écrire quelque chose dans données. txt. L'idée est de lire des données fixes dans donnees.py et d'écrire des scores dans scores.
Je ne vois pas non plus pourquoi tu définis une liste de mots alors que tu essayes de la lire dans donnees.txt.
from math import floor
def leap_gregorian(year):
leap= False
if year%400==0 or(year %4==0 and not year %100 == 0):
leap= True
return leap
def corrige_mois(day,month,year):
ab = year // 100
cd = year % 100
k = floor(cd/4)
q = floor (ab/4)
m_no_leap = [4,0,0,3,5,1,3,6,2,4,0,2]
m_leap = [3,6,0,3,5,1,3,6,2,4,0,2]
j = day
if leap_gregorian:
month_number=k+q+cd+m_leap[month]+j+2+(5*ab)
%7
return month_number
else:
month_number = (k+q+cd+m_no_leap[month]+j+2+(5*ab)) % 7
return month_number
print(corrige_mois(19,1,1939))
J'ai une question sur l'exercice roboc. Il est précisé, dans l'énoncé (les 2, idem pour l'amélioration du jeu) :
[quote]
Le fait d'arriver à développer les fonctionnalités de l'exercice: si l'on peut lancer vos programmes (serveur et client) et qu'ils tournent sans modification, vous aurez la note maximale, peu importe le code source derrière ;[\quote]
Or, à la correction, il s'avère que sur les 7 points à attribuer, seulement 1 point si le jeu fonctionne.
J'avoue je ne comprends pas ce que ça veut dire, cette histoire de note maximale.
La première vient de la ligne 15 qu'il faut écrire comme ça :
if leap_gregorian(year):
Si tu écris leap_gregorian sans parenthèses, ça fait référence à la fonction elle-même, et non à son résultat. Pour Python, un objet qui n'est ni False, ni None, ni 0, ni une séquence vide,... est True. En particulier, un objet fonction est True, donc il entre toujours dans la boucle comme si on était dans une année bissextile.
La deuxième erreur, c'est que les séquences sont indexées à partir de 0, et non de 1. Donc le code du mois de janvier se retrouve par
m_leap[0]
et le code du mois de manière générale :
m_leap[month-1]
MasterjupiterMjm a écrit:
Comment est-il possible de trier la liste "test" ci-dessous en fonction du NOMBRE de CARACTERES?
Il suffit de préciser à Python la fonction qui va servir de critère de tri. Pour le nombre de caractères, c'est la fonction len :
liste_triee = sorted(test, key=len)
Thia a écrit:
Le fait d'arriver à développer les fonctionnalités de l'exercice: si l'on peut lancer vos programmes (serveur et client) et qu'ils tournent sans modification, vous aurez la note maximale, peu importe le code source derrière ;
L'énoncé précise bien qu'il y a plusieurs critères d'évaluation :
fonctionnalités (c'est la phrase que tu as reprise)
lisibilité
découpage
documentation
ouverture à l'amélioration
Ces critères sont évalués indépendamment les uns des autres, c'est-à-dire que même si ton code est très mal écrit, illisible, pas documenté et quasi impossible à modifier, du moment qu'il marche tu auras quand même tous les points pour les fonctionnalités (la note maximale pour la partie "fonctionnalités"). Ca ne veut pas dire que tu auras la note maximale sur l'ensemble du barème.
La fonctionnalité, c'est seulement 1 point sur 7. Donc ça veut dire que quelqu'un qui a un beau code qui ne fonctionne pas aura une meilleure note que celui qui a un moche code qui fonctionne.
C'était ce que j'avais cru comprendre. Je me demande si c'est comme ça dans le monde du travail.
J'ai d'autres questions, relatives au jeu Roboc, version 2 (c'est à dire les améliorations) :
1) on peut percer des murs. Or, le labyrinthe est entouré de murs sauf la sortie en U (c'est l'idée ). Est-ce que le joueur a le droit de percer l'un des murs du bord et de sortir du labyrinthe ainsi ?
2) si on choisit la commande P pour percer un mur, ou M pour au contraire monter un mur, alors le robot ne se déplace pas ? Le joueur tape M ou P à la place des directions de déplacement, et donc son robot ne se déplace pas ce coup-là ?
3) il est précisé que, puisque c'est du multi-joueur, le robot ne peut se déplacer que d'une case à chaque tour.
Donc concrètement, un joueur qui taperait s2 (pour 2 cases vers le bas) :
- son robot se déplace d'une case vers le bas
- ensuite les robots des autres joueurs bougent
- et enfin ... il a le choix de taper autre chose ? on ignore son "2"? Ou alors son robot se déplace encore d'une case vers le bas, vu qu'il a tapé '2' après son "s" ?
La fonctionnalité, c'est seulement 1 point sur 7. Donc ça veut dire que quelqu'un qui a un beau code qui ne fonctionne pas aura une meilleure note que celui qui a un moche code qui fonctionne.
C'était ce que j'avais cru comprendre. Je me demande si c'est comme ça dans le monde du travail.
Si j'étais employeur, je préférerais largement embaucher le type qui a un beau code qui ne marche pas plutôt que celui qui a un code pourri qui marche.
Le premier sera facile à corriger pour faire en sorte qu'il marche, et ensuite il sera facile à maintenir.
Le second marchera pendant 2 ans, jusqu'au jour où... badaboum ! Et là, même le type qui l'a écrit sera incapable de corriger la bourde parce qu'il ne comprendra même plus son propre code. Alors les autres, je ne t'en parle même pas.
Donc oui, c'est un peu caricatural mais c'est comme ça que ça marche le mieux dans le monde du travail.
Pour le reste je ne sais pas, je n'ai pas fait cette activité. Mais j'ai envie de te dire : peu importe. L'important est que tu sois capable de programmer le jeu, les détails de la règle ne sont pas essentiels pour montrer ce que tu as appris dans le cours.
J'ai une vision un peu ... étriquée du truc peut-être.
Mais en ce qui me concerne, il s'agit d'un programme informatique, pas de littérature. Donc :
1) ça marche
2) ça marche pas
Il est évident que si ça marche, ça reste hautement critiquable. Et qu'il convient de regarder si c'est bien découpé, bien documenté, etc....
Mais si ça ne fonctionne même pas.... perso j'ai même pas envie de regarder. En fait, je ne comprends pas trop qu'on "rende" un truc qui ne fonctionne pas, le fond de la question est là sans doute.
Perso si je n'arrive pas au bout, si je n'arrive pas à implanter toutes les fonctions prévues, je ne compte pas le donner à la correction.
Enfin vu que j'ai une nature tenace, je n'ai pas l'intention de le laisser tomber, et donc de le proposer à la correction, tant qu'il ne fonctionne pas.
Il ne me serait pas venu à l'idée de faire autrement.
Celui qui n'a pas réussi à aller jusqu'au bout parce qu'il était bloqué,
celui qui n'a lu l'énoncé qu'à moitié et qui n'a pas tout prévu,
celui qui a oublié de faire des tests,
c'est pas bien de leur part, donc ils perdent un point. En général ils en perdent ailleurs aussi, parce que quand on fait une chose mal en général on fait d'autres choses mal. Ca leur apprendra à faire plus attention la prochaine fois.
Mais le barème est aussi là pour valider le travail fourni. Même si c'est imparfait ou si on a mal compris l'énoncé, je suis content qu'on reconnaisse que j'ai quand même passé du boulot et que j'ai appris des choses.
Bonsoir SVP ma préoccupation est portée sur *TP: dictionnaire ordonné * de la partie 3 du cours *Apprenez à programmer en python*
En effet dans la correction du TP , précisément dans le constructeur __init__ de la classe DictionnaireOrdonnee, j'arrive pas à comprendre pourquoi on utilise la syntaxe self[cle] =base [cle]. A en croire ce que j'ai compris des chapitres précédents les crochets se mettent devant un élément conteneur. Je sais effectivement que notre classe doit avoir le comportement d'un dictionnaire mais ce n'est pas un dictionnaire pour autant. Je me suis beaucoup creusé les méninges et j'arrive pas à savoir pourquoi il y a ces crochets devant le self.
J'espère vraiment bénéficier de votre temps et de votre aide pour m'éclairer sur ce point.
La syntaxe avec les crochets appelle en fait une fonction "magique", qui est __getitem__ ou __setitem__ (selon qu'on veut seulement lire la valeur ou la modifier).
Comme la correction du TP définit ces deux fonctions, on peut effectivement affecter un élément avec la syntaxe self[cle].
Je vais continuer le cours et essayer de créer mon propre dictionnaire en m'éloignant de la solution proposée pour voir si j'ai bien compris tous les rouages des classes.
J'avoue que par rapport au TP du pendu cela monte d'un sacré cran! Je pense quand même que le cours en ligne par rapport à du présentiel montre vite ses limites à moins d'avoir un tuteur ou référents physique que tu peux au minimum contacter par visio. Il faut également pouvoir garder une constance dans l'apprentissage car pour mon cas si je ne suis pas physiquement devant un prof, j'ai beaucoup de difficultés avec ma vie de famille pour me dégager du temps pour étudier de nouvelles notions et on ne peut pas se permettre dans ce genre d'apprentissage d'être irrégulier, cela renforce les difficultés.
Je fais ça pour apprendre de nouvelles compétences donc même si j'échoue ( ce dont je n'ai pas envie) ce n'est pas si grave.
Je pense qu'il y a une erreur dans la correction proposée du TP du dictionnaire ordonnée : dans la méthode
def__add__(self, autre_objet):
(qui sert à surcharger l'opérateur + sur la classe) :
il y a une première condition qui teste si l'objet additionné est bien du même type (que c'est bien un autre dictionnaire ordonnée)
if type(autre_objet) is type(self):
Si c'est le cas alors on lève une exception. => je pense ici qu'il manque la négation dans la condition (il faudrait is not) car dans la spécification n°11 on doit pouvoir additionner 2 dictionnaires.
if type(autre_objet) is not type(self): # solution que je suggère
Est-ce que quelqu'un pourrait donner un autre exemple de code svp. Par exemple, quel serait-il si on utilisait le boléen bissextile = True. Est-ce également possible de traiter le problème dans l'ordre de l'énoncé ? Je n'ai d'ailleurs pas compris l'utilisation ELIF dans cet exercice, quelqu'un pourrait me l'expliquer en "langage courant". Désolée mais si ça peut paraître "assez clair" pour Mr Le Goff, je vous avoue que le sèche totalement.
Merci d'avance à ceux qui prendront le temps de m'aider
typage structurel ftw
typage structurel ftw
C'est parfait, à bientôt.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique