Подтвердить что ты не робот

Условный оператор в одной строке лямбда-функции в 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))

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Я нашел, что МОЖЕТ использовать инструкции "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,
}