Найти - Пользователи
Полная версия: Прошу пояснить пример из лекций Сузи Р.А.
Начало » Python для новичков » Прошу пояснить пример из лекций Сузи Р.А.
1
Ginibe
начальные условия:
ось - виндоза ХР
среда - IDLE Python 2.7

lst = range(10)
f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print reduce(f, lst, (0, []))
может кто “на пальцах” пояснить почему такой код работает ?
любые попытки обратиться к функции f() автономно, а не как указано в коде, приводят к ошибке
как правильно обратиться к функции f() в таком ее представлении ?
особо заинтересовал фрагмент кода: [x + y] ; автономно по результату ничем не отличается от (x + y) ???

с уважением
pill
Guido van Rossum
…So now reduce(). This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do. So in my mind, the applicability of reduce() is pretty much limited to associative operators, and in all other cases it's better to write out the accumulation loop explicitly. .
Последуем примеру:
lst = [0,1,2,3,4]
f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print reduce(f, lst, (0, []))
Передан инициализатор ((0, [])) значит вместо первого элемента списка берем его:
f((0,[]), 0) =
(0 + 0, [] + [0 + 0]) =
(0,[0])
Результат передаем первым аргументом. Следующий элемент списка вторым:
f((0,[0]), 1) =
(0 + 1, [0] + [0 + 1]) =
(1, [0, 1])
и тд...
f((1, [0, 1]), 2) =
(1 + 2, [0, 1] + [1 + 2]) =
(3, [0, 1, 3])

f((3, [0, 1, 3]), 3) =
(3 + 3, [0, 1, 3] + [3 + 3] =
(6, [0, 1, 3, 6])

f((6, [0, 1, 3, 6]), 4) =
(6 + 4, [0, 1, 3, 6] + [6 + 4]) =
(10, [0, 1, 3, 6, 10])
.................................Тут терпение закончилось :)
>>> f((10, [0, 1, 3, 6, 10]), 5)
13: (15, [0, 1, 3, 6, 10, 15])
>>> f((15, [0, 1, 3, 6, 10, 15]), 6)
14: (21, [0, 1, 3, 6, 10, 15, 21])
>>> f((21, [0, 1, 3, 6, 10, 15, 21]), 7)
15: (28, [0, 1, 3, 6, 10, 15, 21, 28])
>>> f((28, [0, 1, 3, 6, 10, 15, 21, 28]), 8)
16: (36, [0, 1, 3, 6, 10, 15, 21, 28, 36])
>>> f((36, [0, 1, 3, 6, 10, 15, 21, 28, 36]), 9)
17: (45, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
>>>
Расписывать список на 10 элементов у меня терпения не хватило… но думаю суть ясна
http://docs.python.org/library/functions.html#reduce

PS: Может я глупый, но практически ни разу не видел reduce() понятный с первого взгляда… в топку их. ИМХО.
o7412369815963
f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print f( (0, []), 5 )
>x+[x + y]
x - это список, а все выражение - добавление к списку
python4ik
ну раз
с уважением
и на пальцах, то смотри:
для начала сравни:
l=[1,2,3]
f=lambda x,y:x+y
print reduce(f,l)
>>> 6
l=[1,2,3]
f=lambda x,y:x+y
print reduce(f,l,0)
>>> 6
l=[1,2,3]
f=lambda x,y:x+y
print reduce(f,l,1)
>>> 7
получается мы прибавили к результату 1 в последнем примере reduce(f,l,1)
lst = range(10)
f = lambda x, y: (x + y, x+[x + y])
print reduce(f, lst, (0, ))
кароче взяли мы 3-ю строку:
print reduce(f, lst, (0, ))
значит мы передаём кортеж (0, ) вместо третьего аргумента, тоесть как до этого передали просто ОДИН (1) - reduce(f,l,1) , то x не надо было делать, потому что это ошибка (1), а к кортежу можно так обращатся x.
Вообщем x - это результат и первый элемент кортежа - (0, ), а x это то что в кавычках!
f((1, ), 2) = (1 + 2, + ) = (3, )
f((1, ), 2) - здесь (1, это x из кортежа (0, ) . ), это второй элемент кортежа x и 2 это y
Такие вот дела!
Ginibe
ОООООООООООО !!!!!!!!!!!!!!!!!!!!!!! (по ихнему ВАУ!)

огромное спасибо, братцы, теперь понятно почему оно работает
ключевым был пост с коментом:
o7412369815963
это список, а все выражение - добавление к списку
я принял его за обычное математическое выражение

Пилу и Питон4ику - за пошаговое “разжовывание” мои благодарности !

ИТОГ: весь смысл в том, что в функцию первым аргументом передается кортеж из двух элементов - первый - число, второй - список … ну а далее как было “разжовано”

НО с другой стороны для меня загадка - почему reduce() свой аргумент “начальное значение” (кста это третий аргумент в списке аргументов reduce) подставляет первым аргументом в пользовательской функции f() … а список (второй аргумент reduce) применяет ко второму аргументу f() ???

последний вопрос конечно риторический … это как в грузинском анекдоте о мягком знаке - это нельзя понять, это нужно запомнить !

огромное всем мерси !
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