Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 6, 2019 12:45:30

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

Прошу помощи в разборе с лямбда функцией

first-step
Просто на курсах не было уделено много внимания lambda функциям и они упоминались, но довольно поверхностно их синтаксис вообще не рассматривался, поэтому я столкнулся с незнакомыми штучками.
Ну так я и говорю: то, о чём ты спрашиваешь большую часть времени, вообще никак к лямбда-функциям не относится. То есть эти курсы тебя не научили, что такое вообще функции в языке программирования, как они устроены, куда они записываются и как они работают. То есть ты не знаешь азов программирования на любом языке. И когда я говорю, что лямбда-функция - это такая же функция, как и остальные функции, ты не понимаешь, о чём я вообще говорю, потому что ты не понимаешь, что такое функции вообще. А ведь это тема бейзика, тема паскаля, - то есть это вообще какие-то древние знания, которые сами собой разумеются при любом программировании (я просто предположил, что ты это всё уже прошёл, раз питоном занимаешься и лямбда-функции изучаешь, которые стоят выше по сложности). Поэтому конечно нужно знать уже заранее, что делают круглые скобки и в каких ситуациях. В одной ситуации круглые скобки - это вызов функции (про который ты не понимаешь, что это значит вообще - “вызов функции”), а в другом случае это вычисляемое выражение, результат вычисления которого заменяет скобки и участвует в дальнейших вычислениях, которые там вокруг скобок происходят. Не знаю, заметил ли ты, но мне пришлось ещё тебе объяснять, что такое аргумент функции, как он там передаётся и что это вообще такое. И ты предлагаешь это всё тебе писать ещё тут.

Так вот я тебе и говорю: возьми книжку по основам программирования какую-нибудь. Есть бесплатные книжки (не которые стырены пиратами и выложены, а которые авторы сами бесплатно распространяют). И вот там тебе нужно читать, что такое присваивание, что такое сравнение, что такое переменная, что такое функция, а чотакое определение функции, а чотама в вызове происходит, а чоэтавоообще такое “вызов”, и как они тама эти аргументы соединяются, как тама эти значения прикрепляются, и как вотэтавот функция передаётся в функцию.

Понимаешь, форум - это не место для переписывания тебе всех книжек и всей Википедии, на которой тоже дофига из этих книжек надёргано вразнобой и выложено. Надо просто читать. Надо выстроить себе систему обучения и учиться равномерно и постепенно от простого к сложному.

first-step
Вот где прочитать, что лямбда функция умеет, а что не умеет? )
Почитать хочешь про лямбда-функцию? Я тебе щас дам почитать. На почитай раз два три четыре. Если поймёшь там что-нибудь, можешь приходить спрашивать. Но я думаю, тебе надо вообще прямо брать книжку и от простейших вещей начинать изучать, что там как устроено в языке программирования.



Отредактировано py.user.next (Апрель 6, 2019 13:01:50)

Офлайн

#2 Апрель 6, 2019 16:53:37

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

Если совсем по-колхозному, то лямбда функция - это функция-однострочник, которая может быть задана одной строкой. Посмотри на такую конструкцию:

 def xx(a, b):
    return a*b
Лямбда функция чем-то напоминает функцию, которая содержит только одну строку: return <выражение>. Всё, что можно запихнуть в выражение return обычной функции, то же самое можно задать в лямбда.

Офлайн

#3 Апрель 6, 2019 21:19:57

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

Rafik
Если совсем по-колхозному, то лямбда функция - это функция-однострочник, которая может быть задана одной строкой. Посмотри на такую конструкцию:

Спасибо, это я понял. Борюсь с тем, чтобы в процессе вычислений сохранить значение промежуточное…

Грубо говоря, есть задача распечатать значения факториалов всех чисел от 0 до n, грубо говоря range(1, n + 1) .
В одном варианте я эту задачу решил вот так:

 print(1, *list(map(lambda x: (functools.reduce(lambda a, b: a * b, range(1, x + 1))), range(1, int(input()) + 1))))


Но не нравится мне это. Получается, что для каждого значения строки range(1, int(input()) + 1) формируется новая строка и для нее делается .reduce Много лишних вычислений. Вот думаю, как сделать так, чтобы программа вычислила 1 * 2, записала в строку или в print сунула, потом этот же результат умножила на 3, опять в print, потом уже новый результат *4 и т.д…. Не получается сохранить этот промежуточный результат….
Сделал вот так:
 l = [1]
list(map(lambda x: l.append(l[-1] * x), range(1, int(input()) + 1)))
print(*l)

тоже не прокатывает… надо в одним движением это все сделать…

Причем нельзя использовать IF WHILE NOT и т.д.

Отредактировано first-step (Апрель 6, 2019 21:21:42)

Офлайн

#4 Апрель 7, 2019 00:09:21

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

Прошу помощи в разборе с лямбда функцией

Это максимум

  
>>> import functools
>>> 
>>> print(*map(lambda n: functools.reduce(lambda x, y: x * y,
...                                       range(1, n + 1),
...                                       1),
...            range(int(input()) + 1)))
5
1 1 2 6 24 120
>>> 
Не, может, и можно сделать память где-то, но это больше напоминает шараду, а в реальном программировании шарад не должно быть. Код должен быть простым и ясным. В то же время надо стремиться к чистым функциям, а ты предлагаешь мемоизацию на побочном эффекте делать.

Вот тебе код на Erlang'е для вычисления факториала с аккумулятором.
fact(N) ->
fact(N, 1).

fact(0,Acc) ->
Acc;
fact(N,Acc) when N > 0 ->
fact(N-1,N*Acc).
Тут хвостовая рекурсия. В любом случае должна быть задана граница рекурсии через условие, которое у тебя запрещено по заданию.

У тебя же по условию нужно применять map() в качестве ограничителя цикла, в которую ты не можешь залезть и сделать там память для мемоизации.



Отредактировано py.user.next (Апрель 7, 2019 00:16:57)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version