Co robi poniższy kod?
a = lambda _:True
Z tego, co przeczytałem i przetestowałem w interaktywnym monicie, wydaje się, że jest to funkcja, która zawsze zwraca True
.
Czy dobrze to rozumiem? Mam nadzieję, że zrozumiem, dlaczego _
użyto również podkreślenia ( ).
lambda : True
_
, zamiastx
luba
czy cokolwiek innego. Jeśli ktoś chce wiedzieć, jak napisać funkcję lambda, która nie przyjmuje argumentów; oto jak: określenie to tak:my_lambda = lambda : 255
. Nazwij to tak:x = my_lambda()
możesz zastąpić255
dowolną zwracaną wartością.Odpowiedzi:
Nazwa
_
zmiennej is. Spróbuj. (Ta nazwa zmiennej jest zwykle nazwą ignorowanej zmiennej. Można powiedzieć, że jest to symbol zastępczy).Pyton:
>>> l = lambda _: True >>> l() <lambda>() missing 1 required positional argument: '_' >>> l("foo") True
Więc ta lambda wymaga jednego argumentu . Jeśli chcesz lambda bez argumentu, która zawsze zwraca
True
, zrób to:>>> m = lambda: True >>> m() True
źródło
Python 3.6.2
underMac OS 10.12
i działa._
jest powszechnie używana, gdy sama zmienna nie jest naprawdę potrzebna. To jak „zmienna do wyrzucenia”, po prostu symbol zastępczy, który nie jest przydatny.Podkreślenie to konwencja Pythona dotycząca nazwania nieużywanej zmiennej (np. Narzędzia do analizy statycznej nie zgłaszają jej jako nieużywanej zmiennej). W twoim przypadku argument lambda jest nieużywany, ale utworzony obiekt jest funkcją jednoargumentową, która zawsze zwraca
True
. Zatem twoja lambda jest nieco analogiczna do funkcji stałej w matematyce.źródło
Tak, jest to funkcja (lub lambda), która zwraca True. Podkreślenia , który jest zwykle zastępczy dla zmiennej ignorowany, jest konieczne w tym przypadku.
Przykład użycia takiej funkcji (która prawie nic nie robi):
dd = collections.defaultdict(lambda: True)
Gdy jest używany jako argument do defaultdict , możesz mieć
True
jako ogólną wartość domyślną.źródło
Lambda oznacza funkcję. Powyższe stwierdzenie jest takie samo jak pisanie
def f(_): return True
Dla lambda musi istnieć zmienna. Więc przekazujesz mu zmienną o nazwie
_
(podobnie możesz przekazaćx
,y
...)źródło
Podkreślenie
_
jest prawidłowym identyfikatorem i jest tutaj używane jako nazwa zmiennej. Zawsze zwróciTrue
argument przekazany do funkcji.>>>a('123') True
źródło
Poniżej znajduje się odpowiedni wiersz kodu:
a = lambda _:True
Tworzy funkcję mającą jeden parametr wejściowy:
_
. Podkreślenie to dość dziwny wybór nazwy zmiennej, ale to tylko nazwa zmiennej. Możesz używać_
wszędzie, nawet jeśli nie używasz funkcji lambda. Na przykład zamiast ....my_var = 5 print(my_var)
Możesz napisać:
_ = 5 print(_)
Był jednak powód, który
_
został użyty jako nazwa nazwy parametru zamiast czegoś w rodzajux
lubinput
. Za chwilę do tego dojdziemy.Po pierwsze, musimy wiedzieć, że słowo kluczowe lambda konstruuje funkcję podobną do
def
, ale o innej składni. Definicja funkcji lambdaa = lambda _:True
jest podobna do pisania:def a(_): return True
Tworzy funkcję o nazwie
a
z parametrem wejściowym_
i zwracaTrue
. Można by było równie łatwo napisaća = lambda x:True
,x
zamiast podkreślenia. Jednak konwencja jest taka, aby używać_
jako nazwy zmiennej, gdy nie zamierzamy jej używać. Rozważ następujące:for _ in range(1, 11): print('pear')
Zauważ, że indeks pętli nigdy nie jest używany w treści pętli. Chcemy po prostu, aby pętla wykonywała określoną liczbę razy. Jak
winklerrr
napisano, „nazwa zmiennej_
jest [...] jak„ zmienna do wyrzucenia ”, po prostu symbol zastępczy, który nie jest użyteczny”.Podobnie w przypadku `` a = lambda x: True ''
parametr wejściowy nie jest używany w treści funkcji. Tak naprawdę nie ma znaczenia, jaki jest argument wejściowy, o ile istnieje. Autor tej funkcji lambda napisał
_
zamiast czegoś podobnegox
, aby wskazać, że zmienna nie zostanie użyta.Zauważ, że lambda nie ma argumentu; Więc piszę
a()
, spowoduje błąd.Jeśli chcesz lambda bez argumentu, napisz coś takiego:
bar = lambda: True
Teraz dzwonienie
bar()
bez argumentów będzie działać dobrze. Lambda, która nie przyjmuje argumentów, nie musi zawsze zwracać tę samą wartość:import random process_fruit = lambda : random.random()
Powyższa funkcja lambda jest bardziej złożona niż coś, co zawsze zwraca tę samą stałą.
Jednym z powodów, dla których programiści czasami używają
lambda
słowa kluczowego zamiast słowa,def
są funkcje, które są szczególnie krótkie i proste. Zwróć uwagę, żelambda
definicja zazwyczaj mieści się w jednym wierszu, podczas gdy trudno jest zrobić to samo z instrukcją def. Kolejny powód, aby użyćlambda
zamiastdef
sf, gdy funkcja nie będzie ponownie używana. Jeśli nie chcemy później ponownie wywoływać funkcji, nie ma potrzeby nadawania jej nazwy. Weźmy na przykład pod uwagę następujący kod:def apply_to_each (transform, in_container): out_container = list () for idx, item in enumerate (container, 0): out_container [idx] = transform (item) return out_container
Teraz wykonujemy następujące wezwanie:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Zauważ, że
lambda x: x**2
nie ma etykiety. Dzieje się tak, ponieważ prawdopodobnie nie zadzwonimy do tego ponownie później, było to coś krótkiego i prostego, czego potrzebowaliśmy tymczasowo.Fakt, że funkcjom lambda nie trzeba nadawać nazwy, jest źródłem innej nazwy, która je opisuje: „funkcje anonimowe”.
Zauważ również, że instrukcje lambda są jak wywołanie funkcji, ponieważ zwracają referencję do funkcji, którą tworzą. Następujące jest nielegalne:
apply_to_each(def foo(x): x**2 , range(0, 101))
Podczas gdy
apply_to_each(lambda x: x**2 range(0, 101))
jest w porządku.Tak więc używamy
lambda
zamiastdef
i_
zamiast długiej nazwy zmiennej, gdy chcemy czegoś krótkiego, słodkiego i prawdopodobnie nie będziemy chcieli użyć go później.źródło