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 :

[Débutant] lambda, random


Sujet :

Python

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut [Débutant] lambda, random
    Bonjour,

    Je dois effectuer quelques modifications d'un code Python pour l'adapter à mes besoins, mais je ne connais pas ce langage...

    Connaissant bien d'autres langages, j'arrive à peu près à comprendre ce qu'il se passe dans le code, mais j'ai un souci avec la ligne 11 du bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import os
    import random
    import sys
     
    class maClasse:
        def __init__(self, random = random.random, maxDay = 2):
        ....
     
    if __name__ == '__main__':
     
        determinist = lambda : 0.5
        maClasse(random=determinist)
    Votre aide serait la bienvenue.

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    determinist = lambda : 0.5
    Ceci signifie que "determinist" est une fonction qui retourne 0.5 et qui ne prend pas d'arguments.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Et à quoi ça sert, une fonction dont on connaît déjà le résultat ??

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Le but ici est de faire une 'démo'.

    Vous avez dans un premier temps votre classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class maClasse:
        def __init__(self, random=random.random, maxDay=2):
    Ici random=random.random donne la valeur par défaut si celle ci n'est pas spécifiée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import random
    >>> class maClasse:
    ...     def __init__(self, random=random.random, maxDay=2):
    ...         print random() # Notez les ()
    ... 
    >>> maClasse()
    0.282297211932
    <__main__.maClasse instance at 0xb77472cc>
    >>> r = random.random() # Notez les ()
    >>> r
    0.19404878348713073
    A partir de là si votre script complet est lancer tels-quel et si Python tombe sur un if __name__ == '__main__': il vas éxecuter le code qui suit, la 'démo'.

    Comme ce code contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        determinist = lambda : 0.5
        maClasse(random=determinist)
    La valeur par défaut de random dans la classe est remplacée par determinist, soit lambda : 0.5.
    Vous avez donc une démo avec pour valeur du return de la fonction random 0.5.

    La version épurée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import random
     
    class maClasse:
        def __init__(self, random=random.random):
            print(random()) #print(*) pour une compatibilité Python 2.x/3.x
     
    if __name__ == '__main__':
        test1 = maClasse(random=lambda: 0.5) # random = 0.5 < la fonction lambda
        test2 = maClasse() # random = random.random() < valeur par defaut
    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Pour résumer ce que dit PauseKawa (j’espère qu’il me pardonnera ), la fonction __init__ de maClasse s’attend à ce que son paramètre random soit une fonction (ou plus largement, un objet appelable –*d’où les parenthèses), donc tu ne peux pas lui passer une constante comme 0.5.

    L’astuce est de passer en paramètre une fonction qui retourne toujours cette valeur constante*!
    (Le mot-clé lambda définit une sorte de fonction simplifiée et anonyme, en python, va voir la doc de python pour plus de détails).

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    A lire Default Argument Values en complément.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par mont29 Voir le message
    j’espère qu’il me pardonnera
    Pourquoi donc ? C'est une bonne intervention: Je ne voulais pas aller trop loin dans mon explication mais
    Citation Envoyé par mont29 Voir le message
    la fonction __init__ de maClasse s’attend à ce que son paramètre random soit une fonction (ou plus largement, un objet appelable –*d’où les parenthèses)
    comme la question porte en fait sur la valeur par défaut et les callables c'est bien d'introduire la notion ('un objet appelable') au lieu de mes Notez les () ésotériques.

    @oodini: Une petite note sur le nommage.
    Lorsque vous écrivez random=random.random cela implique que vous n'avez pas besoin du module random dans maClasse. En effet la locales random deviens soit random du module random, soit la fonction passée en paramètre (ici maClasse(random=determinist)).
    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
    >>> class maClasse:
    ...     def __init__(self, random=random.random):
    ...         print(random())
    ... 
    >>> maClasse()
    0.328800963927
    <__main__.maClasse instance at 0xb787bc6c>
    >>> class maClasse:
    ...     def __init__(self, random=random.random):
    ...         r = random.random()
    ...         print(r)
    ... 
    >>> maClasse()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in __init__
    AttributeError: 'builtin_function_or_method' object has no attribute 'random'
    >>> maClasse(lambda: 0.5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in __init__
    AttributeError: 'function' object has no attribute 'random'
    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. [Débutant] Random
    Par khaled87 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 07/06/2013, 21h18
  2. Réponses: 9
    Dernier message: 09/01/2010, 04h52
  3. [Débutant] Paramètres de la fonction random
    Par elliotg dans le forum Langage
    Réponses: 5
    Dernier message: 01/11/2008, 20h19
  4. [TPW][Débutant] Randomize et random
    Par dimi2 dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 23/04/2008, 14h59
  5. [Débutant] Random : se baser sur l'horloge interne
    Par nanath02 dans le forum Langage
    Réponses: 1
    Dernier message: 19/03/2007, 14h38

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