2015-12-11 3 views
0

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

Пример в JavaScript:

function get_mult_by(m) { 
    return function(x) { 
     return m * x; 
    } 
} 

В Python я могу вернуться lambda:

def get_mult_by(m): 
    return lambda x: m * x 

Но если я хочу, чтобы вернуть нормальную функцию вещи становятся более сложными и менее просто (начиная с необходимостью именования функции):

def get_mult_by(m): 
    def mult(x): 
     # do something else 
     return m * x 
    return mult 

Что такое ar e лучшие практики в этом отношении?

ответ

1

Я не думаю, что это имеет большое значение. Если функция является простым выражением, я бы, вероятно, вернул lambda, как в вашем первом примере, но использование именованной функции не должно быть проблемой. Эквивалент JavaScript к названному функции случае будет:

function get_mult_by(m) { 
    var mult; 
    mult = function(x) { 
     return m * x; 
    } 
    return mult; 
} 

Другими словами, просто думать об этом как местный, который используется для создания возвращаемого значения.

+0

Я думаю, что это действительно имеет значение и вводит шаблонный код. – Luke

+0

@ Luke В этом случае, я думаю, я не понимаю, почему вы разместили этот вопрос. Если бы вы уже подумали о том, что вы предпочитаете, зачем тратить время на это? –

+0

Я подумал о том, что я предпочитаю, но не знаю, как это сделать на Python. Мне не нравится тот факт, что Python не имеет анонимных функций. – Luke

0

Они такие же. На ваш вопрос, я думаю, что использование лямбда более питоновское. На самом деле, если вы не импортировать дополнительный пакет, вы даже не можете отличить их, используя функцию типа:

In [4]: type(lambda x: 1) 
Out[4]: function 

In [5]: def f(): 
    ...:  pass 
    ...: 

In [6]: type(f) 
Out[6]: function 

Если вы думаете, что сложный путь лучше, просто идти с этим и хорошо для вас.

+0

Я не думаю, что сложный путь лучше, но я не думаю, что могу объявить «лямбда» более чем одним выражением. – Luke

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