Использование лямбда-функции в python - PullRequest
0 голосов
/ 28 октября 2019

Есть ли способ преобразовать функцию в лямбда-функцию (автоматически) в Python? Что-то вроде:

def func(arg):
    print("Hi", arg)

==>

lambda arg: compile(func) # <== something like this

Ответы [ 2 ]

1 голос
/ 28 октября 2019

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

Теперь ключевые слова def и lambda определяют такие значения функции. Основное отличие состоит в том, что def присваивает имя такой функции, тогда как лямбда-выражения являются анонимными функциями. Другое отличие состоит в том, что лямбды ограничены одной строкой кода (хотя есть языки, где это не так).

Например, здесь представлены две эквивалентные функции, одна из которых определена с помощью def, а другая с помощьюlambda:

def say_hello(name):
    print('Hi ', name)

lambda name: print('Hi ', name)

Другой способ интерпретации ключевого слова def заключается в следующем:

say_hello = lambda name: print('Hi ', name)

Хотя такой код крайне не рекомендуется.

По сутиобе эти функции являются (почти) эквивалентными значениями данных, но в приведенном выше фрагменте можно вызывать функцию, определенную с помощью def, так как она имеет имя и, следовательно, мы можем получить к нему доступ позже. Тот, который определен lambda, не может, так как у него нет имени, и поэтому он сразу же теряется, если не назначается переменной или не передается другой функции, скажем f, в качестве аргумента, где ему затем присваивается имяв локальной области видимости f в соответствии с параметрами f.

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

map(lambda x: x * 2, [1, 2, 3])
# >>> [2, 4, 6]

Если у вас уже есть функция, определенная с def, которая выполняет умножение, показанное выше, как было бы в вашем примере, например:

def double(x):
    return x * 2

Тогда вы можете просто обратиться к этой функции по имени в вызове карты:

map(double, [1, 2, 3])
# >>> [2, 4, 6]

Вкратце: нет необходимости "компилировать функцию в лямбду",Лямбда - это особый случай функции, которой не дано имя. Вместо этого обращайтесь к своей функции по имени.

PS: не используйте map и filter, вместо этого используйте список пониманий , так как они считаются более питоническими.

0 голосов
/ 28 октября 2019

Вы можете сделать свое легко:

def auto_lam(f):
  return lambda *args, **kwargs: f(*args, **kwargs)

Затем использовать его:

mylam = auto_lam(func)

В этой форме вы можете видеть, что это совершенно бесполезно, потому что вы просто вызываетета же функция, но функции переноса - это то, что очень часто встречается в python, потому что позволяет нам изменять поведение функции. Они называются функциями декоратора .

Например:

def logging_func(f):
    def do_work(*args, **kwargs):
        print ("You called me")
        res = f(*args, **kwargs)
        print ("Finished")
        return res
    return do_work

Теперь вы можете обернуть вашу существующую функцию следующим образом:

@logging_func
def func(arg):
   print("Hi", arg)

Теперь каждый раз, когда вы звоните func, он будет что-то записывать до и после. Я утверждаю, что лучше использовать обертки функций, чем те, которые просто возвращают вам ту же функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...