[PYTHON] Verwendung von Lambda (beim Übergeben einer Funktion als Argument einer anderen Funktion)

Wenn Sie Funktionen mit unterschiedlicher Anzahl von Argumenten als Argumente derselben Funktion übergeben möchten, können Sie Lambda verwenden.

Angenommen, Sie haben die folgenden Quellen:


#Argumentlose Funktion
def print_type1():
    print('print_Verarbeitungstyp1 ...')
    return '[print_type1]'

def print_com(func):
    print('=== print_Verarbeitungskom ...===')
    rtn = func()  #Bei der Verwendung gibt es kein Argument in der zu übergebenden Funktion
    print('{}Wurde verarbeitet.'.format(rtn))
    print()

print_com(print_type1)  #Funktioniert gut

Möglicherweise möchten Sie print_com später eine Funktion mit einem Argument zuweisen. Beispiel:

#Funktion mit Argument
def print_type2(day):
    print('print_Verarbeitungstyp2 ...')
    print('day: {}'.format(str(day)))
    return "print_type2"

Die folgende Zuweisungsmethode schlägt fehl.

print_com(print_type2)  # →[missing 1 required positional argument: 'day']Ich bekomme den Fehler"
print_com(print_type2(15))  # →['str' object is not callable]Ich bekomme den Fehler

Wenn Sie es also in eine Funktion ohne Argumente mit Lambda ändern und es dann übergeben, funktioniert es.

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

Alternativ können Sie einen Teil der Funktionswerkzeuge verwenden.

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

Wenn Sie es selbst lösen möchten, können Sie dies tun, indem Sie die Funktion innerhalb der Funktion definieren.

#Interne Funktion
def print_type3(day):
    def print_type3_inner():
        print('print_Verarbeitungstyp3 ...')
        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

#Argumentlose Funktion
def print_type1():
    print('print_Verarbeitungstyp1 ...')
    return '[print_type1]'


def print_com(func):
    print('=== print_Verarbeitungskom ...===')
    rtn = func()  #Bei der Verwendung gibt es kein Argument in der zu übergebenden Funktion
    print('{}Wurde verarbeitet.'.format(rtn))
    print()


#Funktion mit Argument
def print_type2(day):
    print('print_Verarbeitungstyp2 ...')
    print('day: {}'.format(str(day)))
    return "print_type2"


#Interne Funktion
def print_type3(day):
    def print_type3_inner():
        print('print_Verarbeitungstyp3 ...')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner


print_com(print_type1)  #Funktioniert gut

#↓ Eine solche Zuweisungsmethode schlägt fehl
# print_com(print_type2)  # →[missing 1 required positional argument: 'day']Ich bekomme den Fehler

# print_com(print_type2(15))  # →['str' object is not callable]Ich bekomme den Fehler

#Wenn Sie es in eine Funktion ohne Argumente mit Lambda ändern und es dann übergeben, funktioniert es.
day = 15
print_com(lambda: print_type2(day))

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

day += 1
print_com(print_type3(day))

Ausführungsergebnis === print_com wird verarbeitet ... === Verarbeitung print_type1 ... Verarbeitet [print_type1].

=== print_com wird verarbeitet ... === Verarbeitung von print_type2 ... day: 15 Verarbeiteter print_type2.

=== print_com wird verarbeitet ... === Verarbeitung von print_type2 ... day: 16 Verarbeiteter print_type2.

=== print_com wird verarbeitet ... === Verarbeitung print_type3 ... day: 17 Verarbeiteter print_type3.

Recommended Posts

Verwendung von Lambda (beim Übergeben einer Funktion als Argument einer anderen Funktion)
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
Ein einfacher Unterschied bei der Übergabe eines Zeigers als Funktionsargument
Python> Funktion> Beispiel für die Übernahme der Funktion als Argument> Karte (Lambda x: 2 ** x, [1, 2, 3]) / local () ['myprint'] (3.1415, 2.718)
Hinweis: Bedeutung der Angabe von nur * (Sternchen) als Argument in der Funktionsdefinition von Python
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Vorsichtsmaßnahmen bei Verwendung einer Liste oder eines Wörterbuchs als Standardargument
Wenn Sie eine Liste mit dem Standardargument der Funktion angeben ...
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
[Python] Rückruffunktion (Funktion als Argument übergeben)
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
[PyTorch] Warum Sie eine Instanz von CrossEntropyLoss () wie eine Funktion behandeln können
Geben Sie kein veränderbares Objekt (Listentyp, Wörterbuchtyp usw.) als Anfangswert des Funktionsarguments von Python an.