Dlaczego Lambdy Pythona są przydatne? [zamknięte]

Próbuję rozgryźć Pythona lambda. Czy lambda jest jedną z tych" ciekawych " pozycji językowych, o których w prawdziwym życiu należy zapomnieć?

Jestem pewien, że są pewne skrajne przypadki, w których może być to potrzebne, ale biorąc pod uwagę jego zaciemnienie, potencjał przedefiniowania w przyszłych wydaniach (moje założenie opiera się na różnych jego definicjach) i zmniejszoną klarowność kodowania-czy należy tego unikać?

Przypomina mi to przepełnienie (przepełnienie bufora) typów C-wskazując na górna zmienna i przeciążenie, aby ustawić inne wartości pola. Wygląda to jak pokaz techniczny, ale koszmar programisty.

Author: ayhan, 2009-05-21

26 answers

Mówisz o funkcjach lambda ? Jak

lambda x: x**2 + 2*x - 5

Te rzeczy są naprawdę bardzo przydatne. Python obsługuje styl programowania o nazwie Programowanie funkcyjne, w którym można przekazywać funkcje do innych funkcji w celu wykonywania różnych czynności. Przykład:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Ustawia mult3 na [3, 6, 9], te elementy oryginalnej listy, które są wielokrotnościami 3. Jest to krótsze (i, można argumentować, jaśniejsze) niż

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Oczywiście, w tym konkretnym przypadku, można zrób to samo, co zrozumienie listy:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(lub nawet jako range(3,10,3)), ale jest 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ótszą drogą do napisania czegoś.

  • Zwracanie funkcji z innej funkcji

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7
    

    Jest to często używane do tworzenia wrapperów funkcji, takich jak dekoratory Pythona.

  • Łączenie elementów sekwencji iteracyjnej z reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • Sortowanie według klucza alternatywnego

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

Używam funkcji lambda na bieżąco. Trochę mi zajęło przyzwyczajenie się do nich, ale w końcu zrozumiałem, że są bardzo cenną częścią języka.

 908
Author: David Z,
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-12-06 11:26:54

lambda to tylko wymyślny sposób na powiedzenie function. Poza jego nazwą nie ma w nim nic niejasnego, zastraszającego lub tajemniczego. Kiedy czytasz następujący wiersz, zastąp lambda przez function w umyśle:

>>> f = lambda x: x + 1
>>> f(3)
4

Definiuje tylko funkcję x. Niektóre inne języki, jak R, mówią wprost:

> f = function(x) { x + 1 }
> f(3)
4
Widzisz? To jedna z najbardziej naturalnych rzeczy do zrobienia w programowaniu.
 332
Author: user251650,
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
2010-01-16 15:03:17

Dwulinijkowe podsumowanie:

  1. zamknięcia : bardzo przydatne. Ucz się ich, używaj ich, kochaj ich.
  2. w Pythonie lambda słowo kluczowe: niepotrzebne, czasem przydatne. Jeśli zrobisz z nim coś skomplikowanego, odłóż to i zdefiniuj prawdziwą funkcję.
 96
Author: John Fouhy,
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-05-20 22:37:58

Lambda jest częścią bardzo ważnego mechanizmu abstrakcji, który zajmuje się funkcjami wyższego rzędu. Aby dobrze zrozumieć jego wartość, obejrzyj wysokiej jakości lekcje od Abelsona i Sussmana i przeczytaj książkę SICP

Są to zagadnienia istotne we współczesnym biznesie oprogramowania i coraz bardziej popularne.

 72
Author: egaga,
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-05-20 20:49:01

Wątpię, żeby lambda odeszła. Zobacz post Guido o tym, że w końcu rezygnujesz z próby usunięcia go. Zobacz też zarys konfliktu .

Możesz sprawdzić ten post, aby uzyskać więcej informacji na temat transakcji stojącej za funkcjami Pythona: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

Co ciekawe, mapowanie, filtrowanie i redukowanie funkcji, które pierwotnie motywowały wprowadzenie lambda i innych funkcje funkcjonalne zostały w dużym stopniu zastąpione przez składanie list i wyrażenia generatora. W rzeczywistości funkcja reduce została usunięta z listy wbudowanych funkcji w Pythonie 3.0. (Nie ma jednak potrzeby wysyłania skarg na usunięcie lambda, mapy lub filtra: zostają. :-)

