2011-04-21 2 views
10

Dans Matlab, il est possible de créer function handles avec quelque chose commepoignée de fonction Python ala Matlab

[email protected](arglist)body 

De cette façon, vous pouvez créer des fonctions en déplacement sans avoir à créer M-fichiers.

Existe-t-il un moyen équivalent en Python de déclarer des fonctions et des variables dans une ligne et de les appeler plus tard?

+1

Êtes-vous à la recherche de 'lambda'? Quel est le problème avec 'def'? –

Répondre

15

fonctions lambda Python sont un peu similaires:

In [1]: fn = lambda x: x**2 + 3*x - 4 

In [2]: fn(3) 
Out[2]: 14 

Cependant, vous pouvez obtenir des effets similaires en définissant simplement fn() en fonction:

In [1]: def fn(x): 
    ...: return x**2 + 3*x - 4 
    ...: 

In [2]: fn(4) 
Out[2]: 24 

fonctions "normales" (par opposition à lambda) sont plus flexibles en ce sens qu'ils permettent des instructions conditionnelles, des boucles, etc.

Il n'est pas nécessaire de placer des fonctions dans des fichiers dédiés ou tout autre chose de cette nature. Enfin, les fonctions en Python sont des objets de première classe. Cela signifie, entre autres, que vous pouvez les passer en arguments dans d'autres fonctions. Ceci s'applique aux deux types de fonctions indiqués ci-dessus.

+1

Les handles de fonction peuvent également être transmis en tant qu'arguments dans Matlab. – MatlabSorter

+1

@MatlabSorter: En python, une fonction (ou un lambda) peut être passée en argument à une autre fonction. Vous n'avez pas besoin d'un "handle", vous passez simplement la fonction elle-même. –

8

Ce n'est pas tout à fait la réponse complète. Dans Matlab, on peut faire un fichier appelé funct.m:

function funct(a,b) 
    disp(a*b) 
end 

Sur la ligne de commande:

>> funct(2,3) 
    6 

Ensuite, on peut créer une poignée de fonction telle que:

>> myfunct = @(b)funct(10,b)) 

Alors on peut faire:

>> myfunct(3) 
     30 

Une année complète wer dirait comment faire cela en python.

Voici comment faire:

def funct(a,b): 
    print(a*b) 

Puis:

myfunct = lambda b: funct(10,b) 

Enfin:

>>> myfunct(3) 
30 
0

Turns out il y a quelque chose qui va tout le chemin du retour à 2,5 appelé function partials qui sont à peu près l'analogie exacte aux poignées de fonction.

from functools import partial 
def myfun(*args, first="first default", second="second default", third="third default"): 
    for arg in args: 
     print(arg) 
    print("first: " + str(first)) 
    print("second: " + str(second)) 
    print("third: " + str(third)) 

mypart = partial(myfun, 1, 2, 3, first="partial first") 

mypart(4, 5, second="new second") 
1 
2 
3 
4 
5 
first: partial first 
second: new second 
third: third default 
Questions connexes