Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Каррінг в Python

with 8 comments

Увага, тут мої коментатори пишуть що я не розбираюсь в термінах. Це правда, і це потрібно мати на увазі.

Каррінг – це коли ви передаєте в функцію не всі параметри які потрібні їй для того щоб обчислити результат, а вона замість того щоб матюкатись повертає вам іншу функцію яка може обчислити результат коли їй передати решту параметрів (або якщо їй знову передали не все що потрібно – повернути ще одну функцію).

В Python функції – об’єкти першого роду, і є замикання, тому це можливо. А ще можна буде використати рекурсивний декоратор. 😉

Давайде для прикладу візьмемо простеньку функцію суми:

def my_sum(*args):
    return sum(args)

І зробимо так щоб її можна було викликати отак:

5 == my_sum(1, 1)(1)(1, 1)()

Останні дужки суто для того щоб було ясно, коли припиняти повертати функцію, і нарешті обчислити результат. Не буду довго вас мучити, і на наступній сторінці одразу напишу як це робиться. А поки що можете не перегортати і придумати самі.

Advertisements

Сторінки: 1 2 3

Written by bunyk

Вересень 19, 2012 at 20:30

Оприлюднено в Кодерство

Tagged with

Відповідей: 8

Subscribe to comments with RSS.

  1. Тільки це все таки не каррінг, а часткове застосування.я

    Alex Y

    Вересень 20, 2012 at 07:01

    • Каррінг це хіба не перетворення звичайної функції в частково-застосовну?

      bunyk

      Вересень 20, 2012 at 22:01

  2. Каррінг – перетворення функції двох аргументіа на функцію, що бере аргументи один за одним
    curry = lambda x: lambda y: x + y
    curry(4)(5)
    А для часткового застосування краще використовувати functools.partial – у комплекті та щей можливості ширші.

    GrAndSE

    Вересень 20, 2012 at 07:56

    • Тільки двох аргументів?

      Хах, а в functools нічого аж такого окрім partial, і декоратора для створення повного набору методів для визначення впорядковавності і нема. Дякую за просвітлення.

      P.S. Щось вас ну дуже вже давно в інтернеті не було видно, а шкода.

      bunyk

      Вересень 20, 2012 at 22:14

      • За визначенням двох. Хоча частенько його застосовують послідовно до функцій багатьох змінних, перетворюючи на функції однієї змінної. Чому це теж називають каррінгом я не знаю. Да і це не найважливіше 🙂

        А в functools ще й набір функцій для роботи з декораторами наявний 🙂

        Ну а в інтернеті я пристуній – тільки в google+, plurk, рідше twitter. Можливо десь ще щось вирішу написати 🙂 А так слідкую 🙂

        GrAndSE

        Вересень 25, 2012 at 16:38

  3. def haskell_me(func, args=None):
        if args is None:
            args = tuple()
        nparams = func.func_code.co_argcount
        def closure(*nargs):
            nargs = args + nargs
            if len(nargs) < nparams:
                return haskell_me(func, nargs)
            else:
                return func(*nargs)
        return closure
    
    @haskell_me
    def sum(x, y, z):
        return x + y + z
    
    print "sum(1)(2,3) =", sum(1)(2,3)
    print "sum(1)(2)(3) =", sum(1)(2)(3)
    

    koder

    Вересень 28, 2012 at 19:59

  4. Здається, це вже винайдено до нас: http://docs.python.org/library/functools.html#functools.partial

    Jolly Roger

    Жовтень 11, 2012 at 23:27


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: