Created
April 22, 2020 23:10
Esempi trattati all'interno dell'articolo di antima.it su iteratori e generatori http://antima.it/elementi-di-python-iteratori-e-generatori/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ListaConcatenata: | |
class Nodo: | |
val = None | |
prossimo = None | |
def __init__(self): | |
self.testa = None | |
def aggiungi(self, n_val): | |
if self.testa is None: | |
n_nodo = self.Nodo() | |
n_nodo.val = n_val | |
self.testa = n_nodo | |
return | |
elem = self.testa | |
while elem.prossimo is not None: | |
elem = elem.prossimo | |
n_nodo = self.Nodo() | |
n_nodo.val = n_val | |
elem.prossimo = n_nodo | |
def __iter__(self): | |
self.corrente = self.testa | |
return self | |
def __next__(self): | |
if self.corrente is None: | |
raise StopIteration | |
val_corrente = self.corrente.val | |
self.corrente = self.corrente.prossimo | |
return val_corrente | |
lista_conc = ListaConcatenata() | |
# riempio la lista con numeri fino a 10 (escluso) | |
for elem in range(10): | |
lista_conc.aggiungi(elem) | |
# Stampo gli elementi della lista concatenata navigandola manualmente | |
print("Stampa con navigazione manuale") | |
cursore = lista_conc.testa | |
while cursore is not None: | |
print(cursore.val) | |
cursore = cursore.prossimo | |
# O utilizzo il costrutto for, sfruttando l'implementazione di __iter__ e __next__ | |
# N.B. preferibile in quanto non espone meccanismi interni alla classe (incapsulamento) | |
print("Stampa tramite for") | |
for elem in lista_conc: | |
print(elem) | |
# Generatori | |
def pari_fino_a(num): | |
for counter in range(num): | |
if counter%2 == 0: | |
yield counter | |
# Stampa la sequenza | |
print("Numeri pari fino a 12 (escluso)") | |
ultimo = 12 | |
for num in pari_fino_a(ultimo): | |
print(num) | |
# Esempio avanzato sui generatori, navigazione dei vicini in una matrice | |
# codificata come lista di liste | |
def vicini(x, y): | |
yield x-1, y-1 | |
yield x, y-1 | |
yield x+1, y-1 | |
yield x-1, y | |
yield x+1, y | |
yield x-1, y+1 | |
yield x, y+1 | |
yield x+1, y+1 | |
# |1 2 3| | |
# |4 5 6| Calcoliamo la matrice contenente in ogni elemento | |
# |7 8 9| la somma dei vicini originari di quell'elemento | |
matrice = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] | |
matrice_somma = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # Matrice 3x3 inizializzata con valori a 0 | |
for indice_riga, riga in enumerate(matrice): | |
for indice_colonna, elemento in enumerate(riga): | |
for v_x, v_y in vicini(indice_riga, indice_colonna): | |
if(0 <= v_x < len(matrice)) and (0 <= v_y < len(riga)): | |
matrice_somma[indice_riga][indice_colonna] += matrice[v_x][v_y] | |
print("Matrice") | |
for riga in matrice: | |
print(riga) | |
print("Matrice somma") | |
for riga in matrice_somma: | |
print(riga) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment