Posté le 14/02/2016 18:23
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 233 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 18:24 | #
Jamais. « poisson+str(i) » ne peux pas être une variable.
Utilise une liste plutôt.
Citer : Posté le 14/02/2016 18:45 | #
Comment ???
En fait : j'ai une class poisson ; je crée un nombre de poisson qui évolue au cours du jeu ; et a un moment, j'ai besoin de savoir l'âge de chaque poisson, je voudrais donc faire :
for i in nb_poisson :
age = poisson+str(i).temps()
if age > 1
nb_poisson_adulte += 1
Or tu me dit qu'on ne peut pas.
Mais que l'on peut avec des listes .
Comment SVP
Ps : Merci d'avoir répondu si vite.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 18:51 | #
Je vais préciser un peu. Très peu de langage permettent d'écrire des programmes dans lesquels les noms des variables sont connus à l'exécution. C'est-à-dire que lorsqu'on désigne une variable dans le code, il ne peut s'agir que d'une seule variable et il ne doit pas y avoir de code à exécuter pour déterminer laquelle.
Lorsqu'on veut accéder à une variable via un entier (généralement), il est coutume d'utiliser des tableaux (ou plutôt ici, des listes) :
nb_poisson_adulte = 0
for poisson in poissons:
age = poisson.temps()
if age > 1:
nb_poisson_adulte += 1
J'en profite pour signaler deux-trois choses :
- Il faut initialiser le compteur nombre nb_poisson_adulte.
- Il faut deux points pour ouvrir le bloc if.
- Ma boucle for est un peu spéciale, c'est propre à Python et très utilisé en Python. Voici une boucle plus proche de la tienne, dans laquelle la variable est l'indice de parcours de la liste :
age = poissons[i].temps()
...
Cependant, Python permet d'itérer sur une liste avec la syntaxe que j'ai utilisé, et la variable de la boucle (dans mon cas, « poisson ») prend successivement les valeurs de tous les éléments de la liste.
Si tu ne connais pas encore les listes en Python, je te conseille fortement d'aller lire un tutoriel parce que c'est beaucoup plus basique et fondamental que les objets. (Et pis vu la syntaxe que tu as utilisée tu ne dois pas avoir l'habitude de Python. )
Citer : Posté le 14/02/2016 19:05 | #
En effet, ça fait plus d'un mois que je n'ai pas programmé en python et il faut que je reprenne en main la syntaxe (ça ne devrait pas être trop long )
Pas de problème avec les listes.
Mais là oui :
Je ne sait pas combien j'ai de poisson donc je ne vois pas comment je peut créer cette liste, le problème reste le même : je ne peut pas faire ça :
for i in nb_poisson :
poisson[i] = poisson+str(i)
Ps :
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 19:07 | #
- Ma boucle for est un peu spéciale, c'est propre à Python et très utilisé en Python. Voici une boucle plus proche de la tienne, dans laquelle la variable est l'indice de parcours de la liste :
age = poissons[i].temps()
...
Et voici la rectification de cette boucle :
age = poissons[i].temps()
...
Citer : Posté le 14/02/2016 19:11 | #
Pourquoi range() ???
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 19:11 | #
Je ne sait pas combien j'ai de poisson donc je ne vois pas comment je peut créer cette liste, le problème reste le même : je ne peut pas faire ça
for i in nb_poisson :
poisson[i] = poisson+str(i)
Non, pas de « poisson + str(i) », c'est illicite !
Tu n'as qu'à initialiser la liste vide :
Et rajouter des éléments au fur et à mesure :
Tu ne peux pas dire que tu connais les listes sans savoir ça...
Et voici la rectification de cette boucle :
age = poissons[i].temps()
...
Oups, exact. Merci.
Parce que la variable de boucle n'est pas l'indice dans la liste mais l'élément lui-même. Cette boucle est souvent appelée foreach dans les langages qui la supportent.
Ajouté le 14/02/2016 à 19:12 :
Pourquoi range() ???
On peut rien faire pour toi là... >_< Il faut lire un minimum de tutoriel.
Citer : Posté le 14/02/2016 19:16 | #
poissons.append(nouveau_poisson)
Mais comment je sais si nouveau_poisson = poisson_1 ou 2 ou 100
Ajouté le 14/02/2016 à 20:15 :
???
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 20:16 | #
Gab, arrête d'up tes topics avec des points d'interrogation, attends que l'on te réponde.
Citer : Posté le 14/02/2016 20:23 | #
Excusez mon impatience
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 21:06 | #
poissons.append(nouveau_poisson)
Mais comment je sais si nouveau_poisson = poisson_1 ou 2 ou 100???
Eh ben tu changes le paramètre ! >_<
poissons.append(poisson_2)
poissons.append(poisson_100)
Citer : Posté le 14/02/2016 21:09 | #
for i in nb_poisson :
poisson.append(poisson+str(i))
Désolé mais je ne comprends toujours pas comment faire
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 21:10 | #
Lis un cours de Python.
def creer_poisson():
p = Poisson()
poissons.append(p)
Citer : Posté le 14/02/2016 21:14 | #
Je suis un cours de 40 heurs niveau difficile sur openclassrooms
Ajouté le 14/02/2016 à 21:16 :
Je croix avoir trouvé une solution.
Merci pour ta patience
Ajouté le 14/02/2016 à 21:21 :
poisson = []
class poisson :
def _init_ (nom, nb_poisson, nb_male, nb_femelle):
poisson.append(nom)
age_p = 0
nb_poisson += 1
sexe = random.randint(1,2)
if sexe = 1 :
nb_male += 1
else :
nb_femelle += 1
def temps (age_p, sexe):
age_p += 1
if age_p > 6 :
nb_poisson_m += 1
nb_poisson -= 1
if sexe = 1 :
nb_male -= 1
else :
nb_femelle -= 1
def reproduction (nb_poisson):
"""poisson = []
for i in nb_poisson :
poisson[i] = poisson+str(i)
age = poisson+str(i).temps()
if age > 6
nb_poisson_adulte += 1"""
nb_couple = (nb_poisson - (nb_poisson % 2 ) ) / 2
for i in nb_couple :
nb_enfant = random.randint(5,10)
for i in nb_enfant :
poisson
class Aquarium :
def _init_ :
nb_aquarium += 1
pop = 0
def nouveau_poisson (pop):
if pop < 20 :
pop += 1
else :
nb_poisson_m += 1
nb_poisson -= 1
if sexe = 1 :
nb_male -= 1
else :
nb_femelle -= 1
Voici mon code entier, je n'y arrive pas
Ajouté le 14/02/2016 à 21:29 :
Est ce que je peut faire ça quand je crée mon poisson
poisson.append(poisson_str(nb_poisson))
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 21:30 | #
Comment tu peux coder de telles choses que de l'orienté objet sans connaître de telles choses que les listes ?
poisson = []
class poisson :
Tu commences bien, la variable a le même nom que la classe. Règle générale de convention en programmation : les noms de classes prennent des majuscules. Donc Poisson sera mieux.
poisson.append(nom)
age_p = 0
nb_poisson += 1
sexe = random.randint(1,2)
if sexe = 1 :
nb_male += 1
else :
nb_femelle += 1
Il n'y a pas de self en premier argument : quand on écrit des méthodes, le premier argument c'est toujours self et c'est comme ça qu'on instancie des attributs (« self.attr = value » crée un attribut alors que « attr = value » ne crée, comme tu t'en doutes, qu'une variable locale). Les variables nb_poisson, nb_male, nb_femelle n'existent pas en-dehors de la fonction donc elles sont locales : le compteur ne sert à rien.
age_p += 1
if age_p > 6 :
nb_poisson_m += 1
nb_poisson -= 1
if sexe = 1 :
nb_male -= 1
else :
nb_femelle -= 1
Mêmes remarques, il manque le self et les compteurs ne servent à rien.
"""poisson = []
for i in nb_poisson :
poisson[ i ] = poisson+str(i)
age = poisson+str(i).temps()
if age > 6
nb_poisson_adulte += 1"""
nb_couple = (nb_poisson - (nb_poisson % 2 ) ) / 2
for i in nb_couple :
nb_enfant = random.randint(5,10)
for i in nb_enfant :
poisson
C'est un hasard mais sache que quand on met une chaîne de caractères juste après une déclaration de fonction (ce qui serait une erreur de syntaxe dans la plupart des langages), on appelle ça une docstring et c'est censé contenir la documentation de la fonction. Là en occurrence, utilise des commentaires, des vrais. Même si l'absence de commentaire multiligne est embêtante.
« for i in nb_couple » ne veut rien dire. Il n'y a pas plusieurs éléments dans 4. Il y a des éléments dans range(4) = [ 0, 1, 2, 3 ]. Encore une fois, lis un cours sur les listes. Ou relis-le si tu as atteint les objets !
L'instruction « poisson » à la dernière ligne ne sert à rien. Si tu veux créer un poisson, il faut écrire « Poisson() » (en supposant que tu aies renommé conventionnellement la classe) et il faut passer en argument les arguments de __init__ (sauf le self, qui est ajouté au début quand on utilise des méthodes : on ne l'indique pas en argument mais il arrive tout seul). Et il faut ajouter un append à la liste des poissons, par exemple « poisson.append(Poisson(...)) ».
def _init_ :
nb_aquarium += 1
pop = 0
Voilà une meilleur convention de nommage. Encore une fois, nb_aquarium et pop sont des variables locales, elles ne servent strictement à rien.
if pop < 20 :
pop += 1
else :
nb_poisson_m += 1
nb_poisson -= 1
if sexe = 1 :
nb_male -= 1
else :
nb_femelle -= 1
Cette fonction tombe à l'eau parce que toutes les variables sont locales. Il faut créer des attributs !
Ajouté le 14/02/2016 à 21:33 :
Est ce que je peut faire ça quand je crée mon poisson
poisson.append(poisson_str(nb_poisson))
Tu n'as pas compris le principe des variables. Il n'y a pas besoin d'appeler tes variables poisson_1, poisson_2, poisson_3. Tu peux avoir une fonction pour créer des poissons qui écrive « poisson = Poisson() » et « liste_poissons.append(poisson) », ça fonctionnera très bien. La variable « poisson » sera locale à la fonction. Tu n'est pas obligé d'utiliser des noms différents à chaque fois...
Citer : Posté le 14/02/2016 21:35 | #
Pour ce qui est entre """ c'est un brouillon
Et je n'avais pas encore créé de variable globale.
Je te renvois un code plus propre
Ajouté le 14/02/2016 à 21:40 :
Génial
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 21:53 | #
Je te rappelle pour information que quand tu écris ceci :
variable = 1
La variable est dite locale à la fonction, donc elle n'existe que dans la fonction. Quand on sort de la fonction elle est détruite !
Citer : Posté le 14/02/2016 22:00 | #
nb_poisson = 0
nb_poisson_m = 0
nb_male = 0
nb_femelle = 0
nb_aquarium = 0
import random
class Poisson :
def _init_ (self, nb_poisson, nb_male, nb_femelle):
self.age = 0
self.sexe = random.randint(1,2)
if sexe = 1 :
nb_male += 1
else :
nb_femelle += 1
nb_poisson += 1
def temps (self.age, self.sexe):
self.age_p += 1
if self.age_p > 6 :
nb_poisson_m += 1
nb_poisson -= 1
if sexe = 1 :
nb_male -= 1
else :
nb_femelle -= 1
def reproduction (self.age, nb_poisson):
nb_poisson_adulte = 0
for i in range(len(list_poissons)) :
if list_poissons[i].age > 0 :
nb_poisson_adulte += 1
nb_couple = (nb_poisson_adulte - (nb_poisson_adulte % 2 ) ) /2
for i in nb_couple :
nb_enfant = random.randint(5,10)
for i in nb_enfant :
poisson = Poisson(nb_poisson, nb_male, nb_femelle)
list_poissons.append(poisson)
J'ai laissé tomber l'aquarium pour l'instant. J’espère que c'est mieux.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 14/02/2016 22:06 | #
nb_male += 1
else :
nb_femelle += 1
if self.sexe == 1. Je rappelle que le test d'égalité c'est '==', note juste que si tu écris '=', tu affectes la valeur de la variable comme si tu écrivais « self.sexe = 1 » suivi de « if self.sexe: ».
Nope :
Comme ça.
Attention au test d'égalité !
if list_poissons[i].age > 0 :
nb_poisson_adulte += 1
Oui, mais utilise la boucle for idiomatique de Python :
if poisson.age > 0:
nb_poisson_adulte += 1
range(nb_couple). Il y en a d'autres après mais je vais pas répéter.
list_poissons.append(poisson)
Enlève les arguments. Les variables sont globales, inutiles de les passer en argument. Enlève-aussi des paramètres de __init__().
C'est mieux. Je pense qu'il faut utiliser global aussi pour accéder aux variables globales.
Citer : Posté le 14/02/2016 22:09 | #
C'est à dire.
Merci merci merci beaucoup
Je vais me coucher et je continuerais demain
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!