Moje dwa grosze: rzadko lambda jest tego warta, jeśli chodzi o jasność. Ogólnie rzecz biorąc, istnieje bardziej jasne rozwiązanie, które nie obejmuje lambda.

 57
Author: rhettg,
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-30 23:44:51

Lambda są niezwykle przydatne w programowaniu GUI. Na przykład, powiedzmy, że tworzysz grupę przycisków i chcesz użyć jednego sparamatyzowanego wywołania zwrotnego, a nie unikalnego wywołania zwrotnego na przycisk. Lambda pozwala to osiągnąć z łatwością:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(Uwaga: chociaż to pytanie dotyczy konkretnie lambda, Możesz również użyć functools.częściowe , aby uzyskać ten sam typ wyniku)

Alternatywą jest utworzenie osobnego wywołania zwrotnego dla każdego przycisku, który może doprowadzić do zduplikowanego kodu.

 56
Author: Bryan Oakley,
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-07-27 14:50:07

W Pythonie, lambda jest tylko sposobem definiowania funkcji inline,

a = lambda x: x + 1
print a(1)

I..

def a(x): return x + 1
print a(1)

..są dokładne takie same.

W Pythonie funkcje są obiektami jak Wszystko inne, a lambda po prostu definiuje funkcję:
>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

Szczerze myślę, że słowo kluczowe lambda jest zbędne w Pythonie-nigdy nie miałem potrzeby ich używać (lub widziałem takie używane, gdy zwykły funkcja, rozumienie listy lub jedna z wielu wbudowanych funkcji mogły być lepiej użyte) {]}

Na zupełnie przypadkowy przykład, z artykułu "Lambda Pythona jest zepsuta!":

Aby zobaczyć jak lambda jest zepsuta, spróbuj wygenerować listę funkcji fs=[f0,...,f9] gdzie fi(n)=i+n. Pierwsza próba:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

Argumentowałbym, nawet gdyby to zadziałało, to jest strasznie i "niepytoniczne", ta sama funkcjonalność mogłaby być napisana na wiele innych sposobów, dla przykład:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Tak, to nie to samo, ale ja nigdy nie widziałem przyczyny, w której generowanie grupy funkcji lambda na liście było wymagane. Może to mieć sens w innych językach, Ale Python nie jest Haskell (ani Lisp, ani ...)

Należy pamiętać, że możemy użyć lambda i nadal osiągnąć pożądane wyniki w ten sposób:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

Edit:

Jest kilka przypadków, w których lambda jest przydatna, na przykład jest często wygodna, gdy łączenie sygnałów w aplikacjach PyQt, jak to:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

Samo wykonanie w.textChanged.connect(dothing) wywołałoby metodę dothing z dodatkowym argumentem event i wywołałoby błąd. Użycie lambda oznacza, że możemy spokojnie upuścić argument bez konieczności definiowania funkcji owijania.

 31
Author: dbr,
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
2018-04-02 13:13:20

Uważam, że lambda jest użyteczna dla listy funkcji, które robią to samo, ale w różnych okolicznościach. Podobnie jak Mozilla plural rules .

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

Jeśli będziesz musiał zdefiniować funkcję dla wszystkich z nich, oszalejesz do końca. Również nie byłoby miło z nazwami funkcji, takimi jak plural_rule_1, plural_rule_2, itd. I musiałbyś eval() to, gdy jesteś zależny od zmiennej funkcji id.

 28
Author: Tor Valamo,
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
2018-06-21 02:59:16

Prawie wszystko, co możesz zrobić z lambda możesz zrobić lepiej z nazwanymi funkcjami lub wyrażeniami list i generatora.

W związku z tym w większości przypadków powinieneś być jednym z tych w praktycznie każdej sytuacji (może z wyjątkiem kodu zdrapkowego napisanego w interaktywnym interpreterze).

 26
Author: Aaron Maenpaa,
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-05-20 20:45:27

Używam Pythona od kilku lat i nigdy nie trafiłem do sprawy, w której potrzebowałem lambda. Tak naprawdę, jak mówi samouczek , to tylko dla cukru składniowego.

 19
Author: Matt Schmidt,
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-05-20 20:47:48

