30

Извинения, если это было задано раньше, но я не мог его увидеть нигде.Условный оператор в одной строке лямбда-функции в 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)) 

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

+6

Сомневаюсь-квадрат, что вам нужна функция лямбда одну строку, потому что я сомневаюсь, что вам нужна функция одной строки, и я сомневаюсь, что вам нужна функция лямбда, в отличие от имени функции , Какой смысл использовать «лямбда», если вы так или иначе дадите своей функции имя «rate»? – DSM

+0

Жаль, что я могу только +1 DSM один раз ... Но для того, чтобы это было ясно: легче сделать это, чтобы не «принимать решения за пределами лямбда-функций», а просто определять их как обычные функции в первую очередь. Вы можете хранить регулярные функции в массиве. Нет ничего особенного в лямбдах; они являются более ограниченными функциями, а не более мощными функциями. – abarnert

+0

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

ответ

54

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

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

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

6

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

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

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

+2

Дальнейшее сокращение: 'rate = lambda (t): (200, если t> 200 else 400) * exp (-t)' – shahkalpesh

+1

@shahkalpesh Совершенно верно, хотя, возможно, менее явным, иллюстрирующим ответ на вопрос. –

+2

Параны после «лямбда» также излишни. – georg

17

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

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

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

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

я обнаружил, что могу использовать «если-то» заявления в лямбда. Например:

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, 
} 
Смежные вопросы