Utilisation de lambda (lors du passage d'une fonction comme argument d'une autre fonction)

Si vous souhaitez transmettre des fonctions avec des nombres d'arguments différents comme arguments de la même fonction, vous pouvez utiliser lambda.

Supposons que vous ayez les sources suivantes:


#Fonction sans argument
def print_type1():
    print('print_Type de traitement1 ...')
    return '[print_type1]'

def print_com(func):
    print('=== print_Traitement com ...===')
    rtn = func()  #Lors de l'utilisation, il n'y a pas d'argument dans la fonction à passer
    print('{}A été traité.'.format(rtn))
    print()

print_com(print_type1)  #Fonctionne bien

Vous voudrez peut-être attribuer une fonction avec un argument à print_com plus tard. Exemple:

#Fonction avec argument
def print_type2(day):
    print('print_Type de traitement2 ...')
    print('day: {}'.format(str(day)))
    return "print_type2"

La méthode d'affectation suivante échouera.

print_com(print_type2)  # →[missing 1 required positional argument: 'day']J'obtiens l'erreur"
print_com(print_type2(15))  # →['str' object is not callable]J'obtiens l'erreur

Donc, si vous le changez en une fonction sans argument avec lambda et que vous le passez ensuite, cela fonctionnera.

day = 15
print_com(lambda: print_type2(day))

Vous pouvez également utiliser une partie des functools.

from functools import partial
day = 15
print_com(partial(print_type2, day=day))

Si vous voulez le résoudre vous-même, vous pouvez le faire en définissant la fonction à l'intérieur de la fonction.

#Fonction interne
def print_type3(day):
    def print_type3_inner():
        print('print_Type de traitement3 ...')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner

day = 15
print_com(print_type3(day))

lambda01.py


from functools import partial

#Fonction sans argument
def print_type1():
    print('print_Type de traitement1 ...')
    return '[print_type1]'


def print_com(func):
    print('=== print_Traitement com ...===')
    rtn = func()  #Lors de l'utilisation, il n'y a pas d'argument dans la fonction à passer
    print('{}A été traité.'.format(rtn))
    print()


#Fonction avec argument
def print_type2(day):
    print('print_Type de traitement2 ...')
    print('day: {}'.format(str(day)))
    return "print_type2"


#Fonction interne
def print_type3(day):
    def print_type3_inner():
        print('print_Type de traitement3 ...')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner


print_com(print_type1)  #Fonctionne bien

#↓ Une telle méthode d'attribution échouera
# print_com(print_type2)  # →[missing 1 required positional argument: 'day']J'obtiens l'erreur

# print_com(print_type2(15))  # →['str' object is not callable]J'obtiens l'erreur

#Si vous le changez en une fonction sans argument avec lambda et que vous le passez ensuite, cela fonctionnera.
day = 15
print_com(lambda: print_type2(day))

#Ou
day += 1
print_com(partial(print_type2, day=day))

day += 1
print_com(print_type3(day))

Résultat d'exécution === Traitement print_com ... === Traitement print_type1 ... Traité [print_type1].

=== Traitement print_com ... === Traitement print_type2 ... day: 15 Type d'impression traité2.

=== Traitement print_com ... === Traitement print_type2 ... day: 16 Type d'impression traité2.

=== Traitement print_com ... === Traitement print_type3 ... day: 17 Type d'impression traité3.

Recommended Posts

Utilisation de lambda (lors du passage d'une fonction comme argument d'une autre fonction)
Format lors du passage d'une longue chaîne comme argument de python
Une simple différence lors du passage d'un pointeur comme argument de fonction
Python> fonction> Exemple de prise de fonction comme argument> map (lambda x: 2 ** x, [1, 2, 3]) / locals () ['myprint'] (3.1415, 2.718)
Remarque: Signification de spécifier uniquement * (astérisque) comme argument dans la définition de fonction de Python
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
Précautions lors de l'utilisation d'une liste ou d'un dictionnaire comme argument par défaut
Si vous donnez une liste avec l'argument par défaut de la fonction ...
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
[python] Fonction de rappel (passez la fonction en argument)
[Python] Faire de la fonction une fonction lambda
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
[PyTorch] Pourquoi vous pouvez traiter une instance de CrossEntropyLoss () comme une fonction
Ne spécifiez pas un objet mutable (type de liste, type de dictionnaire, etc.) comme valeur initiale de l'argument de fonction de python.