Я слышал, что в Python нельзя добавить многострочные лямбды, потому что они синтаксически конфликтуют с другими синтаксическими конструкциями в Python. Сегодня я думал об этом в автобусе и понял, что не могу придумать ни одной конструкции Python, с которой сталкиваются многострочные лямбды. Учитывая, что я довольно хорошо знаю язык, это меня удивило.
Теперь я уверен, что у Гвидо была причина не включать в язык многострочные лямбды, но из любопытства: в какой ситуации включение многострочной лямбды было бы неоднозначным? Верно ли то, что я слышал, или есть какая-то другая причина, по которой Python не допускает многострочные лямбды?
lambda
выражения в первую очередь; Вы можете просто использоватьdef
выражения в выражениях.Ответы:
Посмотрите на следующее:
Возвращает ли это лямбда
(y, [1,2,3])
(таким образом, карта получает только один параметр, что приводит к ошибке)? Или это возвращаетсяy
? Или это синтаксическая ошибка, потому что запятая в новой строке не на месте? Как бы Python знал, что вы хотите?В пределах паренов отступ для Python не имеет значения, поэтому вы не можете однозначно работать с мультилиниями.
Это просто, возможно, есть еще примеры.
источник
Гидо ван Россум (изобретатель Python) сам отвечает на этот точный вопрос в старом сообщении в блоге .
По сути, он признает, что это теоретически возможно, но любое предлагаемое решение будет непифоническим:
источник
Как правило, это очень уродливо (но иногда альтернативы еще более уродливы), поэтому обходной путь заключается в создании выражения в скобках:
Он не будет принимать никаких заданий, поэтому вам придется подготовить данные заранее. Место, где я нашел это полезным, - это оболочка PySide, где у вас иногда бывают короткие обратные вызовы. Написание дополнительных функций-членов было бы еще более уродливым. Обычно вам это не нужно.
Пример:
источник
lambda arg
иsetattr(arg, 'attr','value')
подрывать «нет назначений ...». И затем есть оценка короткого замыканияand
иor
... это Javascript, который делает это. Вонзает в тебя корни, как плющ в стену. Я почти надеюсь, что забуду это из-за Рождества.PEP
рекомендациям)Пара релевантных ссылок:
Некоторое время я следил за разработкой Reia, которая изначально собиралась использовать синтаксис Python, основанный на отступах, с блоками Ruby, все на вершине Erlang. Но дизайнер отказался от чувствительности к отступам, и этот пост, который он написал об этом решении, включает в себя обсуждение проблем, с которыми он столкнулся с блоками отступа + многострочный, и повышенную оценку, которую он получил за проблемы / решения Гвидо по дизайну:
http://www.unlimitednovelty.com/2009/03/indentation-sensitivity-post-mortem.html
Кроме того, вот интересное предложение для блоков в стиле Ruby в Python, с которым я столкнулся, когда Гвидо публикует ответ без его фактического уничтожения (хотя и не уверен, что был какой-либо последующий сбой):
http://tav.espians.com/ruby-style-blocks-in-python.html
источник
[Редактировать] Прочитайте этот ответ. Это объясняет, почему многострочная лямбда не вещь.
Проще говоря, это не пифонично. Из поста Гвидо ван Россума:
источник
Позвольте мне представить вам славный, но ужасный взломать:
Теперь вы можете использовать эту
LET
форму как таковую:который дает:
[0, 3, 8]
источник
Я виновен в том, что практиковал этот грязный хак в некоторых из моих проектов, который немного проще:
Я надеюсь, что вы сможете найти способ оставаться питоническим, но если вам придется сделать это, это будет менее болезненно, чем использование exec и манипулирование глобальными переменными.
источник
Позвольте мне попытаться решить проблему @balpha. Я бы использовал круглые скобки вокруг многострочной лямды. Если круглых скобок нет, лямбда-определение является жадным. Так что лямбда в
возвращает функцию, которая возвращает
(y*z, [1,2,3])
Но
средства
где func - многострочная лямбда, возвращающая y * z. Это работает?
источник
map(func, [1,2,3])
а нижний должен быть ошибкой, потому что у функции карты недостаточно аргументов. Также есть некоторые дополнительные скобки в коде.(Для всех, кто еще заинтересован в теме.)
Учтите это (включая даже использование возвращаемых значений операторов в дальнейших операторах внутри «многострочной» лямбды, хотя это уродливо до точки рвоты ;-)
источник
state.clear()
указана, поскольку аргументы по умолчанию создаются только один раз при создании функции.Вы можете просто использовать slash (
\
), если у вас есть несколько строк для вашей лямбда-функцииПример:
источник
Я начинаю с Python, но исходя из Javascript, наиболее очевидным способом является извлечение выражения как функции ....
Придуманный пример, выражение multiply
(x*2)
извлекается как функция, и поэтому я могу использовать multiline:https://repl.it/@datracka/python-lambda-function
Может быть, это не дает точного ответа на вопрос, было ли это как сделать многострочное выражение в самом лямбда-выражении , но в случае, если кто-то получит эту ветку, смотрящую, как отлаживать выражение (как я), я думаю, что это поможет
источник
map(multiply, [1, 2, 3])
?Что
exec
касается уродливых хаков, вы всегда можете использовать комбинацию и обычную функцию для определения многострочной функции, например:Вы можете обернуть это в функцию как:
источник
Я просто немного поигрался, чтобы попытаться разобраться в словах с помощью Reduce, и придумал один взлом лайнера:
Я просто пытался сделать то же самое, что было сделано в этом Javascript dict понимание: https://stackoverflow.com/a/11068265
источник
Вот более интересная реализация многострочных лямбд. Этого невозможно достичь из-за того, что python использует отступы как способ структурирования кода.
Но, к счастью для нас, форматирование отступа можно отключить с помощью массивов и скобок.
Как уже отмечалось, вы можете написать свой код так:
Теоретически, если вам гарантирована оценка слева направо, это сработает, но вы все равно потеряете значения, передаваемые из одного выражения в другое.
Один из способов сделать это более многословным - это иметь
Где каждая лямбда получает аргументы от предыдущего.
Этот метод позволяет вам написать что-то похожее на схему / шрифт.
Таким образом, вы можете написать такие вещи:
Более сложный метод может быть использован для вычисления гипотенузы
Это вернет список скалярных чисел, чтобы его можно было использовать для уменьшения нескольких значений до одного.
Наличие такого количества лямбда, конечно, не будет очень эффективным, но если вы ограничены, это может быть хорошим способом сделать что-то быстро, а затем переписать его как фактическую функцию.
источник
потому что лямбда-функция должна быть однострочной, как ее самая простая форма функции,
an entrance, then return
источник