2012-10-05 10 views
7

To jest mój kod:Dlaczego lambda prosi o 2 argumenty pomimo podania 2 argumentów?

filter(lambda n,r: not n%r,range(10,20))

pojawia się błąd:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

Więc potem próbowałem:

foo=lambda n,r:not n%r

który działał dobrze. Tak myślałem, że to będzie działać:

bar=filter(foo,range(10,20))

Ale znowu:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

Coś podobnego dzieje się na mapie, jak również. Ale zredukuj działa dobrze. Co ja robię źle? Czy brakuje mi czegoś kluczowego, potrzebnego do użycia filtra lub mapy?

+1

'filtrem()' przechodzi jeden argument do swojego lambda, kiedy spodziewa się dwóch. Używanie zmiennej nie pozwoli ci ominąć tego. – NullUserException

Odpowiedz

5

Dlaczego używasz 2 argumentów? filter() i map() wymagają funkcji z tylko jednym argumentem, np

filter(lambda x: x >= 2, [1, 2, 3]) 
>>> [2, 3] 

aby znaleźć czynniki szeregu (można zastąpić go z lambda również):

def factors(x): 
    return [n for n in range(1, x + 1) if x % n == 0] 

factors(20) 
>>> [1, 2, 4, 5, 10, 20] 
+0

OK, to ma sens. Więc jak mam napisać ten kod, który musi zwrócić czynniki dla liczby. Chcę użyć filtra lub mapy, aby lepiej to zrozumieć ... lub przynajmniej lambda – ritratt

+1

Proszę zobaczyć zaktualizowaną odpowiedź. –

+1

Oczywiście można to zoptymalizować, aby wyszukać po prostu sqrt (x) i dodać x/n oraz n do wyników, gdy 'x% n == 0'. Będzie to miało wpływ na to, kiedy liczby będą większe. – NullUserException

4

Ponieważ filter w python ma tylko jeden argument. Musisz więc zdefiniować funkcję lambda/funkcję, która pobiera tylko jeden argument, jeśli chcesz go użyć w filtrze.

0

Twoja funkcja lambda trwa dwa argumenty: n i r. filter musi być wywołany z funkcją, która przyjmuje jeden argument i zwraca True, gdy element powinien być przechowywany. Może chciałeś zdefiniować r lub n poza swoją funkcją lambda, a następnie przechwycić ją w zamknięciu.

2

Po uruchomieniu mapy lub filtrować na zestawie klucz-wartość, a następnie dodać nawiasy wokół (k, v), takich jak:

.filter(lambda (k,v): k*2 + v) 
Powiązane problemy