Nie mogę mówić o konkretnej implementacji lambda w Pythonie, ale ogólnie funkcje lambda są naprawdę przydatne. Są one podstawową techniką (może nawet techniką) programowania funkcyjnego, a także są bardzo przydatne w programach zorientowanych obiektowo. W przypadku niektórych rodzajów problemów są one najlepszym rozwiązaniem, więc na pewno nie należy o nich zapominać!

Proponuję poczytać o closures i map function (która łączy się z Pythonem docs, ale istnieje w prawie każdym język, który obsługuje konstrukty funkcjonalne), aby zobaczyć, dlaczego jest przydatny.

 17
Author: rmeador,
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-05-20 20:45:12

Funkcja Lambda jest to niebiurokratyczny sposób tworzenia funkcji.

To wszystko. Na przykład, przyjmijmy, że masz swoją główną funkcję i potrzebujesz kwadratu wartości. Zobaczmy tradycyjny sposób i sposób lambda, aby to zrobić:

Tradycyjny sposób:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

Droga lambda:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something
Widzisz różnicę?

Funkcje Lambda bardzo dobrze współgrają z listami, takimi jak składanie list czy Mapa. W rzeczywistości rozumienie listy jest "pythonicznym" sposobem wyrażania używasz lambdy. Ex:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

Zobaczmy, co oznaczają poszczególne elementy składni:

[] : "Daj mi listę"

X * * 2 : "używanie tej nowo narodzonej funkcji"

Dla x W a: "do każdego elementu w a"

To wygodne, co? Tworzenie takich funkcji. Przepisz go używając lambda:
>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

Teraz użyjmy mapy, która jest tym samym, ale bardziej neutralnym językowo. Mapy przyjmują 2 argumenty:

(i) jeden function

(ii) iterowalny

I daje listę, gdzie każdy element jest funkcją zastosowaną do każdego elementu iterable.

Więc używając mapy mamy:

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)
Jeśli opanujesz lambda i mapowanie, będziesz miał wielką moc manipulowania danymi i to w zwięzły sposób. Funkcje Lambda nie są ani niejasne, ani nie odbierają jasności kodu. Nie myl czegoś twardego z czymś nowym. Gdy zaczniesz ich używać, przekonasz się, że jest to bardzo jasne.
 16
Author: Lucas Ribeiro,
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-09-01 19:31:56

Jedną z fajnych rzeczy w lambda, która moim zdaniem jest zaniżona, jest to, że jest to sposób na odroczenie oceny dla prostych form, aż do potrzebnej wartości. Pozwól mi wyjaśnić.

Wiele procedur bibliotecznych jest zaimplementowanych tak, że pozwalają one na wywołanie pewnych parametrów (z których lambda jest jednym). Chodzi o to, że rzeczywista wartość będzie obliczana tylko w momencie, gdy będzie używana (a raczej wtedy, gdy zostanie wywołana). (Wymyślony) przykład może pomóc zilustrować punkt. Załóżmy, że masz rutynę, która miała zrobić dziennik danego znacznika czasu. Chcesz, aby rutyna używała bieżącego czasu minus 30 minut. You ' d call it like so

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

Teraz Załóżmy, że rzeczywista funkcja zostanie wywołana tylko wtedy, gdy wystąpi pewne zdarzenie i chcesz, aby znacznik czasu był obliczany tylko w tym czasie. Możesz to zrobić tak

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

Zakładając, że log_timestamp poradzi sobie z takimi wywołaniami, oceni to, kiedy będzie tego potrzebował i otrzymasz znacznik czasu czas.

Są oczywiście alternatywne sposoby, aby to zrobić (na przykład za pomocą modułu operator), ale mam nadzieję, że przekazałem punkt.

Aktualizacja: tutaj jest nieco bardziej konkretny przykład z prawdziwego świata.

Update 2: myślę, że jest to przykład tego, co nazywa się thunk .

 13
Author: Noufal Ibrahim,
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-10-29 03:37:30

Jak wspomniano powyżej, operator lambda w Pythonie definiuje funkcję anonimową, a w Pythonie funkcje są zamknięciami. Ważne jest, aby nie mylić pojęcia zamknięć z operatorem lambda, który jest dla nich jedynie metadonem składniowym.

