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 une expression en argument à une fonction sous python ?


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Comment passer une expression en argument à une fonction sous python ?
    Bonjour,
    Voici un programme, assez naif car je suis débutant.
    Il s'agit de l'aire sous une courbe avec la méthode monté carlo et avec la méthode des rectangles.
    Est-ce possible de passer l'expression exp(-x**2) en argument à la fonction f ?
    Comme ça on peut facilement changer d'expression au lieu d'aller dans le corps du programme et supprimer puis changer.

    Merci d'avance.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    print("Méthode Monté Carlo")
    from math import*
    from importlib import*
    from random import *
     
    def f(a,b,n):
     s=0
      print("s=aire sous la courbe")
     for i in range(0,n):
         x=random()*a
         y=random()*b
         if y<=exp(-x**2):
         #if y<=exp(-x**2):
         #if y<=x**2:
            s=s+1
     print("s=",a*b*s/n)       
     
     print("Méthode des rectangles") 
     x=0
     s=0
     while x<=a:
           s=s+0.0001*exp(-x**2) 
           #s=s+0.0001*exp(-x**2)
           #s=s+0.0001*(x**2)
           x=x+0.0001
     print("s=",s)

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Je dirai en passant une fonction lambda en argument , ou une str à évaluer .

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    bonjour

    Oui, on peut passer une fonction en paramètre
    function lambda ou function classique, cela ne change rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import math
     
    def truc(a, func):
        y = a*2
        result = func(y)
        print(a, "->",  result)
        return result
     
     
    def moncalcul_interne(param):
        return math.pow(-param**2, 10)
     
    x = truc(10, lambda x : x*2)
    x = truc(10, moncalcul_interne)
    $moi= ( !== ) ? : ;

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    Citation Envoyé par kadexcel
    Est-ce possible de passer l'expression exp(-x**2) en argument à la fonction f ?
    C'est quoi l'objectif ? Est-ce que c'est demander à l'utilisateur de donner sous forme de chaîne de caractères le contenu de l'expression ?

    Ou juste modifier dans le code l'expression de la fonction ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par kadexcel Voir le message
    Comme ça on peut facilement changer d'expression au lieu d'aller dans le corps du programme et supprimer puis changer.
    Bien sûr, c'est justement le but: rendre une fonction modulable. Et c'est possible car une fonction c'est aussi un élément manipulable, donc qu'on peut passer à une autre.

    Un exemple analogue à celui de papajoker...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def carre(n): return n**2
     
    def cube(n): return n**3
     
    def calcul(n, fct):
    	for i in range(n):
    		print(i, fct(i))
     
    calcul(3, carre)
    calcul(4, cube)

    Ca fonctionne à condition que les fonctions à traiter aient la même signature (même nombre d'arguments de même type).
    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]

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def carre(n): return n**2
     
    def cube(n): return n**3
     
    def calcul(n, fct):
    	for i in range(n):
    		print(i, fct(i))
     
    calcul(3, carre)
    calcul(4, cube)
    rien à voir avec le sujet, juste pour le fun, un peu de curryfication ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    puissance = lambda exp:lambda n: exp and n * puissance(exp-1)(n) or 1
     
    carre = puissance(2)
    cube = puissance(3)
     
    print(carre(12))
    # ~ 144
    print(cube(5))
    # ~ 125

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci pour les réponses mais je n'ai pas bien compris.
    Voilà en plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from math import*
    from importlib import*
    from random import *
    def fonc( expression ,n,a,b )
    s=0
     
    for i in range(0,n):
         x=random()*2
         y=random()*exp(-2)
         if y<=exp(-x**2):
            s=s+1
     print("s=",2*exp(-2)*s/n)
    Je voulais à partir de la console passer à la fonction fonc, la fonction f(x)=exp(-x**2) et les paramètres n,a,b.
    >>>fonc(exp(-x**2), 10000,2,1).
    Mais ça ne marche pas !

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from math import*
    from importlib import*
    from random import *
    def fonc( expression ,n,a,b ):
        s=0
     
        for i in range(0,n):
            x=random()*2
            y=random()*exp(-2)
            if y<=eval(expression):
                s=s+1
                print("s=",2*exp(-2)*s/n)
     
    fonc("exp(-x**2)", 10000,2,1)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from math import*
    from importlib import*
    from random import *
    def fonc( expression ,n,a,b ):
        s=0
     
        for i in range(0,n):
            x=random()*2
            y=random()*exp(-2)
            if y<=expression(x):
                s=s+1
                print("s=",2*exp(-2)*s/n)
     
    fonc(lambda x:exp(-x**2), 10000,2,1)
    La seconde méthode étant la plus souple .

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    ça me fait penser au calcul symbolique et il y a un module pour Sympy https://docs.sympy.org/latest/index.html

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par josmiley Voir le message
    rien à voir avec le sujet, juste pour le fun, un peu de curryfication ...
    Euh oui effectivement super fun. Essaye quand-même de penser au pauvre kadexcel quand il va tomber dessus...


    Citation Envoyé par kadexcel Voir le message
    Merci pour les réponses mais je n'ai pas bien compris.
    Voilà en plus simple:Je voulais à partir de la console passer à la fonction fonc, la fonction f(x)=exp(-x**2) et les paramètres n,a,b.
    >>>fonc(exp(-x**2), 10000,2,1).
    Mais ça ne marche pas !
    Non mais fais un effort aussi. On te donne des exemples, lis les au-moins !!! Par ailleurs les paramètres "a" et "b" ne sont même pas utilisés dans ton essai. On se demande alors à quoi ils servent...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import math
    def fct(n): return -math.exp((-n)**2)
     
    def calcul(n, fct):
    	for i in range(n):
    		print(i, fct(i))
     
    calcul(4, fct)

    Citation Envoyé par josmiley Voir le message
    La seconde méthode étant la plus souple .
    Et la moins dangereuse (parce qu'aller conseiller du eval...)
    Attention je viens de me rendre compte d'un truc: le moins unaire n'est pas prioritaire sur la puissance (-2 ** 2 donne -4). Penses-y pour ton exp(-x**2)
    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]

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Je vous remercie tous très bien, ça marche.

    Pour Sve@r
    J'ai bien utilisé les paramètres 'a' et 'b' dans mon premier message.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kadexcel Voir le message
    Pour Sve@r
    J'ai bien utilisé les paramètres 'a' et 'b' dans mon premier message.
    Dans ton premier certes... mais pas dans le code du message #8. Or c'est le dernier code qui compte (puisque chaque code montré est censé prendre en considération les réponses faites donc chaque code est censé améliorer le précédent) donc c'est de lui dont je parle.
    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]

Discussions similaires

  1. Comment arrêter une fonction sous C# Winforms
    Par speedcristal dans le forum C#
    Réponses: 6
    Dernier message: 17/07/2020, 21h14
  2. [Python 3.X] executer un exe (tel une fonction) sous python
    Par raph_prog dans le forum Général Python
    Réponses: 10
    Dernier message: 05/10/2017, 14h03
  3. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  4. Comment passer un tableau en argument de fonction
    Par Winnyls dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2009, 17h36
  5. Comment passer une fonction en argument
    Par Pades75 dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h34

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