Функция управления Python ala Matlab

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

[email protected](arglist)body

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

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

Ответ 1

Лямбда-функции 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 являются первоклассными объектами. Это означает, среди прочего, что вы можете передавать их в качестве аргументов в другие функции. Это относится к обоим типам функций, показанным выше.

Ответ 2

Это не совсем полный ответ. В 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

Ответ 3

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

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