Próbuję rozgryźć lambda Pythona. Czy lambda jest jednym z tych „interesujących” przedmiotów językowych, o których w prawdziwym życiu należy zapomnieć?
Jestem pewien, że istnieją pewne skrajne przypadki, w których może to być potrzebne, ale biorąc pod uwagę niejasność tego, jego potencjał zostanie ponownie zdefiniowany w przyszłych wydaniach (moje założenie oparte na różnych jego definicjach) i zmniejszoną przejrzystość kodowania - jeśli powinien być unikanym?
Przypomina mi to przepełnienie (przepełnienie bufora) typów C - wskazanie na najwyższą zmienną i przeciążenie, aby ustawić inne wartości pola. To trochę jak pokaz techniki, ale koszmar programisty konserwacji.
Odpowiedzi:
Czy mówisz o funkcjach lambda ? Lubić
Te rzeczy są właściwie całkiem przydatne. Python obsługuje styl programowania zwany programowaniem funkcjonalnym, w którym można przekazywać funkcje innym funkcjom. Przykład:
ustawia
mult3
na[3, 6, 9]
te elementy oryginalnej listy, które są wielokrotnościami 3. Jest to krótsze (i, można się spierać, wyraźniejsze) niżOczywiście w tym konkretnym przypadku można zrobić to samo, co interpretację listy:
(lub nawet jako
range(3,10,3)
), ale istnieje wiele innych, bardziej wyrafinowanych przypadków użycia, w których nie można użyć rozumienia listy, a funkcja lambda może być najkrótszym sposobem na napisanie czegoś.Zwracanie funkcji z innej funkcji
Jest to często używane do tworzenia opakowań funkcji, takich jak dekoratory Pythona.
Łączenie elementów sekwencji powtarzalnej z
reduce()
Sortowanie według alternatywnego klucza
Używam regularnie funkcji lambda. Przyzwyczaiłem się do nich, ale w końcu zrozumiałem, że to bardzo cenna część języka.
źródło
','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
lambda
funkcje mogą być anonimowe (tak jak we wszystkich twoich przykładach). Jeśli przypisanielambda
funkcji do niczego potem robisz to źle i powinien używaćdef
zamiastlambda
to tylko fantazyjny sposób powiedzeniafunction
. Poza nazwą, nie ma w tym nic tajemniczego, zastraszającego lub tajemniczego. Kiedy czytasz następujący wiersz, zamieńlambda
nafunction
w myśl:Określa tylko funkcję
x
. Niektóre inne językiR
mówią wprost:Zobaczysz? Jest to jedna z najbardziej naturalnych rzeczy do zrobienia w programowaniu.
źródło
lambda
bardzo łatwo zrozumieć”. Dzięki!lambda
nafunction
w myśl i dodajreturn
przed ostatnim wyrażeniemtype(lambda x: 3)
. zarównolambda
wyrażenia, jak idef
instrukcje generująfunction
obiekty; jest to tylko składnialambda
ekspresji limity których przykłady można go wytworzyć.lambda
wyrażenia, nie oznacza, że wyniklambda
wyrażenia nie jest funkcją.Dwuliniowe podsumowanie:
lambda
kluczowe Pythona : niepotrzebne, czasami przydatne. Jeśli robisz coś zdalnie skomplikowanego, odłóż to i zdefiniuj prawdziwą funkcję.źródło
Lambda jest częścią bardzo ważnego mechanizmu abstrakcyjnego, który zajmuje się funkcjami wyższego rzędu. Aby właściwie zrozumieć jego wartość, obejrzyj wysokiej jakości lekcje Abelsona i Sussmana i przeczytaj książkę SICP
Są to istotne problemy w nowoczesnym biznesie oprogramowania i stają się coraz bardziej popularne.
źródło
lambda
si z pierwszorzędnymi funkcjami. Python ma bardzo ograniczonąlambda
instrukcję, ale pełni funkcje pierwszej klasy. Jedyną różnicą jest to, że musisz nazwać funkcje, które chcesz przekazać.lambda są niezwykle przydatne w programowaniu GUI. Załóżmy na przykład, że tworzysz grupę przycisków i chcesz użyć pojedynczego sparametryzowanego wywołania zwrotnego zamiast unikalnego wywołania zwrotnego na przycisk. Lambda pozwala to zrobić z łatwością:
(Uwaga: chociaż pytanie dotyczy konkretnie tego pytania
lambda
, możesz także użyć funools.partial aby uzyskać ten sam typ wyniku)Alternatywą jest utworzenie osobnego wywołania zwrotnego dla każdego przycisku, co może prowadzić do zduplikowania kodu.
źródło
value
jest zdefiniowany w pętli; w drugim przykładzie parametr zawsze miał tylko jedną wartość. Kiedy dodajesz coś podobnegoarg=value
, dołączasz bieżącą wartość do wywołania zwrotnego. Bez tego powiążesz odwołanie do zmiennej w wywołaniu zwrotnym. Odwołanie zawsze będzie zawierało końcową wartość zmiennej, ponieważ wywołanie zwrotne następuje po pewnym czasie po zakończeniu działania pętli.functools.partial()
pozwala ci to robić z mniejszą ilością cruft (i bezlambda
).partial(my_callback, value)
vslambda arg=value: my_callback(arg)
- lambda ma znacznie więcej cruft (przypisanie do argumentu, a następnie użycie) i mniej jasne jest, co jest intencją (możesz robić coś subtelnie innego w lambda). Importowanie tak naprawdę nie stanowi problemu (i tak masz stos i jest to jeden raz na plik). Kod najlepiej oceniać na podstawie tego, jak dobrze czyta, ipartial()
jest o wiele łatwiejszy do odczytania niż lambda.Wątpię, czy lambda odejdzie. Zobacz post Guido na temat rezygnacji z próby usunięcia go. Zobacz także zarys konfliktu .
Możesz sprawdzić ten post, aby uzyskać więcej informacji na temat umowy dotyczącej funkcji funkcjonalnych Pythona: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Moje dwa centy: rzadko, jeśli chodzi o przejrzystość, jest to lambda. Zasadniczo istnieje bardziej przejrzyste rozwiązanie, które nie obejmuje lambda.
źródło
W Pythonie
lambda
jest to tylko sposób definiowania funkcji wbudowanych,i..
.. są dokładnie takie same.
Nic nie można zrobić z lambda, czego nie można zrobić zwykłą funkcją - w Pythonie funkcje są jak wszystko inne, a lambdy po prostu definiują funkcję:
Szczerze mówiąc, myślę, że
lambda
słowo kluczowe jest zbędne w Pythonie - nigdy nie musiałem ich używać (ani nie widziałem takiego, w którym lepiej byłoby użyć zwykłej funkcji, rozumienia listy lub jednej z wielu wbudowanych funkcji)Dla zupełnie przypadkowego przykładu z artykułu „lambda Pythona jest zepsuta!” :
Twierdziłbym, że nawet gdyby to zadziałało, jest okropnie i „pozbawione pythonic”, ta sama funkcjonalność mogłaby zostać napisana na niezliczone inne sposoby, na przykład:
Tak, to nie to samo, ale nigdy nie widziałem przyczyny, w której wymagane byłoby wygenerowanie grupy funkcji lambda na liście. Może to mieć sens w innych językach, ale Python nie jest Haskell (ani Lisp, ani ...)
Edytować:
Istnieje kilka przypadków, w których lambda jest przydatna, na przykład często jest wygodna podczas podłączania sygnałów w aplikacjach PyQt, takich jak to:
Samo wykonanie
w.textChanged.connect(dothing)
wywołałobydothing
metodę z dodatkowymevent
argumentem i spowodowałoby błąd. Użycie lambda oznacza, że możemy porządnie upuścić argument bez konieczności definiowania funkcji zawijania.źródło
a
Zdefiniowane przez ciebie lambda i funkcje nie są dokładnie takie same. :) Różnią się__name__
co najmniej według pola ...Uważam, że lambda jest przydatna dla listy funkcji, które robią to samo, ale w różnych okolicznościach.
Podobnie jak reguły liczby mnogiej Mozilli :
Gdybyś musiał zdefiniować funkcję dla wszystkich, oszalałbyś do końca.
Nie byłoby też miło z nazwami funkcji, takimi jak
plural_rule_1
,plural_rule_2
itp. I trzeba byeval()
tego było, gdy zależy się od identyfikatora funkcji zmiennej.źródło
Prawie wszystko, co możesz zrobić
lambda
, możesz zrobić lepiej z nazwanymi funkcjami lub wyrażeniami list i generatorami.W związku z tym w przeważającej części powinieneś wybrać tylko jedną z nich w praktycznie każdej sytuacji (może z wyjątkiem kodu scratch zapisanego w interaktywnym tłumaczu).
źródło
Używam Pythona od kilku lat i nigdy nie spotkałem się z przypadkiem, w którym potrzebowałem lambda. Naprawdę, jak samouczek mówi, tylko dla cukru syntaktycznego.
źródło
Nie mogę rozmawiać o konkretnej implementacji lambda przez Pythona, ale ogólnie funkcje lambda są naprawdę przydatne. Są podstawową techniką (a może nawet techniką) programowania funkcjonalnego i są również bardzo przydatne w programach obiektowych. W przypadku niektórych rodzajów problemów są najlepszym rozwiązaniem, więc na pewno nie należy zapominać!
Sugeruję przeczytanie na temat zamknięć i funkcji mapy (która prowadzi do dokumentów Pythona, ale istnieje w prawie każdym języku obsługującym konstrukcje funkcjonalne), aby zobaczyć, dlaczego jest to użyteczne.
źródło
Funkcja lambda to niebiurokratyczny sposób tworzenia funkcji.
Otóż to. Załóżmy na przykład, że masz swoją główną funkcję i musisz obliczyć wartości. Zobaczmy tradycyjny sposób i sposób lambda, aby to zrobić:
Tradycyjny sposób:
Sposób lambda:
Zobacz różnicę?
Funkcje lambda bardzo dobrze pasują do list, takich jak listy czy mapy. W rzeczywistości rozumienie listy jest „pytonicznym” sposobem wyrażania siebie za pomocą lambda. Dawny:
Zobaczmy, co oznaczają poszczególne elementy składni:
To wygodne uh? Tworzenie takich funkcji. Przepiszmy go za pomocą lambda:
Teraz użyjmy mapy, która jest tym samym, ale bardziej neutralna językowo. Mapy wymagają 2 argumentów:
(i) jedna funkcja
(ii) iterowalne
I daje listę, w której każdy element jest funkcją zastosowaną do każdego elementu iterowalnego.
Korzystając z mapy, mielibyśmy:
Jeśli opanujesz lambdas i mapowanie, będziesz miał wielką moc manipulowania danymi w zwięzły sposób. Funkcje Lambda nie są ani niejasne, ani nie usuwają przejrzystości kodu. Nie myl czegoś twardego z czymś nowym. Gdy zaczniesz ich używać, przekonasz się, że jest to bardzo jasne.
źródło
Jedną z fajnych rzeczy,
lambda
które moim zdaniem są zaniżone, jest to, że odracza ocenę prostych formularzy, dopóki wartość nie będzie potrzebna. Pozwól mi wyjaśnić.Wiele procedur bibliotecznych jest zaimplementowanych w taki sposób, że pozwalają na wywołanie niektórych parametrów (z których jednym jest lambda). Chodzi o to, że rzeczywista wartość zostanie obliczona tylko w momencie, w którym zostanie użyta (a raczej w momencie jej wywołania). (Pomyślny) przykład może pomóc zilustrować ten punkt. Załóżmy, że masz procedurę, która miała rejestrować dany znacznik czasu. Chcesz, aby rutyna wykorzystywała bieżący czas minus 30 minut. Można to tak nazwać
Załóżmy teraz, że faktyczna funkcja zostanie wywołana tylko wtedy, gdy wystąpi określone zdarzenie i chcesz, aby znacznik czasu był obliczany tylko w tym czasie. Możesz to zrobić w ten sposób
Zakładając, że
log_timestamp
poradzi sobie z takimi wywołaniami, oceni to, kiedy będzie tego potrzebować, i otrzymasz znacznik czasu w tym czasie.Istnieją oczywiście alternatywne sposoby (np. Użycie
operator
modułu), ale mam nadzieję, że przekazałem ten punkt.Aktualizacja : Oto nieco bardziej konkretny przykład ze świata rzeczywistego.
Aktualizacja 2 : Myślę, że jest to przykład czegoś, co nazywa się młotem .
źródło
Jak wspomniano powyżej, operator lambda w Pythonie definiuje funkcję anonimową, aw funkcjach Pythona są zamknięciami. Ważne jest, aby nie mylić pojęcia zamknięć z operatorem lambda, który jest dla nich jedynie składniowym metadonem.
Kiedy zacząłem w Pythonie kilka lat temu, często używałem lambdów, myśląc, że są fajne, wraz z listami. Napisałem jednak i muszę prowadzić dużą stronę internetową napisaną w języku Python, z rzędu kilku tysięcy punktów funkcyjnych. Nauczyłem się z doświadczenia, że lambda mogą być w porządku przy prototypowaniu, ale nie oferują nic poza funkcjami wbudowanymi (nazwanymi zamknięciami), z wyjątkiem zaoszczędzenia kilku naciśnięć klawiszy, a czasem nie.
Zasadniczo sprowadza się to do kilku punktów:
To wystarczający powód, aby je zaokrąglić w górę i przekonwertować na nazwane zamknięcia. Mam jednak dwie inne pretensje do anonimowych zamknięć.
Pierwszą urazą jest to, że są one po prostu kolejnym niepotrzebnym słowem kluczowym zaśmiecającym język.
Druga uraza jest głębsza i na poziomie paradygmatu, tzn. Nie podoba mi się, że promują styl programowania funkcjonalnego, ponieważ ten styl jest mniej elastyczny niż przekazywanie wiadomości, style obiektowe lub proceduralne, ponieważ rachunek lambda nie jest metodą Turinga ukończone (na szczęście w Pythonie nadal możemy przełamać to ograniczenie nawet w lambda). Czuję, że lambdas promują ten styl:
Istnieje ukryty zwrot, tzn. Wydaje się, że „powinny” być funkcjami.
Stanowią one alternatywny mechanizm ukrywania stanu w stosunku do innego, bardziej wyraźnego, bardziej czytelnego, bardziej wielokrotnego użytku i bardziej ogólnego mechanizmu: metod.
Staram się pisać w języku Python wolnym od lambda i usuwam lambdy na widok. Myślę, że Python byłby nieco lepszym językiem bez lambdas, ale to tylko moja opinia.
źródło
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
Lambda to tak naprawdę bardzo potężne konstrukcje, które wynikają z pomysłów w programowaniu funkcjonalnym, i jest to coś, co w żadnym wypadku nie będzie łatwe do poprawienia, przedefiniowania lub usunięcia w najbliższej przyszłości Pythona. Pomagają Ci pisać kod, który jest potężniejszy, ponieważ pozwala przekazywać funkcje jako parametry, a tym samym ideę funkcji jako obywateli pierwszej klasy.
Jagnięta często się mylą, ale po uzyskaniu solidnego zrozumienia możesz napisać czysty elegancki kod w następujący sposób:
Powyższy wiersz kodu zwraca listę kwadratów liczb na liście. Oczywiście możesz to również zrobić w następujący sposób:
Oczywiste jest, że poprzedni kod jest krótszy, a jest to szczególnie prawdziwe, jeśli zamierzasz używać funkcji mapy (lub dowolnej podobnej funkcji, która przyjmuje funkcję jako parametr) tylko w jednym miejscu. Dzięki temu kod jest bardziej intuicyjny i elegancki.
Ponadto, jak wspomniał Dawid Zasławski w swojej odpowiedzi, zrozumienie listy nie zawsze jest właściwą drogą, szczególnie jeśli twoja lista musi uzyskać wartości z niejasnej matematyki.
Z bardziej praktycznego punktu widzenia jedną z największych zalet lambdas było ostatnio GUI i programowanie oparte na zdarzeniach. Jeśli spojrzysz na wywołania zwrotne w Tkinter, wszystko, co biorą za argument, to zdarzenie, które je wywołało. Na przykład
A co jeśli masz jakieś argumenty do przekazania? Coś tak prostego, jak przekazanie 2 argumentów do przechowywania współrzędnych kliknięcia myszy. Możesz to łatwo zrobić w następujący sposób:
Teraz możesz argumentować, że można to zrobić za pomocą zmiennych globalnych, ale czy naprawdę chcesz uderzyć głową, martwiąc się o zarządzanie pamięcią i wyciek, szczególnie jeśli zmienna globalna będzie używana tylko w jednym konkretnym miejscu? To byłby kiepski styl programowania.
Krótko mówiąc, lambdas są niesamowite i nigdy nie należy ich lekceważyć. Jednak lambda Pythona to nie to samo, co lambda LISP (które są mocniejsze), ale naprawdę można z nimi zrobić wiele magicznych rzeczy.
źródło
main
i wdo_something_cool
? Co dzieje sięx
iy
w funkcji? Przekazywane wartości wydają się być natychmiast zastępowane? Skąd ta funkcja wie o tymevent
? Czy możesz dodać jakieś komentarze / wyjaśnienia? Dziękix
ay
jako argumentydo-something-cool
i ich wartości są ustawione w funkcji celu zilustrowania, jak można wykorzystać lambdy przekazywać argumenty gdzie są spodziewane żadne.widget.bind
Funkcja oczekujeevent
parametr, który identyfikuje zdarzenie GUI na danym widget. Polecam lekturę modelu programowania Tkintera dla większej przejrzystości.x,y
a potem rozumieszx=event.x
. Czy to nie zastępuje przekazanej wartości? A skąd funkcja wie, coevent
to jest? Nie widzę, gdzie przekazujesz to do funkcji. Czy jest to metoda? Czy dozwolone są także znaki minus w nazwie funkcji?x, y
, to tylko przykład dla celów ilustracyjnych. Próbuję pokazać moc lambdów, a nie Tkintera. :)event
? w takim razie czy twoja lambda nie powinna czytaćlambda event: do_something_cool(event,x,y)
?Lambdas są ogólnie głęboko związane z funkcjonalnym stylem programowania. Pomysł, że możesz rozwiązać problemy, stosując funkcję do niektórych danych i łącząc wyniki, jest tym, czego Google używa do implementacji większości swoich algorytmów.
Programy napisane w funkcjonalnym stylu programowania można łatwo zrównoleglać, a tym samym stają się coraz ważniejsze dzięki nowoczesnym maszynom wielordzeniowym. Krótko mówiąc, NIE, nie powinieneś ich zapomnieć.
źródło
Pierwsze gratulacje, które udało się dowiedzieć lambda. Moim zdaniem jest to naprawdę potężny konstrukt do działania. Trend w kierunku funkcjonalnych języków programowania jest z pewnością wskaźnikiem, że nie należy go unikać ani nie zostanie on na nowo zdefiniowany w najbliższej przyszłości.
Musisz tylko pomyśleć trochę inaczej. Jestem pewien, że wkrótce to pokochasz. Ale bądź ostrożny, jeśli masz do czynienia tylko z pytonem. Ponieważ lambda nie jest prawdziwym zamknięciem, jest w jakiś sposób „zepsuta”: pytony lambda są zepsute
źródło
Zauważ, że to nie jest potępienie czegokolwiek. Każdy ma inny zestaw rzeczy, które nie przychodzą łatwo.
Nie.
To nie jest niejasne. Ostatnie 2 zespoły, nad którymi pracowałem, wszyscy korzystali z tej funkcji przez cały czas.
Nie widziałem żadnych poważnych propozycji przedefiniowania go w Pythonie, poza ustaleniem semantyki zamykania kilka lat temu.
Nie jest mniej jasne, jeśli używasz go prawidłowo. Wręcz przeciwnie, posiadanie większej liczby dostępnych konstrukcji językowych zwiększa przejrzystość.
Lambda jest jak przepełnienie bufora? Łał. Nie mogę sobie wyobrazić, jak używasz lambda, jeśli uważasz, że to „koszmar konserwacji”.
źródło
Używam lambdas, aby uniknąć dublowania kodu. Ułatwiłoby to zrozumienie funkcji Np .:
Zastępuję to tempem lambda
źródło
Zacząłem dziś czytać książkę Davida Mertza „Przetwarzanie tekstu w Pythonie”. Chociaż ma dość zwięzły opis Lambdy, przykłady w pierwszym rozdziale w połączeniu z objaśnieniem w Załączniku A sprawiły, że zeskoczyli ze mnie (wreszcie) i nagle zrozumiałem ich wartość. To nie znaczy, że jego wyjaśnienie zadziała dla ciebie i wciąż jestem na etapie odkrywania, więc nie będę próbował dodawać do tych odpowiedzi innych niż następujące: Jestem nowy w Pythonie Jestem nowy w OOP Lambdas były dla mnie walką Teraz, gdy czytam Mertza, myślę, że je dostaję i uważam je za bardzo przydatne, ponieważ uważam, że pozwalają one na czystsze podejście do programowania.
Odtwarza Zen Pythona, którego jedna linia jest prosta, jest lepsza niż złożona. Jako programista inny niż OOP czytający kod za pomocą lambdas (i do końca listy ze zrozumieniem w zeszłym tygodniu) myślałem - to jest proste? . W końcu uświadomiłem sobie dzisiaj, że w rzeczywistości te funkcje sprawiają, że kod jest znacznie bardziej czytelny i zrozumiały niż alternatywa - która zawsze jest pewnego rodzaju pętlą. Uświadomiłem sobie również, że podobnie jak sprawozdania finansowe, Python nie został zaprojektowany dla początkującego użytkownika, a raczej dla użytkownika, który chce się uczyć. Nie mogę uwierzyć, jak potężny jest ten język. Kiedy dotarło do mnie (wreszcie) cel i wartość lambdas, chciałem rozerwać około 30 programów i zacząć od nowa, w stosownych przypadkach, lambdas.
źródło
Przydatnym przykładem użycia lambdów jest poprawa czytelności długich list . W tym przykładzie
loop_dic
brakuje jasności, ale wyobraź sobie,loop_dic
że jesteś bardzo długi. Jeśli użyjesz zwykłej wartości, która zawierai
zamiast wersji lambda tej wartości, otrzymaszNameError
.Zamiast
źródło
Mogę podać przykład, w którym naprawdę potrzebowałem lambda poważnie. Tworzę program graficzny, w którym kliknięcie pliku prawym przyciskiem myszy i przypisanie mu jednej z trzech opcji. Okazuje się, że w Tkinter (program interfejsu GUI, w którym to piszę), kiedy ktoś naciska przycisk, nie można go przypisać do polecenia, które przyjmuje argumenty. Więc jeśli wybrałem jedną z opcji i chciałbym, aby wynikiem mojego wyboru było:
Więc nic wielkiego. Ale co, jeśli potrzebuję mojego wyboru, aby mieć konkretny szczegół. Na przykład, jeśli wybiorę opcję A, wywołuje ona funkcję, która przyjmuje argument zależny od wyboru A, B lub C, TKinter nie może tego obsłużyć. Lamda była jedyną opcją na obejście tego ...
źródło
def foo...
a następnie poddać sięfoo
zamiastlambda
. To tylko więcej kodu i musisz wymyślić nazwę.Używam go dość często, głównie jako obiekt zerowy lub w celu częściowego powiązania parametrów z funkcją.
Oto przykłady:
aby zaimplementować wzorzec obiektu zerowego:
dla wiązania parametrów:
powiedzmy, że mam następujący interfejs API
Następnie, gdy nie chcę szybko zrzucić otrzymanych danych do pliku, robię to:
źródło
używam
lambda
do tworzenia wywołań zwrotnych zawierających parametry. Czystsze jest pisanie lambda w jednym wierszu niż pisanie metody wykonywania tej samej funkcjonalności.Na przykład:
w przeciwieństwie do:
źródło
Jestem początkującym w Pythonie, więc aby uzyskać jasne pojęcie o lambda, porównałem go z pętlą „za”; pod względem wydajności. Oto kod (python 2.7) -
źródło
timeit
modułem, który zazwyczaj daje dokładniejsze wyniki niż odejmowanietime.time()
wartości.Lambda jest konstruktorem procedur. Możesz syntetyzować programy w czasie wykonywania, chociaż lambda Pythona nie jest bardzo potężna. Zauważ, że niewiele osób rozumie tego rodzaju programowanie.
źródło