2014-01-10 2 views
4

Предположим, я хочу вычислить следующие f(f(...f(x)..).
В принципе много раз функция сама по себе.
В настоящее время я делаю следующее, чтобы достичь этого результата (и вернуть все промежуточные шаги):Передача функции в качестве аргумента в python

def iterator(function, x, n=4): 
    x = float(x) 
    arr = [] 
    for i in range(n + 1): 
     arr.append(x) 
     x = function(x) 

    return arr 

def funcM(x): 
    return x/4 + 12 

, а затем я передаю свою функцию funcM в качестве аргумента:
print iterator(funcM, 100, 5).

В этом подходе нет ничего плохого, и вычисления верны.

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

ответ

5

Функция лямбда (точнее, лямбда выражение) просто функция вам может определять на месте, прямо там, где вам это нужно. Например,

f = lambda x: x * 2 

является точно то же самое, как

def f(x): 
    return x * 2 

И когда я говорю точно, я имею в виду - они разборку к тому же байткод. Единственное различие между ними состоит в том, что имя, указанное во втором примере, имеет имя.

Лямбда-выражения становятся полезными, поскольку создание одного не утверждение, а это означает, что, как и другие уже ответили, вы можете сделать

print iterator(lambda x: x/4 + 12, 100, 5) 

, чтобы получить именно то, что вы хотите.

Главное отличие между лямбда-выражениями и регулярными функциями состоит в том, что лямбды более ограничены. Lambdas может содержать только выражения, а не инструкции. Выражение - это все, что вы можете поместить в правую часть задания =.(если вы хотите получить больше педантичности, Python определяет выражение как http://docs.python.org/2/reference/expressions.html)

Это означает, что выражение лямбда не может назначаться переменной (фактически, она не может иметь локальные переменные вообще, кроме ее параметры). Он не может печатать (если он не вызывает другую функцию). Он не может иметь цикл for, цикл while, тест if (кроме трехмерного оператора x if cond else y) или блок try/except.

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

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

+0

Благодарим вас за полезное объяснение. –

+0

Обратите внимание, что печать не является проблемой в Python 3, так как 'print' заменяется на функцию. – aIKid

7

Да, вы можете просто использовать лямбда-выражения. Они созданы для этого.

iterator(lambda x: x/4+12, 100, 5) 

Слова из docs:

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

Если вы хотите узнать больше, вот некоторые хорошо читать:

http://www.diveintopython.net/power_of_introspection/lambda_functions.html
Why use lambda functions?

+0

ничего себе, все было так просто. Приходится изучать лямбды. Спасибо –

+0

Добро пожаловать! :) – aIKid

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