Форум сайта python.su
Решаю задачки на codewars нужно написать калькулятор из вложенных функций по примеру:
seven(times(five())) # must return 35
four(plus(nine())) # must return 13
eight(minus(three())) # must return 5
six(divided_by(two())) # must return 3
подсмотрел решение:
def zero(f = None): return 0 if not f else f(0) def one(f = None): return 1 if not f else f(1) def two(f = None): return 2 if not f else f(2) def three(f = None): return 3 if not f else f(3) def four(f = None): return 4 if not f else f(4) def five(f = None): return 5 if not f else f(5) def six(f = None): return 6 if not f else f(6) def seven(f = None): return 7 if not f else f(7) def eight(f = None): return 8 if not f else f(8) def nine(f = None): return 9 if not f else f(9) def plus(y): return lambda x: x+y def minus(y): return lambda x: x-y def times(y): return lambda x: x*y def divided_by(y): return lambda x: x/y
Офлайн
Да тут всё очень просто:
Функции zero - nine должны принимать либо None либо унарную функцию f. Если пришло None, то возвращается соответствующая цифра, иначе возвращается результат вызова функции f на соответствующем значении.
Функции plus, minus, times, divided_by как раз и возвращает функцию f. f должна быть унарной функцией, но операторы бинарны, по этому нужно уменьшить их арность. Это достигается за счёт каррирования.
Вот как это используется:
> six(divided_by(two()))
1) two() - возвращает 2
2) divided_by(2) - возвращает унарную функцию (a -> b). Она делит переданное ей значение на 2.
3) six((a -> b)) - (a -> b)(6) - 6/2=3
Отредактировано Rodegast (Июль 2, 2020 23:51:53)
Офлайн
Тут решение и потом объяснение
>>> def zero(func=None): ... return 0 if func is None else func(0) ... >>> def one(func=None): ... return 1 if func is None else func(1) ... >>> def two(func=None): ... return 2 if func is None else func(2) ... >>> def three(func=None): ... return 3 if func is None else func(3) ... >>> def four(func=None): ... return 4 if func is None else func(4) ... >>> def five(func=None): ... return 5 if func is None else func(5) ... >>> def six(func=None): ... return 6 if func is None else func(6) ... >>> def seven(func=None): ... return 7 if func is None else func(7) ... >>> def eight(func=None): ... return 8 if func is None else func(8) ... >>> def nine(func=None): ... return 9 if func is None else func(9) ... >>> def plus(num): ... return lambda x: x + num ... >>> def minus(num): ... return lambda x: x - num ... >>> def times(num): ... return lambda x: x * num ... >>> def divided_by(num): ... return lambda x: x // num ... >>> seven(times(five())) # must return 35 35 >>> >>> four(plus(nine())) # must return 13 13 >>> >>> eight(minus(three())) # must return 5 5 >>> >>> six(divided_by(two())) # must return 3 3 >>>
AzartНа примере вызовов
не понимаю вот это f= Noone и почему возвращается f(число) ?
seven(times(five()))
>>> def f(x=2): ... return x * 2 ... >>> f() 4 >>> f(3) 6 >>> f(4) 8 >>>
>>> def seven(func=None): ... return 7 if func is None else func(7) ... >>> >>> def multiply10(x): ... return x * 10 ... >>> >>> multiply10(5) 50 >>> multiply10(7) 70 >>> multiply10(12) 120 >>> >>> seven() 7 >>> seven(multiply10) 70 >>>
>>> def seven(func=None): ... return 7 if func is None else func(7) ... >>> seven() 7 >>> seven(lambda x: x * 10) 70 >>>
AzartДальше используется ещё одно понятие - замыкание. Замыкание - это такой приём, когда функция замыкается внутри функции и в таком состоянии возвращается наружу.
также с lambda x: x+y откуда функция берет значение х ?
>>> def multiply(times): ... def f(x): ... return times * x ... return f ... >>> mul10 = multiply(10) >>> mul20 = multiply(20) >>> mul11 = multiply(11) >>> >>> mul10(5) 50 >>> mul10(6) 60 >>> mul10(10) 100 >>> >>> mul20(5) 100 >>> mul20(6) 120 >>> mul20(10) 200 >>> >>> mul11(5) 55 >>> mul11(6) 66 >>> mul11(10) 110 >>>
>>> def number(num): ... def f(): ... return num ... return f ... >>> num7 = number(7) >>> num25 = number(25) >>> num10 = number(10) >>> >>> num7() 7 >>> num7() 7 >>> >>> num25() 25 >>> num25() 25 >>> >>> num10() 10 >>> num10() 10 >>>
>>> def plus(a): ... def f(b): ... return a + b ... return f ... >>> plus10 = plus(10) >>> plus20 = plus(20) >>> plus11 = plus(11) >>> >>> plus10(15) 25 >>> plus10(20) 30 >>> plus10(1) 11 >>> >>> plus20(15) 35 >>> plus20(20) 40 >>> plus20(1) 21 >>> >>> plus11(15) 26 >>> plus11(20) 31 >>> plus11(1) 12 >>>
>>> def plus(num): ... return lambda x: x + num ... >>>
Отредактировано py.user.next (Июль 3, 2020 00:58:43)
Офлайн
Огромное спасибо за ответы, сижу вникаю!!!
py.user.nextДа уже прочитал пару книжек, сейчас Марка Лутца читаю, но я на 300й странице из 1500 , попутно решаю вот такие простенькие задачки. Просто наткнулся на эту и захотел понять как это работает, хотя понимаю что знаний пока не достаточно, нужно читать книги!) Еще раз большое спасибо за подробное разъяснение!
Ещё раз говорю: прочитай учебник по питону, чтобы тебе на разных форумах не переписывали страницы из учебников по питону.
Офлайн