Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Python. Как работает генератор списка с lambda

#python #lambda


Написал вот такую строчку:  

a = [lambda x : x^n for n in range(10)]


При этом на каждой итерации

for i in range(10): print(a[i](2))  


выдает 11, a  

for i in range(10): print(a[2](i))  


выдет:
9
8
11
10
13
12
15
14
1
0

Почему?
    


Ответы

Ответ 1



Если я правильно понял, то происходит следующее: a = [lambda x : x^n for n in range(10)] - тут создается список функций. Это то же самое, что и: def xoring(x): for n in range(10): pass return x^n a = [] for i in range(10): a.append(xoring) Можно даже посмотреть что внутри списка и увидеть набор функций: >>> a [. at 0x029E1468>, . at 0x02B7C300>, . at 0x02B7C348>, . at 0x02B7C390>, . at 0x02B7C3D8>, . at 0x02B7C420>, . at 0x02B7C468>, . at 0x02B7C4B0>, . at 0x02B7C4F8>, . at 0x02B7C540>] Далее, for i in range(10): print(a[i](2)), 10 раз вызывается i-я функция из списка a и ей передается аргумент 2. Так как функции одинаковые, то и результаты одинаковые. Т.е. внутри происходит следующее: lambda x : x^n for n in range(10) - здесь i изменяется от 0 до 9 и ксорится с x. Т.к. x = 2, то x^i даст такие результаты: 2^ 0 = 2 2^ 1 = 3 2^ 2 = 0 2^ 3 = 1 2^ 4 = 6 2^ 5 = 7 2^ 6 = 4 2^ 7 = 5 2^ 8 = 10 2^ 9 = 11 Последнее значения и возвращает функция. Здесь for i in range(10): print(a[2](i)) 10 раз вызывается функция с индексом 2 в списке a и ей передается значение i, которое меняется от 0 до 9. То же самое, что и for i in range(10): print(xoring(i)) Что в результате и дает 0 ^ 9 = 9 1 ^ 9 = 8 2 ^ 9 = 11 3 ^ 9 = 10 4 ^ 9 = 13 5 ^ 9 = 12 6 ^ 9 = 15 7 ^ 9 = 14 8 ^ 9 = 1 9 ^ 9 = 0

Ответ 2



Вам действительно необходимо XOR-ить (x^n) числа в десятичной системе? Предположу, что вы хотели провести операцию возведения в степень (x**n). При генерации вашего списка анонимных функций, все они зависят от переменной n, значение которой по завершении цикла n = 9. При этом на каждой итерации for i in range(10): print(a[i](2)) выдает 11 Тут понятно, ведь все функции в списке возвращают значение x^9. Если вам все-таки нужно возведение в степень: fun = lambda n: lambda x: x**n a = [fun(n) for n in range(10)] for i in range(10): print(a[i](2), end=' ') Out: 1 2 4 8 16 32 64 128 256 512

Комментариев нет:

Отправить комментарий