Si tu essais la correction et les exemple de manipulation fournis (legumes + fruits) , tu verras que la correction est buggé . La fonction add de la correction ne fonctionne pas .
if type(autre_objet) is type(self)
is signifie que tu verifies qu'il pointe vers la même réference . Dans ce cas ,il pointe vers la meme reference .
Je t'ai apporté ma petite correction ci dessous . On ne peux pas ajouter le meme dictionnaire ou un dictionnaire avec autre chose .
def __add__(self, autre_objet):
"""On renvoie un nouveau dictionnaire contenant les deux
dictionnaires mis bout à bout (d'abord self puis autre_objet)"""
if autre_objet is self or type (autre_objet) != type (self) :
raise TypeError( \
"Impossible de concaténer {0} et {1}".format( \
type(self), type(autre_objet)))
else:
nouveau = DictionnaireOrdonne()
# On commence par copier self dans le dictionnaire
for cle, valeur in self.items():
nouveau[cle] = valeur
# On copie ensuite autre_objet
for cle, valeur in autre_objet.items():
nouveau[cle] = valeur
return nouveau
A la base je voulais juste tester si l'objet ajouté était bien un dictionnaire ordonné voici ce que j'avais fait, en partant toujours de la correction mais ça ne marche pas non plus car not in sert à voir si un objet se trouve dans un conteneur...
def __add__(self, objet_ajoute):
#vérification du type de dictionnaire(ne fonctionne pas)
if type(objet_ajoute) not in type(DictOrdo):
raise TypeError("l'objer à ajouter doit être un dictionnaire un dictionnaire ordonné")
else:
nveau_dico = DictOrdo()
for cle, valeur in zip(self._index, self._value):
nveau_dico[cle]=valeur
for cle, valeur in objet_ajoute.items():
nveau_dico[cle]=valeur
return nveau_dico
Ton explication est quand même bien plus claire en tout cas
Mon code est le suivant, il semble fonctionner car le print() précédant le return m'indique la bonne valeur. Par contre le return me renvoit None dès que la fonction a été utilisé plus d'une fois (si la somme du nombre est supérieur à 10 dès la première itération)
def digital_root(n):
n=str(n)
somme=0
for i in range(len(n)):
somme+=int(n[i])
if len(str(somme))>1:
digital_root(somme)
else:
print(somme)
return somme
def digital_root(n):
n=str(n)
somme=0
for i in range(len(n)):
somme += int(n[i]) #n [0]
if len(str(somme))> 1:
return digital_root(somme)
if len(str(somme))== 1:
return somme
Ce code devrait recoudre ton problème EtienneDubs .
Tu avais un probleme dans ta recursion . Ton premier appel de la fonction digital_root renvoie logiquement none vu qu'il est dans le cas de if len(str(somme))>1 et que tu n'as pas renvoyer de "return" .
Je ne comprends pas pourquoi par contre dans le code que je propose (je le remets ci-dessous) :
Le print(somme) me renvoit bien la valeur de la somme (un entier) alors que le return dans la même boucle (else) me renvoit None. La variable existe pour un print mais pas pour un return ?
De plus, pourquoi faut-il mettre un 'return' devant l'appel de la fonction digital-root ?
def digital_root(n):
n=str(n)
somme=0
for i in range(len(n)):
somme+=int(n[i])
if len(str(somme))>1:
digital_root(somme)
else:
print(somme)
return somme
edit :
Je reprends pas a pas ton code comme lirai l'interpreteur de python .
1-1) digital_root(555) #j'essaie ta fonction avec le parametre 555 (n)
1-2)Ta boucle fait somme = 5+5+5 ce qui donne somme = 15
1-3)Tu es dans le cas de if len(str(somme))>1 car len (str (15)) = 2 .Tu executes ta deuxième fonction digital _root (15) (premiere ligne du if)
2-1)La boucle de la deuxieme fonction digital_root fait somme = 1 +5 ce qui donne somme =6
2-2) Tu es dans le cas de else car len (str (6)) = 1 .Ta deuxieme fonction affiche 6 et ta deuxieme fonction retourne 6
1-4) L’interpréteur python a terminé la ligne 9 digital_root(somme) dans ta premiere fonction , il attaque la prochaine ligne mais il n'y en a pas . (else ne s'execute pas vu que tu es dans le cas de if).
1-5) Ta première fonction n'a pas de return donc elle retourne "none"
Ton print correspond à la deuxieme fonction et non la première .
Ta deuxieme fonction retourne la bonne valeur mais la premiere ne retourne rien (none)
Si tu veux que ta premiere fonction retourne la valeur de ta deuxieme fonction ,tu dois le specifier .
https://code.tutsplus.com/fr/tutorials/demystifying-python-recursion--cms-30418
Dans ce cours, il faut faire pleins de test avec pytest.
Le code à tester:
class Agent:
def __init__(self, position, **properties):
self.position = position
for property_name, property_value in properties.items():
setattr(self, property_name, property_value)
On cherche à voir si il y a bien un dictionnaire qui est assigné en tant qu'attribut de classe.
D'après le cours, voici le code qui permet de tester à l'aide de pytest:
import ~nom_du_programme~ as script
#assigner un dictionnaire en tant qu'attributs
def test_set_agent_attributes():
agent = script.Agent(3, agreeableness=1)
assert agent.agreeableness == 1
Ma question est la suivante: En quoi ce teste vérifie qu'il s'agisse bien d'un dict ?
A mon sens, on regarde uniquement que sa valeur ==1
class Agent:
def __init__(self, position, **properties):
self.position = position
for property_name, property_value in properties.items():
setattr(self, property_name, property_value)
def test_set_agent_attributes():
agent = Agent(3, agreeableness=1)
assert agent.agreeableness == 1
Cela vérifie bien que c'est un dictionnaire .
1)Le paramatre **properties de la classe Agent signifie que tu attends un dictionnaire (property [0], property [1],...) .Ce champs est optionnelle . Tu pourrais ne pas renseigner de parametre tel Agent (3)
Par contre ca buggerai à la ligne setattr(self, property_name, property_value)
2)
setattr(self, property_name, property_value)
setattr modifie la valeur de ton attribut issue d'Agent . dans le cas ou l'attribut n'existe pas , il le crée .
setattr attend trois paramètres (la classe ou l'objet, l'attribut et sa valeur)
3) Si ce n'est pas un dictionnaire tu aurais une erreur . Donc si agent.agreeableness ==1 ,c'est que c'est un dictionnaire
Mais si je bidouille les entrés, que je force les propriétés de l'agent, de sorte à ne rentrer qu'une liste (au lieu d'un dictionnaire).
J'ai l'impression que le test n'échouerais pas. Je me trompe ?
Heu , je n'ai pas compris ce que tu voulais dire par forcer les propriétés Agent ....
Quand tu fais agent.agreeableness ,tu vérifies que l'attribut agreableness existe et qui vaut 1 . Si tu rentre un liste au lieu d'un dictionnaire dans le second paramètre d'Agent,ca va bugger à la fonction setattr donc l'attribut agreableness ne sera jamais crée .
C'est peut etre moi qui n'a rien compris .Tu aurais un exemple ou le test n’échoue pas sans dictionnaire ?
j'essaye d'enregistrer mon programme que j'ai établit dans l'interpreteur python au niveau de mon bloc note mais quand je click dessus pour exécuter rien n'affiche
Bonjour, j'ai un petit soucis avec un fichier à télécharger pour le cours "perfectionnez vous en python". Je dois avoir un fichier nommé syceronbrut.xml or le lien mis dans le cours m'amène un dossier zippé qui ne contient pas ce fichier. J'ai fait un petit tour sur le github du cours aussi mais je ne vois pas ce fichier. Si quelqu'un peut m'aider à l'obtenir pour ainsi continuer ce cours ce serait génial.
Dans apprennez à programmer en Python, je suis sur le chapitre des Expression Regulière.
Il est dit que normalement que lorsque la méthode search ne trouve rien elle renvoi NONE. Je ne dois pas faire ce qu'il faut elle ne revoie rien lorsqu'elle ne trouve pas l'expression demandée.
C'est à ce niveau du cours:
>>> re.search(r"abc", "abcdef")
<_sre.SRE_Match object at 0x00AC1640>
>>> re.search(r"abc", "abacadaeaf")
>>> re.search(r"abc*", "ab")
<_sre.SRE_Match object at 0x00AC1800>
>>> re.search(r"abc*", "abccc")
<_sre.SRE_Match object at 0x00AC1640>
>>> re.search(r"chat*", "chateau")
<_sre.SRE_Match object at 0x00AC1800>
>>>
moije suis sur l,exercice de python pour le Zcasino mais mon programme indique une erreur qui est :TypeError: '<' not supported between instances of 'str' and 'int' =
moije suis sur l,exercice de python pour le Zcasino mais mon programme indique une erreur qui est :TypeError: '<' not supported between instances of 'str' and 'int' =
Vérifie les types de tes variables dans ton opération de comparaison, tu as deux types qui ne sont pas compatibles pour faire cela.
C'est comme si tu faisais "ab" < 3 ça n'est pas cohérent.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
j'apprend python sur oc la formation de 40 heures,
je suis un peut bloqué sur le fait que je ne trouve pas vraiment la nécessité dans mes projets d'utiliser les metaclass , du coups je me demande vraiment dans quel cas peut il bien servir, quel type d projet fairai obligatoirement appel aux metaclass
C'est normal, en pratique elles ne sont presque jamais utiles.
Il y a un adage qui dit : si tu te demandes si tu as besoin d'une métaclasse c'est que tu n'en as pas besoin, quand tu en as besoin d'une tu le sais.
Il ne faut surtout pas vouloir à tout prix en utiliser dans tes projets.
C'est normal, en pratique elles ne sont presque jamais utiles. Il y a un adage qui dit : si tu te demandes si tu as besoin d'une métaclasse c'est que tu n'en as pas besoin, quand tu en as besoin d'une tu le sais.
Il ne faut surtout pas vouloir à tout prix en utiliser dans tes projets.
Je suis en train de lire le chapitre sur les générateurs. L'exemple du cours est celui d'un générateur qui renvoie dans l'ordre croissant les entiers strictement compris entre deux bornes. Pour tester l'échange des données entre le générateur et la boucle, je souhaitais donner la possibilité d'envoyer un booléen au générateur à tout moment depuis la boucle afin d'inverser l'ordre de renvoi.
def rangein(minimum, maximum):
value = minimum + 1
isreverse = False
while value in range(minimum + 1, maximum):
reverse = (yield value)
# Get the value sent by the loop and update isreverse
if reverse is not None and isinstance(reverse, bool):
isreverse = reverse
value += (1 if not isreverse else -1)
gen = rangein(2,8)
for i in gen:
if i == 6:
gen.send(True)
print(i)
Le résultat renvoyé est le suivant :
3
4
5
6
4
3
Alors que j'attends bien 3 4 5 6 5 4 3. Je ne comprends pas vraiment d'où vient l'erreur, sachant que quelques print() judicieusement placés dans le générateur me renvoient bien les bonnes valeurs...
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Portfolio : jonathan-macioszczyk.fr
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique