2017-02-20 33 views
0

Я хочу, чтобы создать список, содержащий одночленов до степени пPython - добавление функции в список

basis = [lambda x:x**i for i in range(0,n+1)] 

Это, однако, создает список п функций, но все-таки один (степени п), а не степени 0,1,2, ... п

Я пытался без списка понимания, а также:

basis = [] 
for i in range(0,n+1): 
    basis.append(lambda x:x**i) 

но с таким же результатом. Подстановка лямбда-функции классическим определением функции также не исправляла ее.


Я проверил Python lambdas and scoping, но это не помогло, так как я не хочу, чтобы хранить значение функции, но сама функция. Например, я хочу, чтобы быть в состоянии назвать

basis[0](34) 

и это должно вернуть

1 
+0

вы можете сделать это с 'partial' (https://docs.python.org/3/library/functools.html#functools .partial), но вам понадобится объявление функции * надлежащего * –

ответ

-1

Эта запись подводит итог совершенно

http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures:

... Вас может создать замыкание, которое немедленно связывается с его аргументами, используя аргумент по умолчанию:

def create_multipliers(): 
     return [lambda x, i=i : i * x for i in range(5)] 

Вы код стал бы:

basis = [lambda x,i=i:x**i for i in range(0,n+1)] 

Это немного Hacky решение, но работает. Я по-прежнему настоятельно рекомендую прочитать ссылку, предоставленную в качестве 3-х баллов, которые были сделаны, когда вы новичок в Python, есть обычные ошибки.

+0

Это швы, это ответ только на ссылку. – Arman

+0

Ответы только на ссылки не оценены. Скопируйте соответствующий текст в ответ и используйте ссылку для поддержки деталей. – Barmar

0

Как я сказал в комментарии, посмотрите на partial

def f(x, n): 
    return x**n 

basis = [partial(f, n=i) for i in range(10)] 
print(basis[0](34)) # 1