Vraag Python-functies met meerdere parameterhaakjes


Ik heb problemen gehad om te begrijpen wat h(a)(b) middelen. Ik had nog nooit iemand eerder gezien en ik kon een functie op deze manier niet verklaren:

def f (a)(b):
    return a(b)

Toen ik probeerde te doen def f (a, b):, het werkte ook niet. Wat doen deze functies do? Hoe kan ik ze verklaren? En tenslotte, wat is het verschil tussen f(a, b)en f(a)(b)?


24
2018-03-18 13:10


oorsprong


antwoorden:


Functies met meerdere parameterhaakjes bestaan ​​niet, zoals je hebt gezien toen je probeerde er een te definiëren. Er zijn echter functies die (andere) functies teruggeven:

def func(a):
    def func2(b):
        return a + b
    return func2

Nu, wanneer u belt func() het geeft het innerlijke terug func2 functie:

>>> func2 = func(1)  # You don't have to call it func2 here
>>> func2(2)
3

Maar als je de innerlijke functie later niet meer nodig hebt, dan is het niet nodig om het op te slaan in een variabele en kun je ze gewoon achter elkaar noemen:

>>> func(1)(2)   # func(1) returns func2 which is then called with (2)
3

Dit is een veel voorkomend idioom bij het definiëren van decorateurs die argumenten gebruiken.


Merk dat opbellen func() maakt altijd een nieuwe innerlijke functie, ook al worden ze allemaal genoemd func2 binnen de definitie van onze func:

>>> f1 = func(1)
>>> f2 = func(1)
>>> f1(1), f2(1)
(2, 2)
>>> f1 is f2
False

En tenslotte, wat is het verschil tussen f(a, b)en f(a)(b)?

Het moet nu duidelijk zijn dat je weet wat f(a)(b) doet, maar om samen te vatten:

  • f(a, b) calls f met twee parameters a en b
  • f(a)(b) calls f met één parameter a, die vervolgens een andere functie retourneert, die vervolgens met één parameter wordt aangeroepen b

56
2018-03-18 13:12



f(a)(b) betekent gewoon dat de uitdrukking f(a) geeft een waarde terug die zelf opvraagbaar is. Het is een korte vorm van

g = f(a)
g(b)

Wellicht is het prettiger om een ​​paar overtollige haakjes toe te voegen om te benadrukken dat dit geen enkele syntactische constructie is.

(f(a))(b)  # f(a) is evaluated first, then the result is applied to b

Het is precies analoog aan dezelfde verdubbeling van vierkante haken voor het indexeren van geneste woordenboeken.

d1[x][y]

is gelijk aan

d2 = d1[x]
d2[y]

15
2018-03-18 13:26



Laten we zeggen dat we een expressie hebben zoals

f(a)(b)

dan, f(a) retourneert een functie zelf die wordt aangeroepen met argument b. Bekijk het volgende voorbeeld

def f(a):
   def g(b):
      return a * b
   return g

Dan f(5)(4) evalueert naar 5 * 4, sinds f(5) geeft een functie terug die in feite is

def g(b):
   return 5 * b

Je zou nu dingen als deze kunnen doen

mult_by_5 = f(5)
[mult_by_5(x) for x in range(10)]

Laten we fancy zijn, hoe zit het met meer geneste functies ?:

def f(a):
  def g(b):
    def h(c):
      return a * b *c
    return h
  return g
f(2)(3)(4) # 24

4
2018-03-18 13:13