2010-02-02 48 views

risposta

48

Range has three parameters.

è possibile scrivere range(0, 10, 2).

+4

Come xrange() – Will

+7

+1 per i collegamenti effettivi ai documenti ... perché così poche persone si preoccupano? –

8

Basta usare un passo di 2:

range(start, end, step) 
5

Prova:

range(0, 10, 2) 
0
>>> if 100 % 2 == 0 : print "even" 
... 
even 
6

Non so se questo è ciò che si desidera ascoltare, ma è abbastanza banale da filtro fuori valori dispari con la comprensione delle liste.

evens = [x for x in range(100) if x%2 == 0] 

o

evens = [x for x in range(100) if x&1 == 0] 

Si potrebbe anche utilizzare il parametro del passo facoltativo per range a contare da 2.

+0

Puoi anche scrivere 'map (lambda x: x * 2, range (0, 50))' – SLaks

+0

Completa l'ultima comprensione per ottenere quote: odds = [x per x nel range (100) se x & 1! = 0] –

0
#This is not suggestible way to code in Python, but it gives a better understanding 


numbers = range(1,10) 

even = [] 

for i in numbers: 

    if i%2 == 0: 

     even.append(i) 
print (even) 
-1
a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

b = [i for i in a if i % 2 == 0] 

print("Original List -->", a,"\n") 
print("and the Even Numbers-->", b) 
+0

Grazie per il tuo contributo. Si noti che questa è una domanda molto vecchia che contiene già molte buone risposte. In particolare, [la risposta di Sapph] (https://stackoverflow.com/a/2184774/2124834) contiene già la tecnica che stai descrivendo. – Marein

0

Ci sono anche un paio di modi per scrivere un pigro, infinito iteratore di numeri pari.

useremo il modulo itertools e more_itertools1 fare iteratori che emulano range().

import itertools as it 

import more_itertools as mit 


# Infinite iterators 
a = it.count(0, 2) 
b = mit.tabulate(lambda x: 2 * x, 0) 
c = mit.iterate(lambda x: x + 2, 0) 

Tutte le ultime opzioni in grado di generare una sequenza infinita di numeri pari, 0, 2, 4, 6, ....

si può trattare questi come qualsiasi generatore da loop su di loro, oppure è possibile selezionare n numeri della sequenza tramite itertools.islice o take dal itertools recipes es .:

mit.take(10, a) 
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Ciò equivale a list(range(0, 20, 2)). Tuttavia, a differenza range(), l'iteratore è in pausa e produrrà il prossimo gruppo di numeri pari se eseguire di nuovo:

mit.take(10, a) 
# [20, 22, 24, 26, 28, 30, 32, 34, 36, 38] 

dettagli

Le opzioni presentate sono tutte iteratori infiniti che start con una intero, ovvero 0.

  • a. itertools.count restituisce il valore successivo incrementato di uno step=2 (vedere equivalent code).
  • b. more_itertools.tabulate è un itertools recipe che associa una funzione a ciascun valore di una linea numerica (vedere source code).
  • c. more_itertools.iterate restituisce il valore iniziale (0). Quindi applica una funzione all'ultima voce (incrementando di 2), produce quel risultato e ripete questo processo (vedere source code).

1 Un pacchetto di terze parti che implementa molti strumenti utili, tra cui itertools recipes come ad esempio take e tabulate.

Problemi correlati