Могу ли я сделать вывод лямбда-функции зависимым от условий, не объявляя функцию для ее обработки? - PullRequest
1 голос
/ 17 февраля 2020

Я изучал учебник Python по документам. python .org и только что узнал, что могу создать список, содержащий квадратные числа, выполнив

lista1 = list(map(lambda x: x**2, range(19)))

, пытаясь это сделать. Я думал написать что-то похожее, что бы заполнить список x -> x, если x чётно, и x -> x ** 3, когда x нечетно. Я хотел сделать это снова, используя лямбда-функции, поэтому я попытался

lista1 = list(map(lambda x:
              if x % 2 == 0:
              x
              else:
              x***3, range(19)))

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

def funcx(x):
if x % 2 == 0:
    return x
else:
    return x**3

lista4 = list(map(lambda x: funcx(x), range(19)))

Но мне было интересно, смогу ли я сделать это без определения funcx (x), просто используя лямбда-функции.

Спасибо!

1 Ответ

3 голосов
/ 17 февраля 2020

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

К счастью, Python имеет троичный оператор, который позволяет express "лямбда" во втором фрагменте как

lambda x: (x) if (x % 2 == 0) else (x**3)

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

Однако в этом случае лямбда-выражения и map не являются наиболее подходящим инструментом для работы. Лучшее (более эффективное) решение будет использовать понимание списка :

lista4 = [(x if x % 2 == 0 else x**3) for x in range(19)]

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


В качестве примечания, лямбда во втором фрагменте кода является излишней. Выражение lambda x: func(x) можно заменить просто func. Например,

map(lambda x: funcx(x), range(19))

- это то же самое, что

map(funcx, range(19))

только с дополнительными накладными расходами и незаметностью.

...