¿Por qué querría usar itertools.islice en lugar del corte de lista normal?

Me parece que muchas funciones en el módulo de itertools tienen equivalentes más fáciles. Por ejemplo, por lo que puedo decir, itertools.islice(range(10),2,5) hace lo mismo que range(10)[2:5] , e itertools.chain([1,2,3],[4,5,6]) hace lo mismo que [1,2,3]+[4,5,6] . La página principal de documentación menciona las ventajas de la velocidad, pero ¿hay alguna otra razón para elegirlo además de esto?

Para abordar los dos ejemplos que mencionó:

 import itertools data1 = range(10) # This creates a NEW list data1[2:5] # This creates an iterator that iterates over the EXISTING list itertools.islice(data1, 2, 5) data2 = [1, 2, 3] data3 = [4, 5, 6] # This creates a NEW list data2 + data3 # This creates an iterator that iterates over the EXISTING lists itertools.chain(data2, data3) 

Hay muchas razones por las que querría usar iteradores en lugar de los otros métodos. Si las listas son muy grandes, podría ser un problema crear una nueva lista que contenga una sub-lista grande, o especialmente crear una lista que tenga una copia de otras dos listas. El uso de islice() o chain() permite iterar sobre la (s) lista (s) de la manera que desee, sin tener que usar más memoria o cálculo para crear las nuevas listas. Además, como mencionó Unutbu , no puede usar el corte o la adición de corchetes con los iteradores.

Espero que sea una respuesta suficiente; hay muchas otras respuestas y otros recursos que explican por qué los iteradores son increíbles, por lo que no quiero repetir toda esa información aquí.

itertools.islice puede cortar iteradores . La indexación solo funciona con secuencias . Por ejemplo,

 In [64]: iterator = (x**2 for x in range(10)) In [65]: list(IT.islice(iterator, 2, 5)) Out[65]: [4, 9, 16] In [66]: iterator[2:5] TypeError: 'generator' object has no attribute '__getitem__'