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.