Iterator personalizzati

Programmazione a oggetti intermedia in Python

Jake Roach

Data Engineer

Iterator

Classi che permettono di attraversare una collezione di oggetti o uno stream di dati e restituire un elemento alla volta

  • Simili a list e tuple, ma si comportano in modo diverso
  • Navigare, trasformare, generare
  • Si iterano con i cicli for
  • Funzione next()

$$

Protocollo iterator...

# Collection
chuck = NameIterator("Charles Carmicheal")
for letter in chuck:
    print(letter)
C
h
u
...
# Data stream
fun_game = DiceGame(rolls=3)
next(fun_game)  # ... and so on
4
Programmazione a oggetti intermedia in Python

Protocollo degli iterator

__iter__()

  • Restituisce un iterator, in questo caso un riferimento a se stesso
  • ... return self

$$

__next__()

  • Restituisce il valore successivo nella collezione o nello stream di dati
  • Avvengono iterazione, trasformazione e generazione

$$

Sia __iter__() sia __next__() devono essere definiti perché una classe sia considerata un iterator!

Programmazione a oggetti intermedia in Python

Iterator di esempio

class CoinFlips:
    def __init__(self, number_of_flips):
        self.number_of_flips = number_of_flips  # Store the total number of flips
        self.counter = 0

    def __iter__(self):
        return self  # Return a reference of the iterator

    # Flip the next coin, return the output
    def __next__(self):
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])
Programmazione a oggetti intermedia in Python

Usare un iterator di esempio

three_flips = CoinFlips(3)

# Lancia la moneta tre volte
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
Programmazione a oggetti intermedia in Python

Iterare su un iterator

three_flips = CoinFlips(3)

# Ora prova a ciclare su ogni elemento dell'iterator
for flip in three_flips:
    print(flip)
T
H
T
None
None
None
...
Programmazione a oggetti intermedia in Python

StopIteration

...
    def __next__(self):
        # Fallo solo se la moneta non è stata lanciata "number_of_flips" volte
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])

        else:  # Altrimenti, interrompi con StopIteration
            raise StopIteration
  • Segnala la fine di collezioni/stream di dati
  • Previene loop infiniti
  • Facile da gestire
Programmazione a oggetti intermedia in Python

Iterare su un iterator

three_flips = CoinFlips(3)

# Ora prova a ciclare su ogni elemento dell'iterator
for flip in three_flips:
    print(flip)
H
T
H
Programmazione a oggetti intermedia in Python

Gestire le eccezioni StopIteration

while True:
    try:
        next(three_flips)  # Estrai il prossimo elemento di three_flips

    # Intercetta un'eccezione StopIteration
    except StopIteration:
        print("Completed all coin flips!")
        break
H
H
H
Completed all coin flips!
Programmazione a oggetti intermedia in Python

Esercitiamoci!

Programmazione a oggetti intermedia in Python

Preparing Video For Download...