список лямбда-функций Python без частичного - PullRequest
6 голосов
/ 14 июня 2011

Я пытался сгенерировать список лямбда-функций в python, используя понимание списка. но это не сработало,

например

fl=[lambda x: x**i for i in range(5)]

я проверил другой вопрос, он в основном генерирует ту же функцию, основываясь на ссылке i.

поэтому я тоже попробовал частичное.

from functools import partial

fl=[partial(lambda x: x**i) for i in range(5)]

но это тоже не сработало. любая помощь будет оценена. ура ~

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

Вы фактически передаете i по имени.

fl=[lambda x: x**i for i in range(5)]

Каждый раз, когда выполняется lambda, он связывает ту же самую i с функцией, поэтому, когда функция выполняется (позже), она использует текущее значение тогда iбудет 4).Вместо этого вы должны передать его в качестве аргумента по умолчанию:

fl=[lambda x, j=i: x**j for i in range(5)]

На самом деле, я заметил, что вы неправильно используете partial.Здесь:

fl = [partial(lambda x, y: y ** x, i) for i in range(5)]

Это также работает.

6 голосов
/ 14 июня 2011

Вы спотыкаетесь о прицелы Python .

fl=[lambda x, i=i: x**i for i in range(5)]
4 голосов
/ 14 июня 2011

Другим распространенным обходным решением является использование замыкания:

def create_f(i):
    def f(x):
        return x**i
    return f

fl = [create_f(i) for i in range(5)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...