2014-12-17 3 views
1

Учитывая выражение f = lambda x: x+x есть возможность редактировать функциональность f используя выражение в одну строку, так что следующий результат будет достигнут:Как изменить функциональность лямбда-выражения без назначения и композиции?

f(7) = 14 
`the expression subtracts one from the return value of f` 
f(7) = 13 

ответ

2

Вы можете просто переназначить f, однако, делать это только в один линия будет сложно, как вам нужно, чтобы сохранить ссылку на старую lambda:

old_f = f 
f = lambda x: old_f(x) - 1 

вы можете использовать замыкание для этого:

f = (lambda old_f: (lambda x: old_f(x) - 1))(f) 
+0

Nice, но цена, которую вы платите, вероятно, низкая производительность по сравнению с Ламба x: x + x-1. – Trilarion

+0

Это не было требование;). Похоже, что производительность достигает порядка 100%, так как вызов функции, безусловно, является доминирующей операцией здесь, а для модифицированного 'f' вы вызываете две функции (' f' и 'old_f'). – filmor

+0

Можете ли вы объяснить, что происходит на уровне видимости при использовании этого решения? – Medvednic

1

Вы можете использовать значение аргумента по умолчанию для сохранения предыдущей функции через замыкание и не нужно вводить какие-либо новую переменную:

f = lambda x: x*2 
print f(7) # --> 14 

f = (lambda prev_f=f: (lambda x: prev_f(x) - 1))(f) 
print f(7) # --> 13 
+0

Вы раньше видели ответ на фильм? Кажется, очень похоже. – Trilarion

+0

@Trilarion: Да, я видел ответ кинематографа, и это похоже, но не совсем то же самое. Разница в том, что он не требует отдельного 'prev_f = f' заявления заранее, так что это действительно однострочное решение. – martineau

Смежные вопросы