LINUX.ORG.RU

[Python][lambda] Хочу последовательного выполнения

 ,


0

0

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

begin .. end

Я делаю так:

l = lambda x: (do_some(),
               do_other(),
               do_foobar())

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

Как можно красивее, именно лямбдой?

если тебе пох на возвращаемое значение этих функций, то

l = lambda x: (do_some() and do_other() do_foobar()) 

возвращаешь из них соответственно true.

shuthdar ★★★
()
Ответ на: комментарий от Flavio_German_Davino_Rodriguez

А вот и подоспел К.О. Давай тогда исправленную конструкцию целиком.

balodja ★★★
()

>5.13 Evaluation order Python evaluates expressions from left to right.

Т.ч. будут таки последовательно.

DonkeyHot ★★★★★
()

Зачем вам такая лямбда? Нет правда, зачем?

def l(x):
    do_some()
    do_other()
    do_foobar()
Я бы за такие лямбды (да еще и с сайд-эффектами) сразу бы лишал премиальных - за обфускацию кода.

ntp
()
Ответ на: комментарий от balodja

>чем это лучше варианта, указанного автором

Даёт уверенность в порядке выполнения без чтения документации:).

На самом деле что-то похожее придётся изобретать для «переопределени оператора ;», да простится мне с++ная формулировка. В питоне это красиво не делается, а иногда хочется.

DonkeyHot ★★★★★
()
Ответ на: комментарий от arhibot

Под определенным взглядом это может быть достоинством. А не фиг писать в непонятном функциональном стиле! Кто потом код будет поддерживать? ;)

dave ★★★★★
()
Ответ на: комментарий от dave

> Хочешь сказать, что многострочные лямбды не нужны как класс?

В питоне не нужны. Здесь хватает других выразительных средств.

Лямбды нужны использовать только для простых выражений типа lambda x: x ** 2, но и тут почти всегда выгоднее использовать list comprehension или что-нибудь из модуля operator. Для любой более сложной конструкции есть вложенные функции.

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

И еще ни один человек не ответил на вопрос зачем ему именно лямбды.

ntp
()
Ответ на: комментарий от arhibot

> лямбды в питоне --- насмешка над программистами

В чем насмешка?

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

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

ntp
()
Ответ на: комментарий от ntp

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

dave ★★★★★
()
Ответ на: комментарий от dave

ну, и кроме возможности функции напрямую обратиться к самой себе (хотя не уверен на счет clojure).

dave ★★★★★
()
Ответ на: комментарий от arhibot

> лямбды в питоне --- насмешка над программистами.

Лямбды в Питоне - средство карринга.

tailgunner ★★★★★
()
Ответ на: комментарий от dave

В отрыве от ограничений питона - ни в чем.

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

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

ntp
()
Ответ на: комментарий от ntp

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

Что-то я такие не вспомню.

dave ★★★★★
()
Ответ на: комментарий от ntp

И еще ни один человек не ответил на вопрос зачем ему именно лямбды.

Иногда, например, удобно код подсократить, например в pyqt (если надо без designer, ручками и с извращениями).

layout = QVBoxLayout()

widget1 = QCoolWidget()
# ...
# some code
# ...
widget10 = QVeryCoolWidgetWithBlackjackEtc()

map(lambda w : layout.addWidget(w), [widget1, widget2, ... widget10])

А вообще да, для карринга и прочей богомерзкой функциональщины.

anonymous
()
Ответ на: комментарий от anonymous

>Иногда, например, удобно код подсократить, например в pyqt (если надо без designer, ручками и с извращениями).

UPD: пример вообще можно через простой map сделать, неудачно привёл, в реале встречается ситуация с более хитрыми лямбдами в случае получения на вход всяких там dict-ов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.