ProgrammazioneSviluppatore Backend

Parla del lavoro degli iteratori in Python. Come implementare un proprio iteratore? Qual è la differenza tra iteratori e oggetti iterabili?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Python, gli iteratori sono oggetti che implementano il protocollo dell'iteratore: i metodi __iter__() e __next__(). Gli iteratori gestiscono il proprio stato interno e ad ogni chiamata di next() restituiscono il successivo elemento della sequenza o sollevano un'eccezione StopIteration una volta raggiunta la fine.

Gli oggetti iterabili sono quelli su cui si può iterare in un ciclo (ad esempio, liste, stringhe, dizionari). Tutti questi hanno un metodo __iter__() che restituisce un iteratore.

Per implementare un proprio iteratore, è necessario creare una classe con i metodi __iter__() (restituisce self) e __next__() (implementa la logica per ottenere il successivo elemento):

class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 for num in Counter(1, 3): print(num) # 1 2 3

Domanda ingannevole.

Qual è la differenza tra oggetti iterabili e iteratori? È possibile iterare su un iteratore più di una volta?

Risposta: Un oggetto iterabile implementa solo il metodo __iter__(), che restituisce un iteratore. Un iteratore è un oggetto che ha il metodo __next__(). Un iteratore di solito può essere iterato solo una volta: dopo aver raggiunto la fine della sequenza, un'ulteriore iterazione non è possibile senza creare un nuovo iteratore.

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze della materia.


Storia

In un progetto per l'analisi dei log, uno sviluppatore ha scritto una funzione che accettava un iteratore e tentava di attraversarlo due volte (for log in logs:), aspettandosi che entrambe le iterazioni restituissero gli stessi risultati. La seconda iterazione non restituiva nulla, poiché l'iteratore era già "esaurito".


Storia

In un modulo, uno sviluppatore ha restituito da una funzione un generatore, consentendo una sola iterazione. Quando ha tentato di passarne uno a un'altra funzione, che si aspettava un oggetto iterabile per più passaggi, è emerso un errore inaspettato e un risultato vuoto.


Storia

In un progetto Web API, uno sviluppatore ha tentato di serializzare un iteratore direttamente in JSON. Gli iteratori non sono liste, e la conversione non è possibile senza prima convertirli in una lista (altrimenti la serializzazione si interrompe con un'eccezione).