Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2011 19:34:26

Ginibe
От:
Зарегистрирован: 2011-04-19
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу пояснить пример из лекций Сузи Р.А.

начальные условия:
ось - виндоза ХР
среда - 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) ???

с уважением



Офлайн

#2 Июнь 24, 2011 21:53:43

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу пояснить пример из лекций Сузи Р.А.

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() понятный с первого взгляда… в топку их. ИМХО.



Отредактировано (Июнь 24, 2011 21:56:55)

Офлайн

#3 Июнь 24, 2011 22:37:22

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Прошу пояснить пример из лекций Сузи Р.А.

f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print f( (0, []), 5 )
>x+[x + y]
x - это список, а все выражение - добавление к списку

Офлайн

#4 Июнь 25, 2011 01:54:44

python4ik
От:
Зарегистрирован: 2010-01-05
Сообщения: 251
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу пояснить пример из лекций Сузи Р.А.

ну раз

с уважением
и на пальцах, то смотри:
для начала сравни:
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
Такие вот дела!



Отредактировано (Июнь 25, 2011 07:19:43)

Офлайн

#5 Июнь 25, 2011 08:26:31

Ginibe
От:
Зарегистрирован: 2011-04-19
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу пояснить пример из лекций Сузи Р.А.

ОООООООООООО !!!!!!!!!!!!!!!!!!!!!!! (по ихнему ВАУ!)

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

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

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

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

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

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

огромное всем мерси !



Отредактировано (Июнь 25, 2011 10:04:53)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version