2017-07-09 2 views
1

Lesen Sie einfach die Python Docs insbesondere this Seite, in Bezug auf attrgetter und itemgetter.Was ist die Verwendung von einem Def in einer Funktion?

Ich habe Mühe, die Verwendung der Verwendung von def und return in den Codebeispielen zu verstehen. Nicht die Verwendung dieser Funktionen.

Es scheint wie ein lamdba, aber ich weiß nicht, wie man es interpretiert.

EDIT


Ich denke, es angeklickt einfach. Der attrgetter ist wie ein Konstruktor für die Funktion resolve_attr. Das war ein wenig verwirrend, da ich normalerweise erwarten würde, dass der Code für ein def zwischen dem def und dem return liegt. Der Code auf der Rückkehr ist wie ein Lambda. Um der Verwirrung hinzuzufügen, ist das Argument ojb das an das zurückgegebene Objekt übergebene Argument. Arhhhhh .....


Was muss ich dafür wissen, um Sinn zu machen?

Dies ist der Code Beispiel beziehe ich mich auf:

def attrgetter(*items): 
    if any(not isinstance(item, str) for item in items): 
     raise TypeError('attribute name must be a string') 
    if len(items) == 1: 
     attr = items[0] 
     def g(obj): #What is this 
      return resolve_attr(obj, attr) 
    else: 
     def g(obj):#And this? 
      return tuple(resolve_attr(obj, attr) for attr in items) 
    return g 

def resolve_attr(obj, attr): 
    for name in attr.split("."): 
     obj = getattr(obj, name) 
    return obj 
+2

Suchen Sie nach "Funktionen höherer Ordnung". Dies sind Funktionen, die entweder Funktionen als Argumente und/oder Return-Funktionen übernehmen. Dies ist ein Beispiel für eine Funktionsfabrik, ein allgemeines Muster. –

+0

Siehe [hier] (https://en.m.wikipedia.org/wiki/Higher-order_function). Die andere Idee, die Sie beachten sollten, ist, dass Python [First Class-Funktionen] (https://en.m.wikipedia.org/wiki/First-class_function) hat. Diese Ideen sind dem [funktionalen Programmierparadigma] (https://en.m.wikipedia.org/wiki/Functional_programming) gemeinsam –

+0

yeah ta, lese gerade –

Antwort

3

def ist das Schlüsselwort, eine Funktion zu definieren. Diese

sind nur Funktionen in einer anderen Funktion definiert attrgetter()

Das ist, warum Sie mehrere haben return innerhalb attrgetter()

g sieht aus wie lambda weil attrgetter() kehrt eine Funktion, und nicht das Ergebnis direkt.

g könnte tatsächlich durch eine Lambda-Deklaration ersetzt werden.

3

In Python sind Funktionen wie normale Objekte. Sie können sie weitergeben und (wie im obigen Beispiel) von anderen Funktionen zurückgeben.

Die Beispielfunktion gibt eine andere Funktion als Rückgabewert zurück. Dazu definiert man eine Funktion (das ist die def g(ojb): Zeile) und gibt sie dann einfach zurück.

Sie können dies tun, weil in Python - eine Funktion ist wie jedes andere Objekt.

Verwandte Themen