Kiedy zaczynałem kilka lat temu w Pythonie, często używałem lambda, uważając, że są fajne, wraz z list comprehensions. Jednak napisałem i muszę utrzymywać dużą stronę internetową napisaną w Pythonie, z rzędu kilku tysięcy punkty funkcyjne. Z doświadczenia dowiedziałem się, że lambdy mogą być w porządku do prototypowania rzeczy z, ale nie oferują nic nad funkcjami inline (nazwane zamknięcia) z wyjątkiem zapisania kilku klawiszy, a czasami nie.

Zasadniczo sprowadza się to do kilku punktów:

  • łatwiej jest odczytać oprogramowanie, które jest wyraźnie napisane przy użyciu znaczących nazw. Anonimowe zamknięcia z definicji nie mogą mieć wymownej nazwy, ponieważ nie mają nazwy. Ta zwięzłość wydaje się z jakiegoś powodu również zarażać parametry lambda, stąd często widzimy przykłady takie jak lambda X: x + 1
  • [7]}łatwiej jest ponownie użyć nazw zamknięć, ponieważ można je nazwać po imieniu więcej niż raz, gdy istnieje nazwa, aby się do nich odnieść.
  • łatwiej jest debugować kod, który używa nazwanych zamknięć zamiast lambda, ponieważ nazwa pojawi się w traceback i wokół błędu.

To wystarczający powód, aby je zaokrąglić i przekształcić w nazwane zamknięcia. Jednak mam dwie inne urazy do anonimowe zamknięcia.

Pierwsza uraza polega na tym, ż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 funkcyjnego, ponieważ styl ten jest mniej elastyczny niż style przekazywania wiadomości, zorientowane obiektowo lub proceduralne, ponieważ rachunek lambda nie jest Turing-complete (na szczęście w Pythonie możemy jeszcze wyrwać się z tego ograniczenia nawet wewnątrz lambda). Powody, dla których uważam, że lambdy promują ten styl to:

  • Istnieje niejawny zwrot, tzn. wydaje się, że "powinny" być funkcjami.

  • Są one alternatywnym mechanizmem ukrywania stanu dla innego, bardziej wyraźnego, bardziej czytelnego, bardziej wielokrotnego użytku i bardziej ogólnego mechanizmu: metod.

Staram się pisać lambda-Free Python i usuwać lambda na widoku. Myślę, że Python byłby nieco lepszym językiem bez lambda, ale to tylko mój opinia.

 11
Author: Mike A,
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
2010-10-18 18:01:05

Lambda są w rzeczywistości bardzo potężnymi konstrukcjami, które wynikają z pomysłów w programowaniu funkcyjnym, i jest to coś, co w żadnym wypadku nie będzie łatwo poprawione, zdefiniowane lub usunięte w niedalekiej przyszłości Pythona. Pomagają w pisaniu kodu, który jest bardziej wydajny, ponieważ pozwala przekazywać funkcje jako parametry, a tym samym ideę funkcji jako obywateli pierwszej klasy.

Lambdy bywają mylące, ale po uzyskaniu solidnego zrozumienia można napisać czysty, elegancki Kod, jak to:

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

Powyższy wiersz kodu zwraca listę kwadratów liczb z listy. Oczywiście, można też zrobić to tak:

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])

Jest oczywiste, że poprzedni kod jest krótszy, a jest to szczególnie ważne, jeśli zamierzasz używać funkcji map (lub jakiejkolwiek podobnej funkcji, która przyjmuje funkcję jako parametr) tylko w jednym miejscu. Dzięki temu kod jest bardziej intuicyjny i elegancki.

Również, jak wspomniał @ David Zaslavsky w swojej odpowiedzi, listy nie są zawsze sposób, aby przejść, zwłaszcza jeśli lista ma uzyskać wartości z jakiegoś niejasnego matematycznego sposobu.

Z bardziej praktycznego punktu widzenia, jedną z największych zalet lambda jest dla mnie ostatnio GUI i programowanie oparte na zdarzeniach. Jeśli spojrzysz na wywołania zwrotne w Tkinter, wszystko, co biorą jako argumenty, to zdarzenie, które je wywołało. Np.

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger
A gdybyś miał jakieś argumenty do przekazania? Coś tak prostego jak przekazanie 2 argumentów do przechowywania współrzędnych kliknięcie myszką. Można to łatwo zrobić tak:
def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff

