#python #filter #functional-programming
#python #Фильтр #функциональное программирование
Вопрос:
В python я знаком с функциональным синтаксисом чего-то вроде:
data = [{'Age': 10, 'Name': 'Greg'}, {'Age': 20, 'Name': 'Sarah'}]
filter(lambda item: item['Name'] == 'Greg', data)
И для filter
него используется (приблизительный) синтаксис:
filter(condition, element_list)
Какой наиболее распространенный функциональный синтаксис для этого? используя приведенное выше или перевернув его так, чтобы element_list
или iterable
было первым? Почему один метод предпочтительнее другого?
Комментарии:
1. Python — ужасный язык для изучения этих комбинаторов. GVR официально заявляет, что он ненавидит парадигму и пытался избежать помещения
map
/filter
в основную библиотеку (и был счастливreduce
, что не менее полезный комбинатор потоков был переведен в никогда не используемыйfunctools
модуль). Вероятно, вы захотите либо изучить реальный функциональный язык (например, Haskell или OCaml), либо использовать что-то вроде Python или Rust, которые реализуют комбинаторы потоков менее неудобным способом.2. @SilvioMayolo конечно — не могли бы вы показать пример того, как один из них будет делать
map
/filter
?3. @SilvioMayolo также вы говорите, что Python ужасен, но тогда я, возможно, захочу его использовать — или в одном из них была опечатка?
4. Ой, ой! Я имел в виду Ruby (который очень похож на Python, но делает эту конкретную вещь намного лучше) или Rust (который практически заново изобретает большую часть современного ООП с нуля с помощью более современного функционального подхода)
5. Что касается синтаксиса, Фрэнк в основном опередил меня. В большинстве языков ООП вы хотите
map
, чтобы /filter
были методами , а не автономными функциями. В чистых функциональных языках они имеют смысл как функции, потому что композиция функций дешева. Но сделать их автономными функциями в Python — значит навсегда отбросить их как низшую альтернативу пониманию списков в Python
Ответ №1:
В Java, Swift и даже JavaScript map
и filter
являются методами в списках. Вы бы написали
Например, Swift попросил бы вас написать:
myList.filter { item in item["name"] == "Greg" }
Java заставит вас превратить ваш массив в поток, а затем к потоку будут применены различные операции сопоставления и фильтрации:
myList.stream().forEach(item -> print(item))
[Мой синтаксис может быть немного неточным.]
Комментарии:
1. можно ли использовать Swift вне приложения для iPhone?