La méthode items renvoie chaque élément du dictionnaire sous la forme de tuples (clé, valeur). Et comme la méthode join attend comme argument des chaînes de caractères (et non des tuples) ça créé l'erreur que tu obtiens.
La méthode items renvoie chaque élément du dictionnaire sous la forme de tuples (clé, valeur). Et comme la méthode join attend comme argument des chaînes de caractères (et non des tuples) ça créé l'erreur que tu obtiens.
Bonsoir, j'aurais besoin de quelques eclaircisssements sur la fonction afficher du dernier exercice du cours. Je n'ai pas la moindre idée de comment m'en servir pour faire s'afficher un labyrinthe... Si quelqu'un aurait la gentilesse de m'aiguiller, merci !
def afficher(self):
"""Affiche le labyrinthe dans une console.
On prend les limites pour afficher la grille. Les obstacles et
le robot sont affichés en utilisant leur attribut de classe 'symbole'.
"""
y = 0
grille = ""
while y < self.limite_y:
x = 0
while x < self.limite_x:
case = self.grille.get((x, y))
if case:
grille += case.symbole
else:
grille += " "
x += 1
grille += "\n"
y += 1
Il s'agit d'une méthode, celle-ci doit donc être écrite à l'intérieur de la classe. Avec labyrinthe une instance de ta classe, tu pourrais ensuite l'afficher vialabyrinthe.affichier() (pour peu que tu ne cites qu'un extrait de la méthode, parce que là il manque encore l'affichage avec un print par exemple).
Justement c'est là que je bloque : j'obtiens une attribute error...
line 56, in afficher
grille += case.symbole
AttributeError: 'Mur' object has no attribute 'symbole'
J'ai compris qu'il fallait mettre en place un "code" pour savoir ou sont les murs, portes, etc.... Mais la devant cette erreur je me sens toute bête ^^'
Je suis en train de suivre le cours "apprenez à programmer en Python" et j'ai un comportement bizarre dans l'exercice "les listes et tuples 2/2 - une application pratique".
L'exercice consiste à retourner un float écrit avec une virgule et avec un certain nombre de caractères après la virgule.
J'ai fait l'exercice sans regarder la correction et suis arrivé à quelque chose qui fonctionne:
def afficher_flottant(flottant, n=3): """ cette fonction retourne le flottant formatté "à la française" et avec n chiffres après la virgule (3 par defaut) !! attention, ca n'arrondit pas la valeur !! """ print(type(flottant))
sflot = str(flottant)
# formattage de la chaine de sortie try: index = sflot.index(".")
except ValueError: try: index = sflot.index(",") print("c'est un français qui a inséré la chaine de caractères, on laisse tel quel (damn frogs!)") except: print("c'est un entier, on le transforme en float") # c'est un entier, on le "convertit" en float sflot+=".0" index=len(sflot)
Suite à ca j'ai regardé la correction et j'ai vu qu'on pouvait tester facilement le type du paramètre entré (ce qui m'a posé le plus de problèmes dans l'exercice) mais lorsque j'intègre le test suivant dans mon code:
print(type(flottant)) => ceci m'indique bien <class 'int'>
if type(flottant) is not float and not str: raise TypeError("entrer un flottant ou une chaine")
et que j'appelle la fonction avec un int, je ne lève pas l'exception ... y a t-il une syntaxe particulière pour les conditions logiques en python ?
en fait mon problème concerne le test du paramètre d'entrée, pour pouvoir lever une exception si celui-ci est différent d'un float.
ma condition if type(flottant) is not float and not str: me semble correcte, cependant ca ne fonctionne pas, c'est pour cela que je me demandais s'il ma syntaxe était correcte.
Non, la structure n'est pas bonne. Il faut faire la comparaison à chaque fois:
if type(flottant) != float and type(flottant) != str:
Par contre, il me semble que l'utilisation de is (ou is not) n'est pas la bonne solution ici, il faut plutôt utiliser == (ou !=). is et is not sont réservés aux singletons (tel que None):
if value is None:
Sinon la bonne façon de vérifier le type, c'est d'utiliser la fonction intégrée isinstance:
value = 42
#soit une seule vérification
if isinstance(value, str):
print("C'est une chaîne")
#Soit plusieurs
if isinstance(value, (str, int)):
print("C'est une chaîne ou un entier")
Bonjour, je souhaite créer un programme en python permettant de calculer la clé de contrôle d'un code EAN. Cependant, je rencontre quelques problèmes. A chaque fois que j'exécute mon programme sur pyzo, rien ne s'affiche. Pouvez-vous jeter un coup d'œil sur mon programme svp ? Merci d'avance
Je suis à la partie 3 et j'ai un petit souci avec les listes. J'ai créé une liste à partir du fichier .txt, qui permet d'utiliser des coordonnées pour se déplacer. Ensuite on extrait les coordonnées du robot, puis, en principe, il devrait être simple de gérer les déplacements.
Seulement voilà, j'ai tout essayé mais la seconde liste que je crée le temps de l'affichage semble liée à la première que je voulais immuable. Je n'arrive vraiment pas à voir ce qui ne vas pas.
Voici un bout de code test:
import os
def CarteAuto():
'''
Fonction de test pour eviter de passer par toutes les étapes de selection
Retourne le labyrinthe "facile" sous forme de liste 2D sans le robot et les coordonées du robot
'''
with open(os.getcwd() + '//Cartes//facile.txt','r') as Fichier:
Carte = Fichier.read()
CarteLignes = Carte.split('\n')
CarteVide=[]
for Ligne in CarteLignes:
TabLigne=[]
for i in Ligne.replace('X',' '):
TabLigne.append(i)
CarteVide.append(TabLigne)
for Y,Ligne in enumerate(CarteLignes):
for X,Rob in enumerate(Ligne):
if Rob=='X':
Position=(X,Y)
return (Position,CarteVide)
def AfficheRobot(Pos,Carte0):
'''
Fonction test qui affiche le labyrinte et le robot en fonction des coordonées du robot
'''
CarteAvecRobot = list(Carte0) #Copie de la carte de reference, lue dans fichier .txt, transformée en liste 2D, sans le robot
PosX,PosY = Pos
print(id(CarteAvecRobot)==id(Carte0)) #Verification(debug) que les deux cartes ne sont pas à la même place
CarteAvecRobot[PosY][PosX]='X' #Le robot est placé sur la nouvelle carte
for i in CarteAvecRobot: #Affichage de la carte avec le robot
print(''.join(i))
Position,CarteVide=CarteAuto()
AfficheRobot(Position,CarteVide)
Position = (2,2)
AfficheRobot(Position,CarteVide)
et le résultat :
False
OOOOOOOOOO
O O O O
O . OO O
O O O XO
O OOOO O.O
O O O U
O OOOOOO.O
O O O
O O OOOOOO
O . O O
OOOOOOOOOO
False
OOOOOOOOOO
O O O O
O X OO O
O O O XO
O OOOO O.O
O O O U
O OOOOOO.O
O O O
O O OOOOOO
O . O O
OOOOOOOOOO
Si quelqu'un voit ce qui ne va pas, je suis preneur
une ligne tellle que la suivante lève une exception :
TypeError: object() takes no parameters
def __new__ (cls, nom, prénom, age) :
print ("Appel de la méthode __new__ de la classe".format(cls))
return object.__new__(cls,nom,prénom,age)
# nouvelle ligne
return object.__new__(cls)
Serait-ce possible de mettre à jour le cours à l'occasion ?
bonjour, j'ai assaye de modifier le programme z casino un petit peu et maintenant, lors de la question "voulez vous quitter", si je met un "o", ca m'affiche le message d'aurevoir(ce qui est normal mais quand je saisi "O", n ou "N", il me repose la question une 2 eme fois et ensuite, si je tape "o" ou "O" cela m'affiche le message d' aurevoir et si je tape "n" ou "N" je restesur le programme.
ma question est la suivante, pourquoi quand je saisi "O", "N" ou "N", le programme me repose une deuxieme fois la question?, Que faut il que je modifie?
import os
from random import randrange
from math import ceil
argent = 1000
continuer_partie = True
print("Vous vous installez à la table de roulette avec", argent, "$.")
while continuer_partie:
nombre_mise = -1
while nombre_mise < 0 or nombre_mise > 49:
nombre_mise = input("Tapez le nombre sur lequel vous voulez miser (entre 0 et 49) : ")
try:
nombre_mise = int(nombre_mise)
except ValueError:
print("Vous n'avez pas saisi de nombre")
nombre_mise = -1
continue
if nombre_mise < 0:
print("Ce nombre est négatif")
if nombre_mise > 49:
print("Ce nombre est supérieur à 49")
mise = 0
while mise <=0 or mise > argent:
mise = input('misez')
try:
mise = int(mise)
except ValueError:
print('tu mises pas des lettres imbecile')
mise = -1
continue
if mise <= 0:
print('un nombre entre 1 et ton argent')
if mise > argent:
print ('un nombre entre 1 et ton argent')
numero_gagnant = randrange(50)
print('le numero gagnant est', numero_gagnant)
if numero_gagnant == nombre_mise:
print('gg, tu gagne 3 fois ta mise soit :', mise*3, 'S')
argent += mise * 3
elif numero_gagnant % 2 == nombre_mise % 2:
mise = ceil(mise * 0.5)
print('presque , tu gagne la moitie de ta mise soit:', mise * 0.5, '$')
argent += mise * 0.5
else:
print('nope, tu perd', mise, '$')
argent -= mise
if argent <= 0:
print("Vous êtes ruiné ! C'est la fin de la partie.")
continuer_partie = False
else:
# On affiche l'argent du joueur
print("Vous avez à présent", argent, "$")
quitter = input("Souhaitez-vous quitter le casino (o/n) ? ")
while quitter != "o" or quitter != "O" or quitter != "n" or quitter != "N":
quitter = input("Souhaitez-vous quitter le casino (o/n) ? ")
if quitter == "o" or quitter == "O":
print('bye')
continuer_partie = False
break
elif quitter == "n" or quitter == "N":
continuer_partie = True
break
os.system('pause')
@samuel: C'est parce que tu as mal structuré la condition de ta boucle while. Je te renvoie vers un post similaire où j'avais donné une réponse à ce problème
@samuel: C'est parce que tu as mal structuré la condition de ta boucle while. Je te renvoie vers un post similaire où j'avais donné une réponse à ce problème
- Edité par SamuelLhermitte 12 juin 2017 à 20:56:36
C'est sûrement parce que tu mets les variables sous forme de chaîne de caractères (lignes 8 et 13). Il faut plutôt faire:
if re.match(r"([0-9]){2}", a)
# ^
# |
# ne pas mettre les guillemets
merci Olygrim pour t'as réponse effectivement c'était le problème. en fait j'ai essayé de reproduire l'exemple du numéro de téléphone d'une autre manière pour cela j'ai décortiquer l'expression régulière en plusieurs volets, voici le code :
# -*- coding: cp1252 -*-
import re
k=True
while k:
a=raw_input("entrer votre numéro de téléphone svp : ")
if re.search(r"^0[0-9]",a):
print ("pas de plm dans : {}.".format(r"^0[0-9]"))
elif re.search(r"[ .-]?[0-9]{2}",a):
print ("pas de plm dans : {}.".format(r"[ .-]?[0-9]{2}"))
elif re.search(r"([ .-]?[0-9]{2}){4}",a):
print ("pas de plm dans : {}.".format(r"([ .-]?[0-9]{2}){4}"))
maintenant si je fait entrer par exemple 05 23 45 45 le programme ne rentre que dans le premier bloque, je ne comprend pas pourquoi
HachemiRaouf a écrit:
> maintenant si je fait entrer par exemple 05 23 45 45 le programme ne rentre que dans le premier bloque, je ne comprend pas pourquoi
Parce que c'est tout le principe des elif : tu ne rentres dans la condition que si les précédentes n'ont pas été satisfaites.
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
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