Дескриптор функции Python аля Matlab - PullRequest
10 голосов
/ 21 апреля 2011

В MATLAB можно создавать function handles с чем-то вроде

myfun=@(arglist)body

Таким образом, вы можете создавать функции на ходу, не создавая M-файлы.

Есть ли в Python эквивалентный способ объявления функций и переменных в одной строке и их последующего вызова?

Ответы [ 3 ]

15 голосов
/ 21 апреля 2011

Лямбда-функции Python несколько похожи:

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

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

Однако вы можете добиться аналогичных эффектов, просто определив fn() как функцию:

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

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

«Нормальные» (в отличие от лямбда) функции более гибки в том, что они допускают условные операторы, циклы и т. Д.

Нет необходимости размещать функции внутри выделенных файлов или чего-либо подобного.

Наконец, функции в Python являются первоклассными объектами. Это означает, среди прочего, что вы можете передавать их в качестве аргументов в другие функции. Это относится к обоим типам функций, показанным выше.

10 голосов
/ 08 июня 2012

Это не совсем полный ответ. В Matlab можно создать файл с именем funct.m:

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

В командной строке:

>> funct(2,3)
     6

Затем можно создать дескриптор функции, такой как:

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

Тогда можно сделать:

   >> myfunct(3)
       30

Полный ответ расскажет, как это сделать в python.

Вот как это сделать:

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

Тогда:

myfunct = lambda b: funct(10,b)

Наконец:

>>> myfunct(3)
30
0 голосов
/ 19 февраля 2017

Оказывается, что есть что-то, вплоть до 2.5, называемое партиалами функций , которые в значительной степени являются точной аналогией с описателями функций.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...