Teraz możesz argumentować, że można to zrobić za pomocą zmiennych globalnych, ale czy naprawdę chcesz uderzyć się w głowę martwiąc się o zarządzanie pamięcią i wycieki, zwłaszcza jeśli zmienna globalna będzie używana tylko w jednym konkretnym miejscu? To byłby po prostu kiepski styl programowania.

Krótko mówiąc, lambdy są niesamowite i nigdy nie należy ich lekceważyć. Lambdy Pythona nie są tym samym co lambdy Lispa (które są mocniejsze), ale można z nimi zrobić wiele magicznych rzeczy.
 11
Author: varagrawal,
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
2013-05-24 13:02:56

Lambdy są głęboko związane ze stylem programowania funkcyjnego w ogóle. Idea, że można rozwiązać problemy poprzez zastosowanie funkcji do niektórych danych i łączenie wyników, jest tym, co google wykorzystuje do implementacji większości swoich algorytmów.

Programy napisane w stylu programowania funkcjonalnego, są łatwo równoległe i dlatego stają się coraz ważniejsze w nowoczesnych maszynach wielordzeniowych. Krótko mówiąc, Nie, Nie należy o nich zapominać.

 8
Author: Yogi,
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
2018-02-09 19:49:58

Pierwsze gratulacje, które zdołały rozgryźć lambdę. Moim zdaniem jest to naprawdę potężna konstrukcja do działania. Trend w dzisiejszych czasach w kierunku funkcjonalnych języków programowania jest z pewnością wskaźnikiem, że nie należy go unikać i nie zostanie ponownie zdefiniowany w najbliższej przyszłości.

Musisz myśleć trochę inaczej. Jestem pewien, że wkrótce to pokochasz. Ale uważaj, jeśli masz do czynienia tylko z Pythonem. Ponieważ lambda nie jest prawdziwym zamknięciem, jest jakoś "złamana": lambda jest zepsuta

 6
Author: Norbert Hartl,
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
2013-04-02 11:01:00
[1]}właśnie zaczynam Pythona i wbiegłem prosto w Lambdę - co zajęło mi trochę czasu, zanim się zorientowałem.
Zauważ, że to nie jest potępienie niczego. Każdy ma inny zestaw rzeczy, które nie przychodzą łatwo.

Czy lambda jest jedną z tych "ciekawych" pozycji językowych, o których w prawdziwym życiu należy zapomnieć?

Nie.

Jestem pewien, że są pewne skrajne przypadki, w których może być to potrzebne, ale biorąc pod uwagę ciemność it,

To nie jest niejasne. W ostatnich 2 zespołach, nad którymi pracowałem, wszyscy używali tej funkcji przez cały czas.

Potencjał tego przedefiniowania w przyszłych wydaniach (moje założenie oparte na różnych jego definicjach)

Nie widziałem żadnych poważnych propozycji ponownego zdefiniowania go w Pythonie, poza ustaleniem semantyki zamknięcia kilka lat temu.

I zmniejszona klarowność kodowania-czy należy tego unikać?

Jest nie mniej jasne, jeśli używasz dobrze. Wręcz przeciwnie, posiadanie większej liczby dostępnych konstrukcji językowych zwiększa klarowność .

To przypomina mi przepełnienie (przepełnienie bufora) typów C - wskazanie górnej zmiennej i przeciążenie, aby ustawić inne wartości pola...coś w rodzaju pokazu technicznego, ale koszmar programisty..

Lambda jest jak przepełnienie bufora? Wow. Nie wyobrażam sobie, jak używasz lambdy, jeśli myślisz, że to"koszmar konserwacyjny".
 5
Author: Ken,
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-05-20 20:57:23

Zacząłem czytać dzisiejszą książkę Davida Mertza " Przetwarzanie tekstu w Pythonie."Chociaż ma dość zwięzły opis Lambdy, przykłady w pierwszym rozdziale połączone z wyjaśnieniem w Dodatku A sprawiły, że skoczyły mi ze strony (w końcu) i nagle zrozumiałem ich wartość. To nie znaczy, że jego wyjaśnienie zadziała dla Ciebie i nadal jestem na etapie odkrycia, więc nie będę próbował dodawać do tych odpowiedzi innych niż następujące: Jestem nowy w Pythonie Jestem nowy w OOP Lambdy były dla mnie walką Teraz, gdy czytam Mertza, myślę, że je Rozumiem i widzę je tak bardzo przydatne, jak myślę, że pozwalają na czystsze podejście do programowania.

