2014-04-05 2 views
5

Questa domanda è di tipo filosofico. C'è un modulo splendido itertools in Python 2, che fornisce, in particolare, equivalenti generatori per funzioni built-in Python come map, filter, zip o slice. E gli equivalenti sono chiamati imap, ifilter, izip, e islice, rispettivamente. Come ho capito, il prefisso i nel loro nome significa i terator. Ma c'è la stessa cosa su xrange: è un equivalente di range che restituisce un oggetto generatore anziché una lista grande. Quindi, perché non si chiama irange? Che cosa significa in realtà il prefisso x?Python 2: perché xrange non è chiamato irange?

risposta

4

Perché xrange() è stato aggiunto alla lingua prima di iteratori e non è esso stesso un iteratore.

Python 1.0 è stato rilasciato nel 1994, quindi xrange() è stato aggiunto molto presto. Probabilmente il x non ha un significato specifico qui.

Ma xrange() non è realmente un iteratore, è un iterable; puoi scorrere su di esso più volte, a differenza degli iteratori. È anche una sequenza, poiché ha una lunghezza e può essere indicizzata.

Come tale l'oggetto è stato rinominato in range() (sostituendo completamente la funzione Python 2 range() e il suo comportamento in sequenza è stato ulteriormente ampliato.

+0

Grazie, ma cosa significa ** x **? –

+0

In realtà non lo so; dovresti chiedere a Guido. Non penso che stia per niente. Probabilmente è un riferimento a un oggetto simile in un'altra lingua, o solo un prefisso per differenziarlo da 'range()'. –

+0

Non c'è una differenza nell'implementazione effettiva? Per quanto ne so, 'range()' in CPython è un'implementazione ottimizzata per la velocità, usando C long int, mentre 'irange() 'è un normale iteratore, fornendo la stessa funzionalità come' range() '. – Mkoch