Почему полезны лямбды Python? [закрыто]

Если вы хотите разделить строку, сохраняя разделители по регулярному выражению без захвата группы:

def finditer_with_separators(regex, s):
    matches = []
    prev_end = 0
    for match in regex.finditer(s):
        match_start = match.start()
        if (prev_end != 0 or match_start > 0) and match_start != prev_end:
            matches.append(s[prev_end:match.start()])
        matches.append(match.group())
        prev_end = match.end()
    if prev_end < len(s):
        matches.append(s[prev_end:])
    return matches

regex = re.compile(r"[\(\)]")
matches = finditer_with_separators(regex, s)

Если предположить, что регулярное выражение завернуто в группу захвата:

def split_with_separators(regex, s):
    matches = list(filter(None, regex.split(s)))
    return matches

regex = re.compile(r"([\(\)])")
matches = split_with_separators(regex, s)

Оба способа также удаляют пустые группы, которые бесполезны и раздражают в большинстве случаев.

889
задан ayhan 21 January 2017 в 20:57
поделиться

17 ответов

Are you talking about lambda functions? Like

lambda x: x**2 + 2*x - 5

Those things are actually quite useful. Python supports a style of programming called functional programming where you can pass functions to other functions to do stuff. Example:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

sets mult3 to [3, 6, 9], those elements of the original list that are multiples of 3. This is shorter (and, one could argue, clearer) than

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Of course, in this particular case, you could do the same thing as a list comprehension:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(or even as range(3,10,3)), but there are many other, more sophisticated use cases where you can't use a list comprehension and a lambda function may be the shortest way to write something out.

  • Returning a function from another function

    >>> def transform(n):
    ... вернуть лямбда x: x + n
    ...
    >>> f = преобразование (3)
    >>> f (4)
    7
    

    Это часто используется для создания оболочек функций, таких как декораторы Python.

  • Объединение элементов повторяющейся последовательности с помощью reduce ()

     >>> reduce (lambda a, b: '{}, {} '. формат (a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • Сортировка по альтернативному ключу

     >>> sorted ([1, 2, 3, 4, 5, 6, 7, 8, 9], key = lambda x: abs (5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

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

978
ответ дан 22 November 2019 в 21:03
поделиться

Первые поздравления, что удалось вычислить лямбду. На мой взгляд, это действительно мощная конструкция, с которой можно действовать. Сегодняшняя тенденция к функциональным языкам программирования, несомненно, является показателем того, что ее не следует избегать и что она не будет пересмотрена в ближайшем будущем.

Вам просто нужно думать немного иначе. Я уверен, что скоро тебе это понравится. Но будьте осторожны, если имеете дело только с python. Поскольку лямбда не является настоящим замыканием, она каким-то образом "сломана": лямбда питонов не работает

7
ответ дан 22 November 2019 в 21:03
поделиться

Я не могу говорить о конкретной реализации лямбда в Python, но в целом лямбда-функции действительно удобны. Это основная техника (возможно, даже САМАЯ техника) функционального программирования, а также они очень полезны в объектно-ориентированных программах. Для некоторых типов проблем они являются лучшим решением, поэтому, конечно же, не следует забывать!

Я предлагаю вам прочитать о замыканиях и функции отображения (которая ссылается в документы Python, но он существует почти на каждом языке, поддерживающем функциональные конструкции), чтобы понять, почему он полезен.

17
ответ дан 22 November 2019 в 21:03
поделиться

Я использую его довольно часто, в основном как нулевой объект или для частичной привязки параметров к функции.

Вот примеры:

для реализации нулевого объекта шаблон:

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

для привязки параметров:

допустим, что у меня есть следующий API

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

Затем, когда мне не нужно быстро выгружать полученные данные в файл, я делаю это:

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()
4
ответ дан 22 November 2019 в 21:03
поделиться

Сегодня я начал читать книгу Дэвида Мертца «Обработка текста в Python». Хотя у него есть довольно краткое описание лямбд, примеры в первой главе в сочетании с объяснением в приложении А заставили их соскочить со страницы для меня (наконец), и я внезапно понял их ценность. Это не значит, что его объяснение будет работать для вас, и я все еще нахожусь на стадии открытия, поэтому я не буду пытаться добавлять к этим ответам кроме следующего: Я новичок в Python Я новичок в ООП Лямбды были для меня проблемой Теперь, когда я читаю Мертца, я думаю, что понимаю их, и считаю их очень полезными, поскольку они позволяют более чистый подход к программированию.

Он воспроизводит Дзен Питона, одна строка которого гласит: Простой лучше, чем сложный. Как программист, не использующий ООП, читающий код с лямбда-выражениями (и до понимания списков на прошлой неделе), я думал: Это просто? . Сегодня я наконец понял, что на самом деле эти функции делают код более читабельным и понятным, чем альтернатива, которая неизменно представляет собой какой-то цикл. Я также понял, что, как и финансовые отчеты, Python не был разработан для начинающих пользователей, скорее он предназначен для пользователя, который хочет получить образование. Я не могу поверить, насколько силен этот язык.

5
ответ дан 22 November 2019 в 21:03
поделиться

Я только начинаю Python и сначала натолкнулся на Lambda-, что мне потребовалось некоторое время, чтобы понять.

Обратите внимание, что это не осуждение чего-либо. У каждого свой набор вещей, которые нелегко получить.

Является ли лямбда одним из тех «интересных» языковых элементов, о которых в реальной жизни следует забыть?

Нет.

Я уверен, что есть такие. крайние случаи, когда это может быть необходимо, но с учетом его неясности

Это не так уж и сложно. В двух последних командах, с которыми я работал, все использовали эту функцию постоянно.

возможность ее переопределения в будущих выпусках (мое предположение, основанное на различных определениях)

Я не видел серьезных предложения по его переопределению в Python, помимо исправления семантики закрытия несколько лет назад.

и пониженная ясность кодирования - следует ли этого избегать?

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

Это напоминает мне о переполнении (переполнении буфера) типов C - указании на верхнюю переменную и перегрузке для установки других значений полей ... своего рода техничное зрелище, но кошмар для программиста техобслуживания ..

Лямбда похожа на переполнение буфера? Вот это да. Я не могу представить, как вы используете лямбда, если думаете, что это «кошмар обслуживания».

Это напоминает мне переполнение (переполнение буфера) типов C - указание на верхнюю переменную и перегрузка для установки других значений полей ... вроде техничного зрелища, но кошмар технического обслуживания кодера ..

Лямбда похожа на буфер переполнение? Вот это да. Я не могу представить, как вы используете лямбда, если думаете, что это «кошмар обслуживания».

Это напоминает мне переполнение (переполнение буфера) типов C - указание на верхнюю переменную и перегрузка для установки других значений полей ... вроде техничного зрелища, но кошмар технического обслуживания кодера ..

Лямбда похожа на буфер переполнение? Вот это да. Я не могу представить, как вы используете лямбда, если думаете, что это «кошмар обслуживания».

5
ответ дан 22 November 2019 в 21:03
поделиться

Лямбда-выражения глубоко связаны со стилем функционального программирования в целом. Идея о том, что вы можете решать проблемы, применяя функцию к некоторым данным и объединяя результаты, - это то, что Google использует для реализации большинства своих алгоритмов.

Программы, написанные в стиле функционального программирования, легко распараллеливаются и, следовательно, становятся все более и более важными для современных многоядерных машин. Короче говоря, НЕТ, вы не должны их забывать.

8
ответ дан 22 November 2019 в 21:03
поделиться

Я использую Python несколько лет, и я никогда не доходите до случая, когда мне требуется лямбда. На самом деле, как утверждается в учебнике , это просто для синтаксического сахара.

19
ответ дан 22 November 2019 в 21:03
поделиться

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

2
ответ дан 22 November 2019 в 21:03
поделиться

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

Следовательно, по большей части вам следует просто один из них практически в любой ситуации (кроме, может быть, скретч-кода, написанного в интерактивном интерпретаторе).

26
ответ дан 22 November 2019 в 21:03
поделиться

Лямбда - это часть очень важного механизма абстракции, который имеет дело с функциями более высокого порядка. Чтобы лучше понять его ценность, просмотрите высококачественные уроки от Abelson and Sussman и прочтите книгу SICP

. Эти вопросы актуальны в современном программном бизнесе и становятся все более популярными.

72
ответ дан 22 November 2019 в 21:03
поделиться

Двухстрочное резюме:

  1. Замыкания : Очень полезно. Изучите их, используйте их, полюбите их.
  2. Ключевое слово Python lambda : ненужно, иногда полезно. Если вы обнаружите, что делаете с ним что-то отдаленно сложное, отложите это и определите реальную функцию.
106
ответ дан 22 November 2019 в 21:03
поделиться

Я сомневаюсь, что лямбда исчезнет. См. Сообщение Гвидо о том, что наконец он отказался от попыток удалить его. Также см. описание конфликта .

Вы можете проверить этот пост, чтобы узнать больше о сделке, связанной с функциональными возможностями Python: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

Любопытно, что функции сопоставления, фильтрации и сокращения, которые изначально мотивировали введение лямбда и другие функциональные возможности в значительной степени вытеснены списками и генераторами выражений. Фактически, функция уменьшения была удалена из списка встроенных функций в Python 3.0. (Однако нет необходимости отправлять жалобы на удаление лямбда, карты или фильтра: они остались.: -)

Мои собственные два цента: Для ясности лямбда редко стоит того. Обычно существует более ясное решение, которое не включает лямбда.

58
ответ дан 22 November 2019 в 21:03
поделиться

In Python, lambda is just a way of defining functions inline,

a = lambda x: x + 1
print a(1)

and..

def a(x): return x + 1
print a(1)

..are the exact same.

There is nothing you can do with lambda which you cannot do with a regular function—in Python functions are an object just like anything else, and lambdas simply define a function:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

I honestly think the lambda keyword is redundant in Python—I have never had the need to use them (or seen one used where a regular function, a list-comprehension or one of the many builtin functions could have been better used instead)

For a completely random example, from the article "Python’s lambda is broken!":

To see how lambda is broken, try generating a list of functions fs=[f0,...,f9] where fi(n)=i+n. First attempt:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

I would argue, even if that did work, it's horribly and "unpythonic", the same functionality could be written in countless other ways, for example:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Yes, it's not the same, but I have never seen a cause where generating a group of lambda functions in a list has been required. It might make sense in other languages, but Python is not Haskell (or Lisp, or ...)

Please note that we can use lambda and still achieve the desired results in this way :

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

Edit:

There are a few cases where lambda is useful, for example it's often convenient when connecting up signals in PyQt applications, like this:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

Just doing w.textChanged.connect(dothing) would call the dothing method with an extra event argument and cause an error. Using the lambda means we can tidily drop the argument without having to define a wrapping function.

37
ответ дан 22 November 2019 в 21:03
поделиться

Я нахожу лямбда, полезно для списка функций, которые делают то же самое, но для разных обстоятельств. Как Mozilla Neeular Prence .

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

Если бы вам придется определить функцию для всех тех, кого вы сходите с ума, к концу. Также было бы неплохо с именами функций, таких как Pluler_Rule_1 , Pluler_Rule_2 и т. Д., И вам нужно EVAL () Это, когда вы в зависимости на идентификаторе переменной функции.

30
ответ дан 22 November 2019 в 21:03
поделиться

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

>>> f = lambda x: x + 1
>>> f(3)
4

Она просто определяет функцию x. Некоторые другие языки, такие как R, говорят это явно:

> f = function(x) { x + 1 }
> f(3)
4

Видите? Это одна из самых естественных вещей в программировании.

364
ответ дан 22 November 2019 в 21:03
поделиться
121 --- 3090727

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

Многие библиотечные процедуры реализованы, чтобы они позволили определить определенные параметры Callables (из которых лямбда - один). Идея состоит в том, что фактическое значение будет вычислено только в то время, когда он будет использоваться (скорее, когда он называется). Пример (надуманный) пример может помочь проиллюстрировать точку. Предположим, у вас есть рутина, которая собирается сделать журнал данный меток времени. Вы хотите, чтобы подпрограмма использовала текущее время минус 30 минут. Вы бы назвали это так

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

Теперь предположим, что фактическая функция будет называться только при возникновении определенного события, и вы хотите, чтобы метеостанция вычисляется только в то время. Вы можете сделать это, подобно таким

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

, предполагая, что log_timestamp может обрабатывать подобные кабины , оно будет оценить это, когда он нуждается в этом, и вы получите временную метку в то время.

Существует, конечно, альтернативные способы сделать это (используя модуль , например), но я надеюсь, что я передал точку.

Обновление : Здесь является чуть более конкретным реальным миром.

Обновление 2 : Я думаю, что это пример того, что называется Thunk .

13
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: