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 :

Comment passer les paramètres par variable à une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut Comment passer les paramètres par variable à une fonction
    Bonjour,

    N'est-il pas possible comme en C de passer à une fonction l'adresse d'une variable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def modif (uneVariable):
        uneVariable += 10 
     
     
    maVariable1 = 1
    modif(maVariable1)
     
    maVariable2 = 2
    modif(maVariable2)

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

    Citation Envoyé par tm68780 Voir le message
    N'est-il pas possible comme en C de passer à une fonction l'adresse d'une variable ?
    Avec Python, vous pouvez passer un objet qui sera (ou pas) mutable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def f(x):
    ...     x += ['x']
    ...
    >>> L = [1]
    >>> f(L)
    >>> L
    [1, 'x']
    >>>
    et si la variable n'est pas mutable, on doit assigner un autre objet à la variable (qui a ce moment là devra être globale et non un paramètre de la fonction)

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Merci pour la réponse.

    Suivant ce code et si je comprends bien une variable du type liste est mutable ce qui n'est pas le cas du type int.

    Dans ce cas il faut assigner un autre objet à la variable --> ce qui veux dire que la variable change de nom ?
    Or dans mon cas le nom je ne peux que le passer en paramètre.

    J’appelle ma fonction pour traiter la variable1 ou la variable2.
    Et je dois récupérer mes 2 variables sans utiliser de "return"

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Par une fonction j’effectue un calcul dans lequel intervient la valeur d’une variableX
    A l’issu cette variableX prend la valeur calculée.
    Dans la fonction Je pourrais faire un test pour savoir quelle variable utiliser, mais je ne le souhaite pas pour raccourcir le temps de traitement (ce qui est relatif car la parade pourrait coûter plus de temps).
    De plus je ne peux pas utiliser de return car l’ensemble doit se faire dans la fonction.

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Cest bon c'est compris :-)
    Merci encore


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def f(x):
        x[0] *= 2
     
    maVar1 = 1
    L1 = [maVar1]
    f(L1)
     
     
    maVar2 = 2
    L2 = [2]  
    f(L2)
     
    print (L1)
    print (L2)

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

    Je ne sais pas ce que vous avez compris mais il manque des lignes pour modifier maVar...
    Dans les tutos vous apprenez à écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def f():
          global maVar
          maVar += 1
     
    maVar = 0
    f()
    print(maVar)
    ou plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(v):
          return v + 1
     
    maVar = 1
    maVar = f(maVar)
    Et s'il ne vous est pas possible d'utiliser l'un ou l'autre c'est que vous êtes en train de faire un exercice et non "programmer".

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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tm68780 Voir le message
    N'est-il pas possible comme en C de passer à une fonction l'adresse d'une variable ?
    Non. Mais en fait c'est parce que, contrairement au C, en Python c'est totalement inutile.

    En effet, en C une fonction ne peut retourner qu'une chose simple. Et donc une fonction qui devrait modifier plusieurs variables ne pourra pas retourner plusieurs valeurs à la fois. On est alors obligé de passer par un mécanisme où la fonction va modifier directement les variables d'origine et pour ce, doit recevoir leurs adresses.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void modif(int *a, int *b, int n) {
    	(*a)=n;
    	(*b)=n*2;
    }
     
    int main() {
    	int x, y;
    	modif(&x, &y, 5);
    	printf("x=%d, y=%d\n", x, y);
    }

    Python, lui, peut retourner directement plusieurs trucs en passant par le tuple, qu'on peut éclater par unpacking directement dans plusieurs variables
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def modif(n):
    	return (n, n*2)
    # modif()
     
    (x, y)=modif(5)
    print("x=%d, y=%d" % (x, y))

    La fonction n'a plus besoin d'aller modifier directement x et y puisqu'on peut les remplir par les valeurs qu'elle renvoie. Elle n'a donc pas besoin de recevoir leurs adresses.

    Citation Envoyé par tm68780 Voir le message
    Par une fonction j’effectue un calcul dans lequel intervient la valeur d’une variableX
    A l’issu cette variableX prend la valeur calculée.
    Jusque là...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def fonction(variableX):
    	variableX=calcul

    Citation Envoyé par tm68780 Voir le message
    Dans la fonction Je pourrais faire un test pour savoir quelle variable utiliser, mais je ne le souhaite pas pour raccourcir le temps de traitement (ce qui est relatif car la parade pourrait coûter plus de temps).
    Ou simplement affecter la variable de ton choix au moment de ton choix
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=fonction(a)
    b=fonction(b)

    Citation Envoyé par tm68780 Voir le message
    De plus je ne peux pas utiliser de return car l’ensemble doit se faire dans la fonction.
    Ok là tes raisons m'échappent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Bonjour,

    Je ne me fixe pas de contraintes mais par rapport à tous les choix précédents je pense que ce n'est pas judicieux.
    Ce serait long de tout expliquer clairement, mais cette dernière question est liée à une autre discussion "gestion interruptions"

    J’ai parmi d’autres 2 possibilités :
    Comme je traite 2 interruptions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GPIO.add_event_detect(11, GPIO.FALLING, callback=sauveVal,bouncetime=150)
    GPIO.add_event_detect(12, GPIO.FALLING, callback=sauveVal,bouncetime=150)
    Je peux :
    Appeler un même callback où je teste quel pilote est concerné ou alors
    Appeler 2 callback distincts adaptés à chaque pilote

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GPIO.add_event_detect(11, GPIO.FALLING, callback=sauveVal1,bouncetime=150)
    GPIO.add_event_detect(12, GPIO.FALLING, callback=sauveVal2,bouncetime=150)

    J’ai choisi un seul Callback et de ce fait, je dois faire passer des paramètres…
    Le return d’une valeur dans le callback est à mon sens pas adapté étant donné que tous les autres résultats sont empilés pour traitement ultérieur.

    Pour revenir à la question, le code suivant fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    def f(x):
        x[0] *= 2
     
     
    maVar1 = 2
    L1 = [maVar1]
    f(L1)
    maVar1=(L1[0])
     
    maVar2 = 4
    L2 = [maVar2]  
    f(L2)
    maVar2=(L2[0])
     
    print (L1)
    print (L2)
    print (maVar1)
    print (maVar2)

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

    Citation Envoyé par tm68780 Voir le message
    J’ai choisi un seul Callback et de ce fait, je dois faire passer des paramètres…
    Le return d’une valeur dans le callback est à mon sens pas adapté étant donné que tous les autres résultats sont empilés pour traitement ultérieur.
    Pour faire çà avec une seule fonction, il faut "fabriquer" une association entre fonction et donnée/état qui survive à l'appel de la fonction (pour le retrouver le coup d'après).

    C'est à çà que sert la POO.

    Avec Python, çà se met en oeuvre avec des class (et les fonctions sont alors des méthodes) ou des closures (des fonctions qui retournent des fonctions) comme dans l'exemple que je vous ai donné dans la discussion en question.

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

  10. #10
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Merci pour le retour

    J'ai encore beaucoup de chemin à parcourir, le peu de compétences acquises en programmation date de l'époque avant la POO.
    Pour l'instant il me faut du temps pour comprendre les exemples reçus.

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

    Citation Envoyé par tm68780 Voir le message
    Pour l'instant il me faut du temps pour comprendre les exemples reçus.
    Ouvrez un tuto: la programmation évènementielle s'apprend au chapitre "tkinter", c'est là qu'on se frotte aux callbacks et qu'on fait ses premiers pas en POO.

    Essentiellement parce qu'un GUI, c'est un tas d'objets qu'on va vouloir "factoriser" en classe pour usiner des objets aux comportements identiques (un tas de Button qui...).

    Ces notions là sont "compliquées": il faut du temps et des tas d'exercices pour que le cerveau apprenne à jouer avec.

    Si vous n'avez pas pris ce temps là, vous avez 2 soucis: le premier est que vous n'avez pas le bagage technique pour imaginer le type de solution à appliquer à un problème (vous ne savez même pas où chercher), le second est que si on vous donne du code, c'est juste incompréhensible et çà ne vous aide pas sauf à constater que vous avez des tas de choses à apprendre.

    Passer du temps dans un tuto est la seule solution (même si cela doit repousser de quelque temps votre envie de jouer avec des robots).

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

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par tm68780 Voir le message

    Je peux :
    Appeler un même callback où je teste quel pilote est concerné ou alors
    Appeler 2 callback distincts adaptés à chaque pilote

    [CODE]GPIO.add_event_detect(11, GPIO.FALLING, callback=sauveVal1,bouncetime=150)
    GPIO.add_
    dans l'autre sujet similaire j'ai donné un exemple de lambda, certes définies en dehors du GPIO.add_event_detect, mais il suffit de les intégrer.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2006, 08h23
  2. Réponses: 4
    Dernier message: 14/09/2006, 12h25
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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