Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Jouer au Loto

27 réponses
Avatar
fred1599
Bonjour,

J'aimerais apprendre la notion de classes.

Pour cela j'aimerais cr=E9er un petit fichier "py" me permettant de
tirer au sort 7 num=E9ros sur 4 grilles.

Voila comment je vois les choses simples pour le moment, on affinera
ensuite.

J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais
grille1, grille2, grille3 et grille4.

Pour grille1
Cr=E9er ma liste de num=E9ros (liste1)
Prendre 1 num=E9ro au hasard entre 1 et 49
R=E9p=E9ter "prendre 1 num=E9ro au hasard entre 1 et 49" 6 fois
Mettre les 7 num=E9ros dans liste1

Pour grille2
Idem grille1

Merci de m'aiguiller sans me donner la r=E9ponse, j'aimerais penser
comme vous, et ne pas recopier betement sans comprendre vos codes.

Question 1 : Est-ce que cr=E9er une classe grille est concevable est
correct, sachant que j'imagine ma classe comme un objet?

Question 2 : Dans ma fa=E7on de penser, est-ce correct ou non? Merci de
m'aider =E0 travailler sur python

A bientot

Je reviens demain soir, vous r=E9pondre.

Bye

10 réponses

1 2 3
Avatar
Bruno Desthuilliers
On 10 sep, 17:08, Bruno Desthuilliers <bruno.
wrote:
(snip)

Dis voir... Qu'est-ce que tu dirais de lire un tutoriel Python avant
d'aller plus loin ?


Je les lis, j'ai même acheté un bouquin,


Lequel, si ce n'est pas indiscret ?


mais je dois avouer que j'ai
beaucoup de mal de comprendre.


Alors tu devrais peut-être commencer par poser des questions sur ce que
tu a du mal à comprendre ?

Accessoirement, et puisque tu sembles débuter en programmation, je me
permets de te recommander ceci:http://www.cifen.ulg.ac.be/inforef/swi/python.htm


J'ai le bouquin "Python par l'exemple" et le tuto que tu m'as présenté

je m'en sers régulièrement

Alors tu a deux plutôt bonnes références.


Bon, puisque je n'ai pas le bouquin d'Alex Martelli, on va s'appuyer sur
le Swinnen. A tu lu les chapitres 11 et 12, et fait les exercices du
chapitre 12 ? Si oui, poste donc tes questions sur ce que tu n'a pas
compris dans ces chapitres, et éventuellement tes réponses pour les
exercices. Sinon, tu commences par là, et on t'aide à partir de là.




Avatar
Mihamina (R12y) Rakotomandimby
wrote:
Bonjour,


Bonjour,

J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais
grille1, grille2, grille3 et grille4.


Moi j'aurais plutot tendance à dire qu'il y a une seule classe "Grille",
et 4 instances (grille_1, ..., grille_4) de cette classe.

Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je
te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section
"Naming Conventions") ou tu verras comment "ecrire correctement" le nom
d'une classe et d'une instance.

Avatar
Mihamina (R12y) Rakotomandimby
Mihamina (R12y) Rakotomandimby wrote:
http://www.python.org/dev/peps/pep-0008/ (section
"Naming Conventions")


http://lapagearegis.free.fr/guidedestyle.html
-> Conventions de Nommage

Avatar
fred1599
On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby"
wrote:
Mihamina (R12y) Rakotomandimby wrote:
http://www.python.org/dev/peps/pep-0008/(section
"Naming Conventions")


http://lapagearegis.free.fr/guidedestyle.html
-> Conventions de Nommage


Ok un truc du genre

class Grille :
a=grille1.Grille [] #création de l'instance grille1
b=grille2.Grille []
c=grille3.Grille []
d=grille4.Grille []

Ici je n'ai pas besoin apparement d'argument pour construire ma classe
il me semble?

Merci pour ton aide


Avatar
jean-marc pouchoulon

Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code, je
te conseille ceci: http://www.python.org/dev/peps/pep-0008/ (section
"Naming Conventions") ou tu verras comment "ecrire correctement" le nom
d'une classe et d'une instance.


J'avais noté ca aussi pour les conventions
http://conferences.oreillynet.com/presentations/os2007/os_goodger.pdf

Pour le faire du code avec une classe je ferais ca mais....

from random import randint

class Grille(list):
def __init__(self):
i = 1
while i <=7:
self.append(randint(0,49))
i += 1

g1 = Grille()
g2 = Grille()
g3 = Grille()
g4 = Grille()

print g1
print g2
print g3
print g4


...une question idiote ca marche mais pourquoi?
je suis un peu surpris de ne pas devoir appeler le contructeur de list
dans le contructeur de Grille.
Désolé d'embrouiller la réponse.


bonne nuit

Avatar
Bruno Desthuilliers
Bonjour,

J'aimerais apprendre la notion de classes.

Pour cela j'aimerais créer un petit fichier "py" me permettant de
tirer au sort 7 numéros sur 4 grilles.

Voila comment je vois les choses simples pour le moment, on affinera
ensuite.

J'aurais 4 classes, 1 classe pour chaque grille, que je nommerais
grille1, grille2, grille3 et grille4.


AMHA, tu n'a pas compris le principe de base d'une classe. Tu n'a pas
besoin de 4 classes différentes, une seule suffit. Regarde la class int
(les nombres entiers) : c'est la même classes pour tous les entiers, pas
une classe par nombre !-)

Pour grille1
Créer ma liste de numéros (liste1)
Prendre 1 numéro au hasard entre 1 et 49
Répéter "prendre 1 numéro au hasard entre 1 et 49" 6 fois
Mettre les 7 numéros dans liste1


Ce que tu décris là est un algorithme, pas un type. Avant toute autre
chose, une classe décrit un type de données, c'est à dire la structure
de données, la plage de valeurs, et les opérations possibles. Dans ton
cas, ta classe Grille serait un ensemble de 7 nombres entier compris
entre 1 et 49. Je te laisse définir les opérations qui te semblent
appropriées, mais tu peux déjà songer à l'égalité (deux grilles sont
elles identiques ?).

mes deux centimes...

Avatar
Bruno Desthuilliers
On 9 sep, 21:44, "Mihamina (R12y) Rakotomandimby"
wrote:
Mihamina (R12y) Rakotomandimby wrote:
http://www.python.org/dev/peps/pep-0008/(section
"Naming Conventions")
http://lapagearegis.free.fr/guidedestyle.html

-> Conventions de Nommage


Ok un truc du genre

class Grille :
a=grille1.Grille [] #création de l'instance grille1


Dis voir... Qu'est-ce que tu dirais de lire un tutoriel Python avant
d'aller plus loin ?



Avatar
Bruno Desthuilliers


Sinon, et puisque j'y pense, au niveau de la façon d'écrire le code,
je te conseille ceci: http://www.python.org/dev/peps/pep-0008/
(section "Naming Conventions") ou tu verras comment "ecrire
correctement" le nom d'une classe et d'une instance.


J'avais noté ca aussi pour les conventions
http://conferences.oreillynet.com/presentations/os2007/os_goodger.pdf

Pour le faire du code avec une classe je ferais ca mais....

from random import randint

class Grille(list):
def __init__(self):
i = 1
while i <=7:
self.append(randint(0,49))
i += 1



for i in xrange(1,8):
self.append(randint(1,49))


g1 = Grille()
g2 = Grille()
g3 = Grille()
g4 = Grille()

print g1
print g2
print g3
print g4


...une question idiote ca marche mais pourquoi?


Pourquoi est-ce qye ça ne marcherais pas ?

je suis un peu surpris de ne pas devoir appeler le contructeur de list
dans le contructeur de Grille.


Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à
l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais
l'initialiseur. Le constructeur, c'est __new__().

Accessoirement, sous-classer liste n'est probablement pas la meilleur
chose à faire ici. Une grille de loto n'est définitivement pas une liste
(sémantique et invariants différents). Que tu utilise une liste pour
implémenter ta grille, c'est ton choix (et une solution possible), mais
ça ne devrait pas être visible.


Avatar
jean-marc pouchoulon

Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à
l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais
l'initialiseur. Le constructeur, c'est __new__().

Ok c'est un abus de langage que tu as raison de souligner.

Quand je regarde "Unifying types and classes in Python 2.2"
l'initialisateur de dict est bien appelé:

Here's an example of a simple dict subclass, which provides a "default
value" that is returned when a missing key is requested:

class defaultdict(dict):

def __init__(self, default=None):
dict.__init__(self)
self.default = default

def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
return self.default

http://www.python.org/download/releases/2.2/descrintro/

Je pensais que le fait de déclarer une méthode suffisait à surcharger le
constructeur de la classe parent.


class parent(object):
... def __init__(self):



... self.valeur = 1
...
class enfant(parent):
... pass



...
e=enfant()
e.valeur
1



class enfant(parent):
... def __init__(self):



... self.valeur=2
...
e=enfant()
e.valeur
2








je loupe quelque chose

jean-marc



Avatar
Bruno Desthuilliers


Tu n'a pas surchargé le constructeur de list, tu n'a donc pas à
l'appeler. Note bien que __init__() n'est *pas* le constructeur, mais
l'initialiseur. Le constructeur, c'est __new__().

Ok c'est un abus de langage que tu as raison de souligner.

Quand je regarde "Unifying types and classes in Python 2.2"
l'initialisateur de dict est bien appelé:

Here's an example of a simple dict subclass, which provides a "default
value" that is returned when a missing key is requested:

class defaultdict(dict):

def __init__(self, default=None):
dict.__init__(self)
self.default = default

def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
return self.default

http://www.python.org/download/releases/2.2/descrintro/

Je pensais que le fait de déclarer une méthode suffisait à surcharger le
constructeur de la classe parent.


<hs mode="plus ou moins">
Je sais que je suis un peu pénible avec ça, mais bien que je comprennes
ce que tu veux dire, ta formulation est erronée, et AMHA, quand on ne
pense pas avec les bons termes, on ne peut pas comprendre clairement le
concept !-)

Donc, le fait de définir une fonction dans une classe[1] ne surcharge ni
l'initialiseur, ni le constructeur de la classe parent *sauf* bien sûr
si la fonction s'appelle __new__ ou __init__ !-)

[1] ou d'associer un nom à une fonction dans l'espace de nommage de la
classe, ce qui revient au même...
</hs>

En tout état de cause, en ce qui concerne les types 'conteneurs'
builtins (classes codée en C...), le stockage du 'contenu' n'est pas
fait dans un attribut défini dans l'initialiseur et accessible depuis
Python.

Dans l'exemple ci-dessus, l'appel à dict.__init__ est totalement inutile
- essaie par toi-même... Pour que cet appel serve à quelque chose, il
aurait fallu gérer les différentes façons possibles d'initialiser un
dict (séquence de paire clé/valeur, arguments nommés etc).


1 2 3