Odtwarza Zen Pythona, którego jedna linijka jest prosta jest lepsza niż złożona. jako programista nie-OOP czytający kod z lambda (i do zeszłego tygodnia składanie list) myślałem-to jest proste?. W końcu zdałem sobie dziś sprawę, że w rzeczywistości te funkcje sprawiają, że kod jest znacznie bardziej czytelny, a zrozumiałe niż alternatywa-która niezmiennie jest jakąś pętlą. Zdałem sobie również sprawę, że podobnie jak sprawozdania finansowe-Python nie został zaprojektowany dla początkujących użytkowników, a jest przeznaczony dla użytkownika, który chce się wykształcić. Nie mogę uwierzyć, jak potężny jest ten język. Kiedy mnie (w końcu) uświadomiło cel i wartość lambda chciałem zgrać około 30 programów i zacząć od nowa umieszczać lambda tam, gdzie to stosowne.

 5
Author: PyNEwbie,
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-05-21 01:08:31

Użytecznym przypadkiem użycia lambda jest poprawienie czytelności długich zestawień list . W tym przykładzie {[2] } jest skrótem od jasności, ale wyobraź sobie, że loop_dic jest bardzo długi. Jeśli użyjesz zwykłej wartości zawierającej i zamiast wersji lambda tej wartości, otrzymasz NameError.

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

Zamiast

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]
 5
Author: Bentley4,
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-11-03 12:35:20

Używam lambda, aby uniknąć powielania kodu. To sprawi, że funkcja będzie łatwo zrozumiała Eg:

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)

Zamieniam to na temp lambda

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)
 5
Author: balki,
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
2013-10-09 00:29:45

Jestem początkującym Pythonem, więc aby uzyskać jasne pojęcie lambda porównałem go z pętlą' for'; pod względem wydajności. Oto kod (python 2.7) -

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)
 5
Author: user3252158,
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-02-07 16:26:31

Mogę podać przykład, gdzie naprawdę potrzebowałem lambdy poważnie. Tworzę program graficzny, w którym za pomocą prawego przycisku klikamy na plik i przypisujemy mu jedną z trzech opcji. Okazuje się, że w Tkinter (w interfejsie graficznym, w którym to piszę), gdy ktoś naciśnie przycisk, nie można go przypisać do polecenia, które przyjmuje argumenty. Więc jeśli wybrałem jedną z opcji i chciałem, aby wynik mojego wyboru był:

print 'hi there'
To nic wielkiego. Ale co jeśli potrzebuję mojego wyboru miej szczególny szczegół. Na przykład, jeśli wybieram choice A, wywołuje funkcję, która przyjmuje jakiś argument, który jest zależny od wyboru A, B lub C, TKinter nie może tego wspierać. Lamda była jedyną opcją, żeby to obejść...
 5
Author: Glueberg,
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
2018-05-16 13:42:56

Używam go dość często, głównie jako obiekt null lub do częściowego powiązania parametrów z funkcją.

Oto przykłady:

Aby zaimplementować wzorzec obiektu null:

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

Dla wiązania parametrów:

Powiedzmy, że mam następujące API

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

Następnie, gdy nie chcę szybko zrzucić otrzymanych danych do pliku, robię to:

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()
 4
Author: Piotr Czapla,
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-05-20 21:20:18

Używam lambda do tworzenia wywołań zwrotnych zawierających parametry. Czystsze jest pisanie lambda w jednej linijce niż pisanie metody do wykonywania tej samej funkcjonalności.

Na przykład:

import imported.module

def func():
    return lambda: imported.module.method("foo", "bar")

W przeciwieństwie do:

import imported.module

def func():
    def cb():
        return imported.module.method("foo", "bar")
    return cb
 4
Author: NuclearPeon,
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-01-03 18:31:54

Lambda jest konstruktorem procedur. Można syntetyzować programy w czasie wykonywania, chociaż Lambda Pythona nie jest zbyt potężny. Zauważ, że niewiele osób rozumie tego rodzaju programowanie.

 2
Author: Nick Dandoulakis,
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-05-20 20:52:40