Пример, где лямбды очень полезны в Python - PullRequest
4 голосов
/ 08 декабря 2011

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

Не могли бы вы показать что-то для обработки текста, где вы бы использовали лямбда-выражения, и было бы трудно избежать лямбда-выражений?Но то, что практично (не математическая игра).

Ответы [ 7 ]

5 голосов
/ 08 декабря 2011

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

Что этот код делает вкратце? Преобразует пользовательскую таблицу Excel в операторы вставки для пользовательской таблицы базы данных. Существует сопоставление между полями таблицы Excel и полями базы данных, а также сопоставление между полями таблицы Excel и функциями, которые должны применяться к значению таблицы Excel, прежде чем оно будет вставлено в БД. Вы не хотите определять отдельную функцию для каждого поля.

map_func = { 'ID' : lambda x : 'mig_farm_seq.nextval',
             'ENTERPRISE_NAME' : wrap_str,
             'TAX_NUMBER' : wrap_str,
             'FAMILY_NAME' : lambda x : wrap_str(x.split()[0]),
             'GIVEN_NAME' : lambda x : wrap_str(x.split()[1]),
             'ENTERPRISE_REGISTRATION_NUMBER' : wrap_str,
             'PREMISE_NAME' : wrap_str,
             'HOUSE_ID' : wrap_str,
             'POSTAL_CODE' : wrap_str,
             'PHONE_NUMBER_1' : lambda x : wrap_str(get_phone_number(x, True)),
             'PHONE_NUMBER_2' : lambda x : wrap_str(get_phone_number(x, False)),
             'FAX_NUMBER' : lambda x : wrap_str(x.replace(' ', '')),
             'BANK_IDENTIFIER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')[:3]),
             'BANK_ACCOUNT_NUMBER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')),
             'NUMBER_OF_EMPLOYEES' : wrap_null,
             'SETTLEMENT_NUMBER' : wrap_null,
             'REGISTRATION_NUMBER' : lambda x : insert_reg_number % x,
             'GENDER' : wrap_str,
             'ACTIVITY' : lambda x : '0',
             'REG_HOLDER_ACTIVITY' : lambda x : '0',
             'PROCESSED_BY_JOB' : lambda x : '0'
         }

источник: http://pastebin.com/MxEPBMaZ

4 голосов
/ 08 декабря 2011

Я часто их использую в одном месте: функция key функций sort и sorted:

>>> person = lambda name, age: { "name": name, "age": age }
>>> people = [ person("Joe", 61), person("Jane", 52) ]
>>> people.sort(key=lambda person: person["age"])

Это позволит отсортировать список людей по возрасту.

Еще одно место, где я использую лямбды, - re.sub:

>>> re.sub("0x([0-9a-f]+)", lambda match: "0x" + match.group(1).upper(), "0xfa")
'0xFA'
2 голосов
/ 08 декабря 2011

Вместо того, чтобы предлагать что-либо здесь, я бы порекомендовал посетить каталог lib вашей Установки Python и grep для lambda.Вы получите достаточно примеров, чтобы удовлетворить ваш аппетит.

1 голос
/ 09 декабря 2011

Поскольку вы спрашивали об обработке текста, взгляните на этот пример (и этот похож).

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

0 голосов
/ 08 декабря 2011

Один случай, когда они действительно полезны:

Допустим, вы используете PyQt, который позволяет подключать сигналы к другим слотам (методам). Иногда мне нужно просто выполнить определенное действие, а не написать функцию, поэтому все, что мне нужно, это одноразовая функция.

obj.signal.connect(lambda: doFoo(bar))

Конечно, это контрастирует с:

def doBoo():
    return doFoo(bar)
obj.signal.connect(doBoo)

.. Гораздо чище прежним способом.

0 голосов
/ 08 декабря 2011

Все мои проекты Django включают 2 строки (settings.py):

DIRNAME = os.path.dirname(__file__)
_rel = lambda x: os.path.join(DIRNAME, x)
0 голосов
/ 08 декабря 2011

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

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

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

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