Posté le 14/02/2016 18:23
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 245 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 14/02/2016 22:09 | #
C'est à dire.
Merci merci merci beaucoup
Je vais me coucher et je continuerais demain
Citer : Posté le 14/02/2016 22:36 | #
C'est-à-dire que ceci :
def f():
x = 2
crée une variable locale à f nommée x de valeur 2 au lieu de changer la valeur de la variable globale. La bonne façon est
def f():
global x
x = 2
Citer : Posté le 15/02/2016 08:40 | #
Pour les variables globales je crois qu'on n'est pas obligé d'utiliser global si on les passe en paramètre de notre fonction.
Citer : Posté le 15/02/2016 08:42 | #
Oui, mais c'est un non-sens : car un paramètre de fonction est une variable locale à la fonction. Lorsque tu passes une variable « normale » (c'est-à-dire pas une liste ou un tuple) en argument, elle est copiée. Donc si tu fais ça, le compteur que tu modifies est une copie du vrai compteur global, qui lui n'est pas mis à jour !
Citer : Posté le 15/02/2016 09:15 | #
Ok mais comment on utilise "global"
Ajouté le 15/02/2016 à 09:20 :
Mais du coup, "self" censé être le seul argument (en paramètre) de toutes les méthodes de notre objet.
Citer : Posté le 15/02/2016 09:23 | #
Ok mais comment on utilise "global"
Facile.
def f():
global x
x += 1
Mais du coup, "self" censé être le seul argument (en paramètre) de toutes les méthodes de notre objet.
Pas forcément. Voici deux exemples (inutiles mais c'est pour illustrer):
def __init__(self):
self.compteur = 0
def incrementer(self):
self.compteur += 1
def augmenter(self, valeur):
self.compteur += valeur
c = Compteur()
c.incrementer()
c.compteur # 1
c.augmenter(4)
c.compteur # 5
On peut passer d'autres arguments, toutes les données dont la méthode a besoin ne sont pas forcément dans les attributs de l'objet. Note également que quand on appelle une méthode, on fait comme si l'argument self n'existait pas. Python le rajoute automatiquement.
Citer : Posté le 15/02/2016 09:31 | #
>>> aquarium
<__main__.Aquarium object at 0x02E81C10>
>>> poisson = Poisson
>>> poisson
<class '__main__.Poisson'>
>>> list_poissons.append(poisson)
>>> poisson = Poisson
>>> list_poissons.append(poisson)
>>> list_poissons
[<class '__main__.Poisson'>, <class '__main__.Poisson'>]
>>> poisson.reproduction (list_poissons)
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
poisson.reproduction (list_poissons)
TypeError: reproduction() missing 1 required positional argument: 'list_poissons'
>>> poisson.reproduction (self, list_poissons)
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
poisson.reproduction (self, list_poissons)
NameError: name 'self' is not defined
>>> poisson.reproduction (poisson, list_poissons)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
poisson.reproduction (poisson, list_poissons)
File "C:\Users\f.coupey\Desktop\Nouveau jeu.py", line 24, in reproduction
if poisson.age > 0 and poisson.sexe == 1:
AttributeError: type object 'Poisson' has no attribute 'age'
>>>
Pour quoi j'ai la première erreur (j'ai mis tout le code que j'ai entré dans le deboguer)
Ajouté le 15/02/2016 à 09:34 :
Voici le code que j'ai modifier :
list_aquariums = []
nb_poisson_m = 0
import random
class Poisson :
def _init_ (self):
self.age = 0
self.sexe = random.randint(1,2)
def temps (self):
self.age_p += 1
if self.age_p > 6 :
global nb_poisson_m
nb_poisson_m += 1
def reproduction (self, list_poissons ):
nb_p_m_adulte = 0
nb_p_f_adulte = 0
for poisson in list_poissons :
if poisson.age > 0 and poisson.sexe == 1:
nb_p_m_adulte += 1
if poisson.age > 0 and poisson.sexe == 2:
nb_p_f_adulte += 1
if nb_p_m_adulte > nb_p_f_adulte :
nb_couple = nb_p_f_adulte
else :
nb_couple = nb_p_m_adulte
for i in range(nb_couple) :
nb_enfant = random.randint(5,10)
for i in range(nb_enfant) :
poisson = Poisson(nb_poisson, nb_male, nb_femelle)
global list_poissons
list_poissons.append(poisson)
aquarium.nouveau_poisson
class Aquarium :
def _init_ (self ):
self.pop = 0
def nouveau_poisson (self ):
if self.pop < 20 :
self.pop += 1
else :
global nb_poisson_m
nb_poisson_m += 1
Citer : Posté le 15/02/2016 09:35 | #
>>> aquarium
<__main__.Aquarium object at 0x02E81C10>
Note le mot « object ». Là tu as bien instancié un aquarium et donc tu peux mettre de jolis poissons dedans.
>>> poisson
<class '__main__.Poisson'>
Là, non. Tu vois bien que tu n'as pas créé un poisson, tu as copié la classe. Comprends bien les choses comme ça :
Une classe est un modèle, une description de l'objet.
Une instance est un objet utilisable, une variable.
Là tu n'as pas instancié d'objet. Pour instancier un objet, il faut mettre des parenthèses. Il faut écrire « Poisson() ».
Les erreurs en découlent.
Jamais le self !
Citer : Posté le 15/02/2016 09:37 | #
Ahh oui si j'oublie les parenthèses
Merci
Ajouté le 15/02/2016 à 10:09 :
>>> aquarium.pop
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
aquarium.pop
AttributeError: 'Aquarium' object has no attribute 'pop'
>>> poisson = Poisson()
>>> poisson
<__main__.Poisson object at 0x02E9BAF0>
>>> aquarium
<__main__.Aquarium object at 0x02E21C10>
>>> list_poissons.append(poisson)
>>> poisson = Poisson()
>>> list_poissons.append(poisson)
>>> list_poissons
[<__main__.Poisson object at 0x02E9BAF0>, <__main__.Poisson object at 0x02E9BBF0>]
>>> list_poissons[1].age
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
list_poissons[1].age
AttributeError: 'Poisson' object has no attribute 'age'
>>> list_poissons[1].reproduction (list_poissons )
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
list_poissons[1].reproduction (list_poissons )
File "C:\Users\f.coupey\Desktop\Nouveau jeu.py", line 25, in reproduction
if poisson.age > 0 and poisson.sexe == 1:
AttributeError: 'Poisson' object has no attribute 'age'
>>>
Pourquoi il n'aime pas mes attributs
Citer : Posté le 15/02/2016 10:15 | #
Tu noteras que la méthode reproduction() n'utilise pas du tout self, elle n'a rien à faire dans la classe Poisson. Fais-en plutôt une méthode de la classe Aquarium, c'est beaucoup plus logique.
Tu t'es trompé sur la méthode __init__, il faut deux underscores avant et deux après !
Citer : Posté le 15/02/2016 10:18 | #
Merci pour les underscores.
Mais pour quoi dans la classe Aquarium
Ajouté le 15/02/2016 à 10:20 :
En faite je croix que ça devrai être une fonction indépendante.
Citer : Posté le 15/02/2016 10:20 | #
Parce que la reproduction c'est pas la reproduction d'un poisson. Tu comprend bien qu'il s'agit de reproduire les poissons d'un aquarium. Et la preuve, c'est que tu n'utilises pas du tout self : en fait, tout ce qui compte dans ta méthode c'est la liste de poissons. Donc ça n'a rien à faire dans la classe Poisson.
Et puis tu devrais mettre toutes tes globales dans la classe Aquarium et les gérer dans la classe Aquarium. La liste des poissons aussi. Là ça commencerait à ressembler à quelque chose !
Ajouté le 15/02/2016 à 10:21 :
En faite je croix que ça devrai être une fonction indépendante.
Ça pourrait, mais tu imagines bien que quand tu auras plusieurs aquariums les poissons ne sautent pas de l'un à l'autre, donc l'opération se limite aux contenus d'un seul aquarium
Et puis la liste de poissons devrait être dans la classe Aquarium normalement, et ça corrobore le fait que la méthode est plus intéressante
Citer : Posté le 15/02/2016 11:21 | #
Voici mon code :
list_aquariums = []
nb_poisson_m = 0
import random
class Poisson :
def __init__ (self):
self.age = 0
self.sexe = random.randint(1,2)
def temps (self):
self.age += 1
if self.age > 6 :
global nb_poisson_m
nb_poisson_m += 1
class Aquarium :
def __init__ (self ):
self.pop = 0
def nouveau_poisson (self ):
if self.pop < 20 :
self.pop += 1
else :
global nb_poisson_m
nb_poisson_m += 1
def reproduction (list_poissons ):
nb_p_m_adulte = 0
nb_p_f_adulte = 0
for poisson in list_poissons :
if poisson.age > 0 and poisson.sexe == 1:
nb_p_m_adulte += 1
if poisson.age > 0 and poisson.sexe == 2:
nb_p_f_adulte += 1
if nb_p_m_adulte > nb_p_f_adulte :
nb_couple = nb_p_f_adulte
else :
nb_couple = nb_p_m_adulte
for i in range(nb_couple) :
nb_enfant = random.randint(5,10)
for i in range(nb_enfant) :
poisson = Poisson()
list_poissons.append(poisson)
aquarium.nouveau_poisson
class Conserve :
def __init__ (self ) :
self.quantite = 20
aquarium = Aquarium()
list_aquariums.append(aquarium)
poisson = Poisson()
list_poissons.append(poisson)
aquarium.nouveau_poisson()
poisson = Poisson()
list_poissons.append(poisson)
aquarium.nouveau_poisson()
print(list_poissons[0].sexe, list_poissons[0].age, list_poissons[1].sexe, list_poissons[1].age, )
for poisson in list_poissons :
poisson.temps()
print(list_poissons[0].sexe, list_poissons[0].age, list_poissons[1].sexe, list_poissons[1].age, )
list_aquariums[0].reproduction()
print(list_poissons)
Et j'ai ensuite :
1 1 1 1
Traceback (most recent call last):
File "C:\Users\f.coupey\Desktop\Nouveau jeu.py", line 79, in <module>
list_aquariums[0].reproduction()
File "C:\Users\f.coupey\Desktop\Nouveau jeu.py", line 40, in reproduction
for poisson in list_poissons :
TypeError: 'Aquarium' object is not iterable
>>>
Mais "list_poissons" n'est pas du tout un 'Aquarium' object
Citer : Posté le 15/02/2016 11:29 | #
Tu t'es raté, tu as oublié l'argument self
Comme je te l'ai dit, en Python le premier argument d'une méthode c'est self. Même si tu lui donnes le nom list_poissons, ça reste self. Et ici self est de type Aquarium. Il faut que tu ajoutes self dans tous les cas :
Citer : Posté le 15/02/2016 11:34 | #
Merci Lephe, sa marche enfin.
Ajouté le 15/02/2016 à 20:49 :
Encore un problème :
list_aquariums = []
list_conserves =[]
nb_poisson_m = 0
import os
import random
class Poisson :
def __init__ (self):
self.age = 0
self.sexe = random.randint(1,2)
def temps (self):
self.age += 1
if self.age > 6 :
global nb_poisson_m
nb_poisson_m += 1
class Aquarium :
def __init__ (self ):
self.pop = 0
def nouveau_poisson (self ):
if self.pop < 20 :
self.pop += 1
else :
global nb_poisson_m
nb_poisson_m += 1
def reproduction (self, list_poissons ):
nb_p_m_adulte = 0
nb_p_f_adulte = 0
for poisson in list_poissons :
if poisson.age > 0 and poisson.sexe == 1:
nb_p_m_adulte += 1
if poisson.age > 0 and poisson.sexe == 2:
nb_p_f_adulte += 1
if nb_p_m_adulte > nb_p_f_adulte :
nb_couple = nb_p_f_adulte
else :
nb_couple = nb_p_m_adulte
for i in range(nb_couple) :
nb_enfant = random.randint(5,10)
for i in range(nb_enfant) :
poisson = Poisson()
list_poissons.append(poisson)
aquarium.nouveau_poisson
class Conserve :
def __init__ (self ) :
self.quantite = 20
def repas (self, list_poissons, list_conserves, poisson_nouri ) :
poisson_a_nourir = len(list_poissons) - poisson_nouri
while self.quantite > 0 or poisson_a_nourir > 0 :
self.quantite -= 1
poisson_a_nourir -= 1
if poisson_a_nourir == 0 :
return
elif self.quantite == 0 :
del list_conserves[len(list_conserves)-1]
if len(list_conserves) == 0 :
for p in range(poisson_a_nourir) :
del list_poissons[len(list_poissons)-1]
global nb_poisson_m
nb_poisson_m += poisson_a_nourir
return
else :
poisson_nouri = len(list_poissons) - poisson_a_nourir
list_conserves[len(list_conserves)-1].repas (list_poissons, list_conserves, poisson_nouri)
aquarium = Aquarium()
list_aquariums.append(aquarium)
aquarium = Aquarium()
list_aquariums.append(aquarium)
aquarium = Aquarium()
list_aquariums.append(aquarium)
conserve = Conserve()
list_conserves.append(conserve)
conserve = Conserve()
list_conserves.append(conserve)
conserve = Conserve()
list_conserves.append(conserve)
poisson = Poisson()
poisson.sexe = 1
list_poissons.append(poisson)
aquarium.nouveau_poisson()
poisson = Poisson()
poisson.sexe = 2
list_poissons.append(poisson)
aquarium.nouveau_poisson()
for poisson in list_poissons :
print(poisson.sexe, poisson.age )
print("")
while 1 :
print(len(list_conserves))
list_aquariums[0].reproduction(list_poissons )
list_conserves[len(list_conserves)-1].repas (list_poissons, list_conserves, 0)
for poisson in list_poissons :
poisson.temps()
for poisson in list_poissons :
print(poisson.sexe, poisson.age )
print("")
Et quand je l'éxécute :
2 0
3
1 1
2 1
0
Traceback (most recent call last):
File "C:\Users\f.coupey\Desktop\Nouveau jeu.py", line 117, in <module>
list_conserves[len(list_conserves)-1].repas (list_poissons, list_conserves, 0)
IndexError: list index out of range
>>>
Je comprend pas ou est l'erreur.
Ps: la partie de mon code qui suie la class Conserve sert seulement à tester mes class.
Citer : Posté le 15/02/2016 21:22 | #
J'ai pas regardé tout le détail (désolé ^^' ), mais si l'erreur vient de là :
Commence par regarder si la liste n'est pas vide. Et au passage pour accéder au dernier élément, Python dispose de la très élégante syntaxe :
Citer : Posté le 15/02/2016 21:27 | #
Et tu as eu tout à fait raisons ,car je t'en demande beaucoup trop (j'espère pas).
En faite je croix que quand je nourris mes poissons (la première fois), mes trois boites de conserves disparaissent, mais je comprend pas pour quoi.
Citer : Posté le 15/02/2016 23:01 | #
Je te rappelle que cette ligne
ne sert à rien, pour appeler la méthode il faut ajouter des parenthèses.
Au passage nourrir prend deux 'r'.
Tu te rends compte que tu fais des appels récursifs sur des repas de conserves là ?
Citer : Posté le 16/02/2016 12:19 | #
Mais où est le problème
Ps: Tant pis pour les r.
Citer : Posté le 16/02/2016 12:38 | #
Mais où est le problème
C'est probablement parce que tu manques un peu d'expérience, mais c'est de la logique.
Un programme propre c'est pas un fouillis de code. En l'occurrence, repas() est une méthode de la classe Conserve donc elle doit concerner une Conserve. Ça n'a pas de sens de confier à une conserve la tâche de nourrir les poissons avec toute la liste. Ce n'est pas logique.
Plus logique serait sans doute une structure de ce type :
def __init__(self, ...): ...
def temps(self): ...
class Aquarium:
def __init__(self, ...):
self.poissons = [] // La list_poissons est un element de l'aquarium !
def reproduction(self):
def repas(self, liste_conserves):
// Nourrir les poissons qui sont a l'interieur de l'aquarium en fournissant des conserves a l'aquarium
class Conserve:
def __init__(self):
self.quantite = 20
Demande-toi toujours :
→ Qui possède / contient la donnée ? pour les variables
→ Qui agit, sur quels éléments internes et avec quels éléments externes ? pour les fonctions
La représentation typique d'un objet c'est une boîte noire avec des boutons et des leviers. Imagine une boîte noire avec une étiquette « Conserve ». Tu t'imagines pouvoir la remplir, la vider, ou la mettre dans un aquarium, qui (sans que tu saches trop comment parce que le système de distribution de nourriture de l'aquarium est dans la boîte noire de l'aquarium) va probablement la donner à manger aux poissons.
Tu t'imagines vraiment que tu vas prendre une boîte noire conserve, lui donner une liste de conserves, une liste de poissons que tu ne devrais même pas avoir parce qu'elle devrait être dans l'aquarium, et attendre qu'elle nourrisse les poissons ? Ça n'a pas de sens.
Ton programme souffre d'un grand manque d'organisation et crois-moi, un programme mal organisé qui fonctionne ne fonctionne pas longtemps. Quand tu vas dépasser 500 lignes ou 1000 lignes de code tu ne t'y retrouveras plus...
Citer : Posté le 16/02/2016 12:55 | #
En fait, J'ai récupéré un sujet de mon frère qui est en deuxième année d'école d'ingénieur à l'icam (Toulouse) :
http://tinyurl.com/z93qhtf
Mais après avoir essayé de construire le plan de mon code, je ne savais pas du tout par où commencer aussi je suis un peu parti dans tous les sens.
Ajouté le 16/02/2016 à 12:59 :
Une fois que tu l'auras vu, je supprimerai le lien.