Найти - Пользователи
Полная версия: Не могу разобраться - почему работает неправильно.
Начало » Python для новичков » Не могу разобраться - почему работает неправильно.
1 2 3 4 5 6
fata1ex
vault, вся информация есть в ссылках. Без английского не куда ) В общем, ответ-то угадался сразу - во всём виновато позднее связывание, но с такой проблемой я не встречался.

Еще интересно, что:
>>> fab_adders = lambda a, b: (lambda x: x + off for off in xrange(a, b + 1))
>>> for adder in list(fab_adders(0, 5)):
...     print adder(0)
...     
... 
5
5
5
5
5
5

А ответ должен быть такой:
>>> fab_adders = lambda a, b: [lambda x, off=off: x + off for off in xrange(a, b + 1)]
>>> for adder in fab_adders(0, 5):
...     print adder(0)
...     
... 
0
1
2
3
4
5
py.user.next
http://python.su/forum/topic/14875/
sp3
>>> def gen(a,b):
... 	lst = []
... 	for i in xrange(a,b+1):
... 		lst.append(lambda x: x+i) # здесь i переменная из верхней функции
... 	return lst
... 
... for k in gen(1,3):
...     print k(1)
4
4
4
>>> def gen(a,b):
... 	lst = []
... 	for i in xrange(a,b+1):
... 		lst.append(lambda x, i=i: x+i) # а здесь локальная, для каждой лямбды своя
... 	return lst
... 
... for k in gen(1,3):
...     print k(1)
2
3
4
здесь как бы срабатывает правило E из LEGB (слышали о таком?)
py.user.next
>> def gen(a,b):
...     lst = []
...     for i in range(a, b + 1):
...         lst.append(lambda x, i=i: x + i)
...     return lst
... 
>>> lst = gen(0, 5)
>>> lst[0](5)
5
>>> lst[1](5)
6
>>> lst[1](5, 4)
9
>>> 
у функции меняется количество аргументов
FishHook
Решение очевидно.
Непонятки с лямбдой возникают из-за непонимания того, что после завершения цикла, в i хранится значение последней иттерации

for i in range(0, 10):
  pass
print i
>>> 9

Поэтому нужно, чтобы на момент вычисления значения лямбды, i имело нужное значение, то есть цикл еще не закончился.

def gen(a,b):
        for i in range(a, b+1):
	    yield lambda x: x+i
for func in gen(1,3):
  print func(5)
FishHook
ИМХО самое питонячее решение
fata1ex
FishHook, в задании требовался список :) да писали уже такое решение…скажем…в посте #2

py.user.next, это да. И что же делать? )
FishHook
fata1ex
да писали уже такое решение
Блин, я думал сам придумал
FishHook
fata1ex
в задании требовался список
Эээ? напомните задание, пжлст.
fata1ex
Можно сделать так:
>>> from functools import partial
>>> fab_adders = lambda a, b: [partial(lambda x, off: x + off, off=off) for off in xrange(a, b + 1)]
>>> for adder in fab_adders(0, 5):
...     print adder(0)
... 
0
1
2
3
4
5
>>> for adder in fab_adders(0, 5):
...     print adder(0), adder(0, 2)
... 
0
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: <lambda>() got multiple values for keyword argument 'off'
Плюс добавить плюшечку, чтобы при вызове adder со вторым аргументом интерпретатор ругался правильно.

FishHook, задание в первом посте :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB