Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 21, 2012 23:03:20

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите, пожалуйста, с задачкой.

Решал задачку 3 отсюда из темы “функции”: http://pyobject.ru/blog/2010/02/04/python-quiz/
Написал:

def gen(a,b):
	lst = []
	for i in xrange(a,b+1):
		lst.append(lambda x: x+i)
	return lst

Вроде, как я полагал, должен возвращаться список функций, суммирующих с аргументом, аргумент должен варьиоваться от a до b, однако возвращается список функций, расположенных, вроде, по разным адресам, но суммирующих только с b. То есть список одинаковых функций. Почему так, подскажите пожалуйста?
Решение другое нашел методом эксперимента, но вопрос не дает мне спокойно спать - почему этот код работает не так, как ожидалось?

Офлайн

#2 Июнь 22, 2012 02:41:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите, пожалуйста, с задачкой.

>>> def gen(a, b):
...     def f(i):
...         return lambda x: x + i
...     return [f(i) for i in range(a, b + 1)]
... 
>>> lst = gen(1, 5)
>>> lst[0](5)
6
>>> lst[2](5)
8
>>>
похоже, это связано с именем
все lambda-функции используют одно имя i, а оно к концу цикла связано с последним числом

в случае с локальной функцией i создаётся в ней каждый раз в виде локальной переменной, таким образом, все имена i разные



Офлайн

#3 Июнь 22, 2012 05:49:03

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Помогите, пожалуйста, с задачкой.

А темка-то уже поднималась.
Tkinter: использование процедур с параметрами в bind
непонятки с lambda



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Июнь 22, 2012 10:06:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите, пожалуйста, с задачкой.

i=i в lambda добавляет лишнюю переменную, которой там не должно быть



Офлайн

#5 Июнь 22, 2012 13:51:24

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите, пожалуйста, с задачкой.

Спасибо, вопрос решен.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version