Skip to content

Instantly share code, notes, and snippets.

@Abathargh
Created April 22, 2020 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Abathargh/de7062001a70c2f4f71fce4cdf9f9ec3 to your computer and use it in GitHub Desktop.
Save Abathargh/de7062001a70c2f4f71fce4cdf9f9ec3 to your computer and use it in GitHub Desktop.
Esempi trattati all'interno dell'articolo di antima.it su iteratori e generatori http://antima.it/elementi-di-python-iteratori-e-generatori/
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