Ответ 1
Используйте синтаксис exp1 if cond else exp2
.
rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T)
Обратите внимание, что вы не используете return
в лямбда-выражениях.
Извините, если это было задано раньше, но я ничего не видел.
По сути, я столкнулся с сценарием, когда мне нужно использовать оператор 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))
Я понимаю, что легче всего было бы принять решение, выходящее за пределы лямбда-функций, а затем иметь отдельную лямбда-функцию для каждого случая, но ее здесь не очень удобно. Функции лямбда хранятся в массиве и доступны, когда это необходимо, причем каждый элемент массива, соответствующий определенной "скорости", поэтому наличие двух отдельных строк для одной и той же "скорости" будет бесполезным. Любая помощь будет принята с благодарностью или если ее невозможно, некоторое подтверждение от других было бы приятным:)
Используйте синтаксис 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,
}