2015-11-25 8 views

risposta

1

Nel primo, ciascun elemento [2,4] viene confrontato x % 4 == 0. In quest'ultimo, filter applica la lambda a ogni articolo in q, che è non[2,4], ma piuttosto [4,16]. Quindi, x % 4 == 0 restituisce true true.

4
print(([x * x for x in range(2, 5, 2) if x % 4 == 0])) 

qui, range viene valutato come [2,4] e solo [4] è in grado di superare la condizione if

q = ([x * x for x in range(2, 5, 2)]) 
print(list(filter(lambda x: x % 4 == 0, q))) 

qui, q contiene x*x di ciascun elemento, quindi l'elenco è [2*2, 4*4] = [4, 16], ed entrambi gli elementi superano il selettore di filtro

2

Perché q contiene quadrati

In [2]: q 
Out[2]: [4, 16] 

e lambda x: x % 4 == 0 tornerà True per entrambi:

In [3]: 4 % 4 == 0 
Out[3]: True 

In [4]: 16 % 4 == 0 
Out[4]: True 

I numeri quadrati di lista dopo eseguire il controllo, che non riesce per 2 (2% 4 è):

In [5]: 2 % 4 == 0 
Out[5]: False 

Pertanto, 2 * 2 = 4 non sarà incluso nell'elenco.

In breve, se si vuole ottenere lo stesso comportamento, modificare la lista la vostra comprensione per i numeri quadrati prima di calcolare il resto:

[x * x for x in range(2, 5, 2) if pow(x, 2, 4) == 0] # [4, 16] 
#         ↖ equivalent to (x ** 2) % 4