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 :

simplifier un code : appel de fonctions d'une liste


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut simplifier un code : appel de fonctions d'une liste
    Bonsoir,
    Voici un extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tensions = [tension_0,tension_1,tension_2,tension_3,tension_4,tension_5,\
    tension_6,tension_7,tension_8,tension_9]
     
    for i in range(10):
        tension=tensions[i]
    Les tension_i sont des fonctions que je souhaite traiter par d'autres fonctions.
    N'y aurait-il pas une façon de faire plus compacte et qui m'éviterait de taper tout dans la liste ?
    A bientôt.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 : 21 741
    Par défaut
    Salut,

    Peut être une chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tensions = [ globals()['tension_%d' % ix] for ix in range(10) ]
    for fct in tensions:
         ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    Bonsoir, (python 3.5)

    En variables locales ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tensions =  [['tension_%d' % ix] for ix in range(10)]
    print(tensions)
    Par contre problème avec globals() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tensions =  [ globals()['tension_%d' % ix] for ix in range(10)]
    KeyError: 'tension_0'

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par temabul Voir le message
    Bonsoir, (python 3.5)

    Par contre problème avec globals() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tensions =  [ globals()['tension_%d' % ix] for ix in range(10)]
    KeyError: 'tension_0'
    Tu les as réellement créées les fonctions ?

  5. #5
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par temabul Voir le message
    En variables locales ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tensions =  [['tension_%d' % ix] for ix in range(10)]
    print(tensions)
    Bonjour,
    L'objectif est de créer une liste de fonctions, pas une liste de chaînes de caractères.
    Ici, ce sont juste des chaînes qui sont créées.

    Clodion

  6. #6
    Membre expérimenté Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Par défaut

    Si tu veux créer une liste de fonction utilises plutôt des dictionnaires;
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_liste_de_fonctions = {'maFonction1': fonction1, 'maFonction2': fonction2 ..., 'maFonctionN': fonctionN}
    ainsi chaque fois que tu voudras utiliser une fonction de ton dictionnaire tu pourras faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_liste_de_fonction['maFonction1']()
    pour voir ta fonction s'exécuter.
    J'espère ne pas être un HS

  7. #7
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci à vous.
    La solution de wiztricks fonctionne parfaitement.
    Pour un dictionnaire, j'y avais pensé mais je ne maîtrise pas vraiment, donc je préfère m'abstenir pour l'instant...
    A bientôt.

  8. #8
    Membre averti Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Tu les as réellement créées les fonctions ?
    Excusez pour la gêne. Ça y est, j'ai compris.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 : 21 741
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Pour un dictionnaire, j'y avais pensé mais je ne maîtrise pas vraiment, donc je préfère m'abstenir pour l'instant...
    globals() est déjà dictionnaire. Et lorsqu'on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def tension_1():
          pass
    On construit l'objet fonction et on l'assigne à la clé "tension_1" dans globals().

    Il pourrait être utile de fabriquer ces fonctions dans une class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class tensions:
         def tension_1():
             pass
    cela éviterait de polluer le dictionnaire "globals()" (en remplissant le dictionnaire d'une class).
    Dans ce cas, on pourra utiliser getattr pour récupérer les objets suivant leurs noms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ix in range(10):
         fct = getattr(tension, 'tension_%d' % ix)
         ...
    note: pousser ces fonctions dans un module à part ferait de même... on remplirait le globals()dictionnaire de ce module là plutôt que globals() - dictionnaire du module "courant". "class" et "module" permettent en outre de définir l'ensemble des fonctions "intéressantes": plus besoin de leur donner un nom bien construit ('tension_%d") pour accéder à chaque fonction. On peut même utiliser un OrderedDict (il faut, dans ce cas, passer par une meta class) comme dictionnaire de la classe. Cela permet de conserver la séquence (0, 1, 2, ....) via l'ordre de déclaration de chaque fonction.

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

  10. #10
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci wiztricks, je vais essayer de creuser dans cette voie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  2. Appel de fonction dans une page JSP
    Par Addouna dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/03/2006, 12h56
  3. Appel de fonction d'une DLL en TANSAC SQL
    Par sylvain114d dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 10h21
  4. Réponses: 4
    Dernier message: 23/11/2005, 09h27
  5. Appel aux fonctions d'une DLL externe ??
    Par Fbartolo dans le forum Access
    Réponses: 7
    Dernier message: 21/11/2005, 17h54

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