IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

fonction et paramètres


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 41
    Points : 30
    Points
    30
    Par défaut fonction et paramètres
    Bonjour

    Interrogation sur les fonctions

    J'essaye - pour apprendre avec du concret - de développer un programme pour compter les points au tarot

    Pour se faire j'ai stocké les noms des joueurs (key/string) et leur score (value/liste) dans un dictionnaire, idem pour les contrats, les oudlers et les annonces .
    On va dire que c'est la partie intialisation

    Bien sûr ensuite je compte les points et mets à jour les scores.

    Pour se faire j'ai créé une fonction updateScore( ) qui ajoute (positive ou négative) une valeur au score de chaque joueur contenu dans le dictionnaire joueur (le type de donnée étant une liste, je le fais avec un append). Pas de soucis

    Mais cette fonction fait appel à tous les dictionnaires ainsi qu'à des paramètres plus spécifiques comme le gain, le pari, les annonces du tour.

    Pour l'instant je passe tout en paramètre mais je ne trouve pas cela judicieux.

    Pour coder "correctement", ne serait il pas mieux de mettre ces dictionnaires en variables globales et ne passer que les valeurs du tour (gain, preneur, pari, annonce) ? Qu'en pensez vous ?

    Si j'ai tout bien compris dans ce cas, on utilise le mot clef golbal que lors qu'il y à écriture dans cette variable, sinon ce n'est pas nécessaire. Est ce bien celà ?

    D'avance merci pour votre partage d'expérience

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 17 698
    Points : 30 544
    Points
    30 544
    Par défaut
    Salut,

    Citation Envoyé par cyrille_b Voir le message
    Pour coder "correctement", ne serait il pas mieux de mettre ces dictionnaires en variables globales et ne passer que les valeurs du tour (gain, preneur, pari, annonce) ? Qu'en pensez vous ?
    Vous pouvez utiliser des variables globales mais la solution correcte sera de créer des classes pour découper l'espace des variables et les regrouper avec les opérations qui les modifient.

    Citation Envoyé par cyrille_b Voir le message
    Si j'ai tout bien compris dans ce cas, on utilise le mot clef golbal que lors qu'il y à écriture dans cette variable, sinon ce n'est pas nécessaire. Est ce bien celà ?
    Si score est un dictionnaire "global", vous pourrez y accéder et le modifier dans la fonction.
    Le mot clef global ne servira qu'à pouvoir assigner (score = ...) un autre objet.
    Ce qui est différent de modifier l'objet....
    Et qui introduit les notions de "mutable" (dictionnaires, listes,...) pour les objets qu'on peut modifier et de non mutable pour les autres (nombres, chaines de caractères,....)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    Merci pour la réponse
    Je commence à mieux comprendre un autre rôle des classes par votre message et plusieurs autres lectures : la restriction de variables à un espace précis
    Merci en tout cas

  4. #4
    Membre chevronné

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : mars 2013
    Messages : 1 111
    Points : 2 082
    Points
    2 082
    Par défaut
    Effectivement le truc propre serait de faire des classes.

    Après si vous ne maitrisez pas les classes vous pouvez très bien écrire une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def score_tour(gain, preneur, pari, annonce=0):
    où preneur n'est pas une chaine (ie le nom du joueur) mais la position du joueur dans la liste des joueurs, et qui retournera le tableau des score du tour.
    Donc si par exemple j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    score_tour(2, 1, 'garde', 0)
    ca retourne:
    ( (25+2)*2 + 0 = 54 points par tête )

    Après dans votre programme, vous initialiser un tableau de 0. A chaque tour vous appelez score_tour, vous en récupérez le résultat, et vous l'ajouter au tableau que vous avez initialisé à 0. Et donc ce tableau fera ainsi le cumul des scores.

    Quelquesoit la manière d'implémenter, il faut :
    - éviter le mot global
    - séparer la gestion d'un tour, de celle d'une partie composée de plusieurs tours

    Après là j'y vois plusieurs limitations :
    - Comment prenez vous en compte le nombre de joueur ? D'autant plus qu'à 5 joueurs il y a un joueur appelé, donc ca change le prototype de votre fonction ...
    - Pour les annonces, là j'ai mis le montant de l'annonce. Mais techniquement ce serait mieux de pouvoir entrer le type d'annonce, qui l'annonce, et éventuellement dans une liste, car il peut y avoir plusieurs annonce (dans le même camp ou pas, donc faut gérer si elle se cumule ou se compense partiellement). Typiquement misère en défense, poignée + petit au bout en attaque.
    - Je ne sais pas comment comptez vous utiliser votre programme, mais si pour compter les points il faut à chaque fois taper des lignes de code, ce n'est pas vraiment intéressant (user-friendly). Il serait peut être plus judicieux d'avoir un code que vous lancez au début de votre partie de tarot, et après avec la fonction input, vous demandez à l'utilisateur s'il continue à jouer :
    si oui, le programme pose les questions l'une après l'autre: qui prend, quel contrat, fait de combien, y a t il des annonces, si oui par qui et laquelle puis y en a t il une autre et on boucle jusqu'à tant que l'utilisateur réponde qu'il n'y ait plus d'annonce à enregistrer.
    si non, le programme est terminée

    J'avais programmé ça sur ma calculatrice, une TI-82 quand j'étais au lycée, donc en python c'est tout à fait réalisable. Après en python il va y avoir plusieurs façon de procéder, mais en effet c'est un bon exercice que vous vous êtes trouvez là pour débuter. Et après si vous allez plus loin dans l'apprentissage python, votre programme pourra évoluer, et s'enrichir d'une interface graphique Tkinter par exemple.

Discussions similaires

  1. Passer une fonction en paramètre ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2005, 16h51
  2. Réponses: 4
    Dernier message: 11/09/2005, 01h21
  3. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  4. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  5. Réponses: 3
    Dernier message: 17/06/2004, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo