Dlaczego Python nie jest zbyt dobry do programowania funkcyjnego? [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 2 lata temu .

Popraw to pytanie

Zawsze myślałem, że programowanie funkcyjne można wykonać w Pythonie. Tak więc, byłem zaskoczony, że Python nie dostał wiele wzmianki w to pytanie, a kiedy to było wspomniałem, że zwykle nie było to zbyt pozytywne. Nie podano jednak zbyt wielu powodów (wymieniono brak dopasowania wzorców i algebraicznych typów danych). Więc moje pytanie brzmi: dlaczego Python nie jest zbyt dobry do programowania funkcyjnego? Czy jest więcej powodów niż brak dopasowania wzorców i algebraicznych typów danych? Czy te pojęcia są tak ważne dla programowania funkcyjnego, że język, który ich nie obsługuje, może być klasyfikowany tylko jako drugi język programowania funkcyjnego? (Keep in pamiętaj, że moje doświadczenie z programowaniem funkcjonalnym jest dość ograniczone.)

Author: Community, 2009-06-19

9 answers

Pytanie, do którego się odwołujesz, pyta, które języki promują zarówno OO, jak i programowanie funkcyjne. Python nie promuje programowania funkcyjnego, nawet jeśli działa dość dobrze.

Najlepszym argumentemprzeciwko programowaniu funkcyjnemu w Pythonie jest to, że przypadki użycia imperatywnego/OO są starannie rozważane przez Guido, podczas gdy przypadki użycia programowania funkcyjnego nie są. Kiedy piszę imperatywny Python, jest to jeden z najładniejszych języków, jakie znam. Kiedy piszę funkcjonalne Python staje się tak brzydki i nieprzyjemny jak przeciętny język, który nie ma BDFL.

Co nie oznacza, że jest źle, po prostu musisz pracować ciężej niż gdybyś przełączył się na język promujący Programowanie funkcyjne lub przełączył się na pisanie oo Pythona.

Oto funkcjonalne rzeczy, których brakuje mi w Pythonie:


  • brak dopasowania wzorca i brak rekurencji ogonowej oznacza, że podstawowe algorytmy muszą być napisane imperatywnie. Rekurencja jest brzydka i powolna w Pythonie.
  • mała lista biblioteka i brak funkcjonalnych słowników oznaczają, że musisz sam dużo pisać.
  • brak składni do curryingu lub kompozycji oznacza, że styl bez punktowy jest tak pełen interpunkcji, jak jawnie przekazujący argumenty.
  • Iteratory zamiast leniwych list oznaczają, że musisz wiedzieć, czy chcesz wydajności, czy wytrwałości, i rozproszyć wywołania do list wokół, jeśli chcesz wytrwałości. (Iteratory są używane-raz)
  • prosta składnia imperatywna Pythona, wraz z jego prosty parser LL1 oznacza, że lepsza składnia if-expressions i Lambda-expressions jest w zasadzie niemożliwa. Guido tak to lubi I myślę, że ma rację.
 397
Author: Nathan Shively-Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 16:59:13

Guido ma dobre wyjaśnienie tego tutaj . Oto najbardziej istotna część:

Nigdy nie uważałem Pythona za mocno pod wpływem funkcjonalnych języki, bez względu na to, co mówią ludzie ani myśleć. Byłem o wiele bardziej zaznajomiony z językami imperatywnymi, takimi jak C i Algol 68 i chociaż zrobiłem funkcje obiektów pierwszej klasy, I nie postrzegał Pythona jako funkcjonalnego język programowania. Jednak wcześniej NA, było jasne, że użytkownicy chcą zrób wiele Więcej z listami i funkcjami.

...

Warto również zauważyć, że nawet choć nie wyobrażałem sobie Pythona jako język funkcjonalny, wprowadzenie of closures był przydatny w rozwój wielu innych zaawansowanych funkcje programowania. Na przykład, niektóre aspekty zajęć w Nowym Stylu, dekoratorów i inne nowoczesne funkcje polegaj na tej zdolności.

Wreszcie, mimo że liczba funkcje programowania funkcyjnego mają been wprowadzony na przestrzeni lat Python nadal brakuje pewnych cech znalezionych w "prawdziwe" Programowanie funkcyjne języki. Na przykład Python robi nie wykonywać pewnych rodzajów optymalizacji (np. rekurencja ogonowa). Ogólnie rzecz biorąc, ponieważ Python jest niezwykle dynamiczny charakter, to jest niemożliwe do zrobienia rodzaj optymalizacji czasu kompilacji znane z języków funkcyjnych, takich jak Haskell lub ML. I to jest w porządku.

Wyciągam z tego dwie rzeczy:

  1. język jest creator nie uważa Pythona za język funkcjonalny. Dlatego można zobaczyć" funkcjonalne " funkcje, ale jest mało prawdopodobne, aby zobaczyć coś, co jest ostatecznie funkcjonalne.
  2. [17]}dynamiczny charakter Pythona hamuje niektóre z optymalizacji, które można zobaczyć w innych językach funkcyjnych. Oczywiście, Lisp jest tak samo dynamiczny (jeśli nie bardziej dynamiczny) jak Python, więc jest to tylko częściowe Wyjaśnienie.
 105
Author: Jason Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 11:53:55

Schemat nie ma algebraicznych typów danych ani dopasowywania wzorców, ale z pewnością jest językiem funkcyjnym. Irytujące rzeczy na temat Pythona z perspektywy programowania funkcyjnego:

  1. Kalekie Lambdy. Ponieważ lambda może zawierać tylko wyrażenie, a nie można zrobić wszystkiego tak łatwo w kontekście wyrażenia, oznacza to, że funkcje, które można zdefiniować "w locie" są ograniczone.

  2. Ifs to stwierdzenia, nie wyrażenia. Oznacza to między innymi nie możemy mieć lambdy z " If " w środku. (Jest to naprawione przez ternary w Pythonie 2.5, ale wygląda to brzydko.)

  3. Guido grozi usuwa mapę, filtruje i redukuje co jakiś czas

Z drugiej strony, python ma leksykalne zamknięcia, lambdy i składanie list (które są naprawdę pojęciem "funkcjonalnym", niezależnie od tego, czy Guido się do tego przyznaje, czy nie). Robię mnóstwo "funkcjonalnego stylu" programowania w Pythonie, ale trudno powiedzieć, że jest idealny.

 53
Author: Jacob B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-24 19:55:48

Nigdy nie nazwałbym Pythona "funkcjonalnym", ale za każdym razem, gdy programuję w Pythonie, kod zawsze kończy się niemal czysto funkcjonalnym.

Co prawda, wynika to głównie z niezwykle ładnego rozumienia listy. Więc niekoniecznie sugerowałbym Pythona jako funkcjonalny język programowania, ale sugerowałbym programowanie funkcjonalne dla każdego, kto używa Pythona.

 23
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 13:35:43

Pozwól, że zademonstruję fragmentem kodu zaczerpniętego z odpowiedzi na "funkcjonalne" pytanie Pythona na SO

Python:

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

Haskell:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

Główna różnica polega na tym, że standardowa biblioteka Haskella ma przydatne funkcje do programowania funkcyjnego: w tym przypadku iterate, concat, i (!!)

 18
Author: yairchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

Jedna rzecz, która jest naprawdę ważna dla tego pytania (i odpowiedzi) jest następująca: Czym do cholery jest programowanie funkcjonalne i jakie są jego najważniejsze właściwości. Postaram się dać swoje zdanie na ten temat:

Programowanie funkcyjne jest jak pisanie matematyki na tablicy. Kiedy piszesz równania na tablicy nie myślisz o zleceniu wykonania. Nie ma (zazwyczaj) mutacji. Nie wracasz pojutrze i nie patrzysz na to, a kiedy robisz znowu obliczenia, otrzymujesz inny wynik (lub możesz, jeśli wypiłeś świeżą kawę :)). Zasadniczo, co jest na tablicy jest tam, a odpowiedź była już tam, gdy zaczął pisać po prostu jeszcze nie zdałeś sobie sprawy, co to jest.

Programowanie funkcyjne jest podobne do tego; niczego nie zmieniasz, tylko oceniasz równanie (lub w tym przypadku" program") i dowiedzieć się, jaka jest odpowiedź. Program wciąż tam jest, niezmodyfikowany. To samo z data.

Jako najważniejsze cechy programowania funkcyjnego zaliczyłbym następujące: a) przejrzystość referencyjna - jeśli oceniasz to samo stwierdzenie w innym czasie i miejsce, ale z tymi samymi wartościami zmiennych, będzie to nadal oznaczać to samo. b) brak efektu ubocznego - bez względu na to, jak długo gapisz się na tablicę, równanie innego facet patrzy na inną tablicę nie zmieni się przypadkowo. c) Funkcje też są wartościami. które mogą być przekazywane i stosowane z, lub do, innych zmienne. d) skład funkcji, można zrobić h = g * f i tym samym zdefiniować nową funkcję h (..), która jest odpowiednik wywołania g (f (..)).

Ta lista jest w mojej kolejności priorytetów, więc przejrzystość referencji Jest Najważniejsza, a następnie bez skutków ubocznych.

Teraz, jeśli przejdziesz przez python i sprawdzisz, jak dobrze język i biblioteki obsługują, i gwarancje, te aspekty - wtedy jesteś na dobrej drodze, aby odpowiedzieć na własne pytanie.

 14
Author: xeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 18:48:46

Python jest prawie językiem funkcjonalnym. To "functional lite".

Ma dodatkowe funkcje, więc dla niektórych nie jest wystarczająco czysty.

Brakuje również niektórych funkcji, więc dla niektórych nie jest wystarczająco kompletny.

Brakujące funkcje są stosunkowo łatwe do napisania. Sprawdź posty podobne do this na FP w Pythonie.

 9
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 15:35:08

Innym powodem nie wspomnianym powyżej jest to, że wiele wbudowanych funkcji i metod wbudowanych typów modyfikuje obiekt, ale nie zwraca go. Jeśli te zmodyfikowane obiekty zostaną zwrócone, kod funkcjonalny będzie bardziej przejrzysty i zwięzły. Na przykład, if some_list.append (some_object) zwrócił some_list z dołączonym some_object.

 9
Author: Dvd Avins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 18:50:25

Oprócz innych odpowiedzi, jednym z powodów, dla których Python i większość innych języków multi-paradygmatów nie są dobrze przystosowane do prawdziwego programowania funkcyjnego, jest to, że ich Kompilatory / maszyny wirtualne / czasy uruchamiania nie obsługują optymalizacji funkcjonalnej. Ten rodzaj optymalizacji jest osiągany przez kompilator rozumienia reguł matematycznych. Na przykład wiele języków programowania obsługuje funkcję lub metodę map. Jest to dość standardowa funkcja, która przyjmuje funkcję jako jeden argument i iterable jako drugi argument następnie stosuje tę funkcję do każdego elementu w iterable.

W każdym razie okazuje się, że map( foo() , x ) * map( foo(), y ) jest tym samym co map( foo(), x * y ). Ten ostatni przypadek jest w rzeczywistości szybszy niż ten pierwszy, ponieważ ten pierwszy wykonuje dwie kopie, gdzie ten drugi wykonuje jedną.

Lepsze języki funkcjonalne rozpoznają te matematycznie oparte relacje i automatycznie wykonują optymalizację. Języki, które nie są dedykowane paradygmatowi funkcjonalnemu, prawdopodobnie nie / align = "left" /

 5
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-06 01:16:27