3 consigli su:
Python (parte 2)
collections.Counter: Contare Elementi Senza Sforzo
Questa classe del modulo collections è indispensabile per analisi frequenti o conteggi rapidi su liste, stringhe o iterabili.
Cosa fa: Conta le occorrenze di elementi hashable (es. caratteri, numeri, parole).
Perché usarla:
- Sostituisce loop manuali e dizionari.
- Metodi integrati come most_common(n) per ranking.
- Supporta operazioni matematiche (somma, sottrazione tra Counter).
Use Case: Analisi testi, verifica di duplicati, ottimizzazione di dataset.
from collections import Counter
testo = “python è potente, python è intuitivo”
parole = testo.split()
conteggio = Counter(parole)
print(conteggio.most_common(2)) # Output: [(‘python’, 2), (‘è’, 2)]
functools.lru_cache: Memorizzare Risultati per Velocizzare il Codice
Un decorator del modulo functools che cachinga i risultati di funzioni costose, riducendo i tempi di esecuzione.
Cosa fa: Memorizza gli output in base agli input, evitando ricalcoli ridondanti.
Perché usarla:
- Accelerazione fino al 95% per funzioni ricorsive o chiamate ripetute.
- Parametri flessibili (maxsize, typed).
Use Case: Calcoli matematici pesanti, chiamate API ripetute, algoritmi dinamici.
from functools import lru_cache
@lru_cache(maxsize=128) # Limita la memoria usata
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(50)) # Calcolo istantaneo, altrimenti esponenziale!
enumerate(): Tracciare Indici Senza range(len())
Rimane un must-have per iterazioni che richiedono sia l’elemento che la sua posizione.
Use Case Avanzato:
- Generare ID univoci partendo da un numero specifico.
- Creare dizionari indicizzati: {indice: elemento for indice, elemento in enumerate(lista)}.
nomi = [“Alice”, “Bob”, “Charlie”]
for indice, nome in enumerate(nomi, start=100):
print(f”ID {indice}: {nome}”)
# Output:
# ID 100: Alice
# ID 101: Bob
# ID 102: Charlie
Bonus: operator.itemgetter per Ordinamenti Complessi
Dal modulo operator, itemgetter() estrae elementi da oggetti complessi (es. tuple, dizionari) per ordinamenti o operazioni mirate:
from operator import itemgetter
dati = [{“nome”: “Alice”, “voti”: 90}, {“nome”: “Bob”, “voti”: 85}]
dati_ordinati = sorted(dati, key=itemgetter(‘voti’), reverse=True)
print(dati_ordinati) # [{‘nome’: ‘Alice’, ‘voti’: 90}, {‘nome’: ‘Bob’, ‘voti’: 85}]
Perché Queste Scelte?
- Efficienza: Riducono codice boilerplate e migliorano le prestazioni.
- Chiarezza: Rendono esplicite le intenzioni dello sviluppatore.
- Versatilità: Adatte a contesti diversi: data science, automazione, backend.

Contattaci, saremo molto felici di conoscerti.