Условный оператор в одной строке лямбда-функции в python?

Извиняюсь, если это было задано раньше, но я ничего не видел.

По сути, я столкнулся с сценарием, когда мне нужно использовать оператор if внутри лямбда-функции. Что мешает, так это то, что в идеале это должно быть в одной строке кода (если это возможно?)

Обычно я писал бы это:

T = 250 if (T > 200): rate = 200*exp(-T) else: rate = 400*exp(-T) return (rate) 

Однако мне нужно, чтобы это выглядело так:

 rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T)) 

Я понимаю, что легче всего было бы принять решение, выходящее за пределы лямбда-функций, а затем иметь отдельную лямбда-функцию для каждого случая, но это не очень подходит здесь. Функции лямбда хранятся в массиве и доступны, когда это необходимо, причем каждый элемент массива, соответствующий определенной «скорости», поэтому наличие двух отдельных строк для одной и той же «скорости» будет бесполезным. Любая помощь будет принята с благодарностью или если ее невозможно, некоторое подтверждение от других было бы неплохо 🙂

5 Solutions collect form web for “Условный оператор в одной строке лямбда-функции в python?”

Используйте синтаксис exp1 if cond else exp2 .

 rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T) 

Обратите внимание, что вы не используете return в лямбда-выражениях.

Правильный способ сделать это прост:

 def rate(T): if (T > 200): return 200*exp(-T) else: return 400*exp(-T) 

Здесь нет никакого преимущества в использовании lambda . Единственное, что lambda хорошо для вас, это позволить вам создавать анонимные функции и использовать их в выражении (в отличие от оператора). Если вы немедленно присвоите lambda переменной, она уже не является анонимной и используется в инструкции, поэтому вы просто делаете свой код менее понятным без каких-либо причин.

Функция rate определенная таким образом, может быть сохранена в массиве, передана, вызвана и т. Д. Точно так же, как функция лямбда. Это будет точно так же (за исключением немного легче отлаживать, наследовать и т. Д.).


Из комментария:

Ну, функция должна была вписываться в одну строку, и я не думал, что вы можете сделать с именованной функцией?

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

 >>> def foo(x): return x + 1 

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

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

Но вовремя, что это действительно то, что вам нужно здесь: просто используйте exec вместо eval .

Вы не указали, какую версию Python вы используете. В 3.x функция exec имеет ту же самую подпись, что и функция eval :

 exec(my_function_string, my_globals, my_locals) 

В 2.7 exec – это оператор, а не функция, но вы все равно можете записать его в том же синтаксисе, что и в 3.x (если вы не пытаетесь присвоить возвращаемое значение чему-либо), и он работает.

В более раннем 2.x (до 2.6, я думаю?) Вы должны сделать это следующим образом:

 exec my_function_string in my_globals, my_locals 

Да, вы можете использовать сокращенный синтаксис для операторов if .

 rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t)) 

Обратите внимание, что вы также не используете явные инструкции return в lambda .

К тому времени, когда вы говорите, что rate = lambda whatever... вы победили точку лямбда и должны просто определить функцию. Но, если вы хотите лямбда, вы можете использовать «и» и «или»,

 lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T)) 

Я нашел, что МОЖЕТ использовать выражения «if-then» в лямбда. Например:

 eval_op = { '|' : lambda x,y: eval(y) if (eval(x)==0) else eval(x), '&' : lambda x,y: 0 if (eval(x)==0) else eval(y), '<' : lambda x,y: 1 if (eval(x)<eval(y)) else 0, '>' : lambda x,y: 1 if (eval(x)>eval(y)) else 0, } 
  • Почему, если True медленнее, чем 1?
  • Стиль Python: если операторы против логической оценки
  • Python "if" синтаксическая ошибка оператора
  • Составление списка с условием
  • Как сравнить элементы в списке списков и сравнить ключи в списке списков в Python?
  • Python, как проверить, существует ли переменная и ее длина, в одном выражении if?
  • как я могу получить целое число, используя python, если еще условно
  • Питонический способ комбинирования цикла FOR и IF
  • Назначение Python и проверка функции с использованием elif
  • pythonic способ переписать присваивание в выражении if
  • Напротив Python для ... else
  • Python - лучший язык программирования в мире.