Почему процедуры высшего порядка?

Это позволит отсортировать значения по дате (с сохранением последнего значения), суммировать ваши логические значения «True» и затем удалить дубликаты в индексе. Затем он избавится от ненужных вам столбцов и выдаст вам ваш 'new_df':

df = pd.read_table('fun.txt')
df['pastDuebool'] = df['AmountPastDue'] > 0

df = df.set_index('DebtorID').sort_values('AccountRatingDate')
df['Incidents of Delay'] = df.groupby('DebtorID')['pastDuebool'].sum()
df = df[~df.index.duplicated(keep='last')]

df = df.drop(['pastDuebool', 'AccountRatingDate', 'AccountRating'], axis=1)
new_df = df.rename(columns={'AmountOutstanding':'TheMostRecentOutstanding',
                            'AmountPastDue':'TheMostRecentPastDue'})

print(new_df)

вывод:

                 AmountOutstanding  AmountPastDue  Incidents of Delay
DebtorID
SarahParker                  0              0                 0.0
EdwardHall                   0              0                 0.0
DouglasCore               1000            400                 2.0
JohnSnow                  6000            300                 2.0
5
задан Mirzhan Irkegulov 2 September 2015 в 15:12
поделиться

7 ответов

Хорошее наблюдение: функция, возвращающая другую функцию, совпадает с функцией, которая принимает два аргумента. Это называется «каррирование». Другими словами, функция от A до B является доказательством логической импликации, что A подразумевает B, или:

A => B.

Как вы заметили, если A подразумевает, что B подразумевает C, тогда A и B подразумевают C, или:

(A => (B => C)) <==> ((A, B) => C)

Но функция более высокого порядка не обязательно является функцией, которая возвращает другую функцию. Функция высшего порядка - это функция, которая принимает другую функцию в качестве аргумента . Это важное различие, а HOF являются чрезвычайно мощными инструментами программирования.

Например, рассмотрим эту функцию Haskell:

map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : (map f xs)

Эта функция высшего порядка принимает функцию f и применяет ее к каждому элементу в список. В языках без HOF вы должны делать то, что делает эта функция, с помощью цикла или чего-то подобного, но на языке, который имеет HOF, вы можете вызвать f для каждого элемента в списке простым вызовом, подобным этому:

map f myList

Конечно, управляющие конструкции в языках позволяют аппроксимировать функции высшего порядка, но язык, который имеет функции высшего порядка, позволяет вам изобретать свои собственные управляющие конструкции . Схема определенно подходит.

8
ответ дан 18 December 2019 в 13:19
поделиться

Я не буду пытаться резюмировать здесь аргумент, но в Почему функциональное программирование имеет значение , Джон Хьюз утверждает, что функции высшего порядка полезны, потому что они предоставляют более эффективные способы чтобы «склеить» части программы и тем самым облегчить повторное использование кода. Примеры написаны на очень старом языке, который больше не используется, но им все еще легко следовать и они довольно убедительны. Чтение статьи Джона - хороший способ получить подробный ответ на ваш вопрос «Почему так много неясностей о процедурах высшего порядка».

3
ответ дан 18 December 2019 в 13:19
поделиться

Подумайте о функции преобразования или алгоритме сортировки через массив. Теперь вы хотите сделать его действительно гибким, чтобы позволить пользователю вашей функции определять поведение вашей функции, позволяя ему передавать функцию в качестве аргумента.

Допустим, вы пишете алгоритм сортировки со следующим процедурным прототипом:

sort(Array a, void (*fn)(a::element_type, a::element_type));

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

1
ответ дан 18 December 2019 в 13:19
поделиться

Я использую функции высшего порядка в javascript, например, когда я использую поле выбора. Я могу передать функцию, которая будет вызываться при выборе опции, так как единственное отличие для меня заключалось в том, что упрощает мой код и уменьшает избыточность.

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

Как только C # поддержал это, я знал, что теперь это стало более популярным. :)

0
ответ дан 18 December 2019 в 13:19
поделиться

You would need an inner-class to properly simulate that. The first case, Proc is closed over a, b and c. In the second case, the caller of ProcA cannot control how a1, b1 and c1 are passed to the other procedure, he can only control x. So, the way you control a1, b1 and c1 are through the use variables at a higher scope (module level or some such), which makes your function not pure. In that case, you cannot ensure that given the same arguments across calls, ProcA will return the same result. Where as with Proc, you can always be sure that if you call it with the same arguments, the same results will happen.

0
ответ дан 18 December 2019 в 13:19
поделиться

Это больше касается мышления, чем осуществимости. Это позволяет вам относиться к функциям как к первоклассным гражданам и думать в терминах функций, которые работают с функциями для создания других функций и т. Д.

Очевидно, вы могли бы сделать или смоделировать это с помощью других языков, но если это не синтаксический механизм, это вроде как дополнение или взлом.

1
ответ дан 18 December 2019 в 13:19
поделиться

Хорошо, но во втором примере вы создаете эту процедуру во время компиляции с предварительно заданным списком a1 , b1 , и c1 . В первом примере вы создаете его во время выполнения, когда вызываете ProcA , и вы можете создавать столько разных, сколько захотите, так что вы можете делать гораздо больше интересных вещей.

1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: