Principiante a Ninja Perché le tue competenze in Python contano nella Data Science

Principiante a Ninja Perché le tue competenze in Python sono cruciali per la Data Science

 

Introduzione

 

Sappiamo che la programmazione è una competenza utile (essenziale?) che i data scientist devono possedere. Ma quale livello di competenza in programmazione è necessario? Dovrebbe un data scientist puntare a essere “abbastanza bravo” o invece desiderare di diventare un programmatore di livello esperto? Dovremmo aspirare a diventare ninja della codifica?

Se vogliamo esplorare questo argomento, dovremmo prima avere un’idea di come si presentano un programmatore principiante, intermedio ed esperto $mdash; o almeno come appare il loro codice.

Di seguito troverai 2 attività di programmazione, ognuna con 3 frammenti di codice; uno per ciascun livello possibile di un programmatore principiante, intermedio ed esperto per completare quella determinata attività, con qualche spiegazione sulle differenze. Questo ci permetterà di avere una base su cui costruire una discussione sull’importanza delle capacità di programmazione.

Ricorda, queste sono approcci inventati volti ad imitare la programmazione a questi diversi livelli. Tutti gli script sono funzionali e svolgono il lavoro richiesto, ma lo fanno con diversi gradi di eleganza, efficienza e “pythonicità”.

 

Attività: Trova il Fattoriale di un Numero

 

Iniziamo con un’attività semplice ma che può essere affrontata in modi diversi, trovare il fattoriale di un numero dato. Implementiamola per un programmatore principiante, intermedio ed esperto immaginari in Python, e confrontiamo le differenze nei loro codici.

 

Approccio del Principiante

 

Un principiante potrebbe utilizzare un approccio diretto utilizzando un ciclo for per calcolare il fattoriale. Ecco come potrebbero farlo.

n = int(input("Inserisci un numero per trovare il suo fattoriale: "))fattoriale = 1if n < 0:    print("Il fattoriale non esiste per numeri negativi")elif n == 0:    print("Il fattoriale di 0 è 1")else:    for i in range(1, n + 1):        fattoriale *= i    print(f"Il fattoriale di {n} è {fattoriale}")

 

Approccio dell’Intermedio

 

Un programmatore intermedio potrebbe utilizzare una funzione per migliorare la riusabilità e la leggibilità del codice, e utilizzare anche la libreria math per controlli di base.

import mathdef fattoriale(n):    if n < 0:        return "Il fattoriale non esiste per numeri negativi"    elif n == 0:        return 1    else:        return math.prod(range(1, n + 1))n = int(input("Inserisci un numero per trovare il suo fattoriale: "))risultato = fattoriale(n)print(f"Il fattoriale di {n} è {risultato}")

 

Approccio dell’Esperto

 

Un programmatore esperto potrebbe utilizzare la ricorsione e aggiungere suggerimenti sul tipo per una migliore manutenibilità. Potrebbero anche fare uso della sintassi concisa ed espressiva di Python.

from typing import Uniondef fattoriale(n: int) -> Union[int, str]:    return 1 if n == 0 else n * fattoriale(n - 1) if n > 0 else "Il fattoriale non esiste per numeri negativi"n = int(input("Inserisci un numero per trovare il suo fattoriale: "))print(f"Il fattoriale di {n} è {fattoriale(n)}")

 

Sommario

 

Diamo uno sguardo alle differenze nei codici e a ciò che spicca di più tra i diversi livelli di competenza.

  • Principiante: Utilizza un codice complessivo più lungo, nessun uso di funzioni o librerie, logica diretta
  • Intermedio: Utilizza una funzione per una migliore struttura, utilizza math.prod per calcolare il prodotto
  • Esperto: Utilizza la ricorsione per l’eleganza, aggiunge suggerimenti sul tipo e utilizza l’espressione condizionale di Python per la concisione

 

Attività: Generare Numeri di Fibonacci

 

Come secondo esempio, consideriamo l’attività di trovare la sequenza di Fibonacci fino a n numeri. Ecco come programmiatori di diversi livelli potrebbero affrontare questa attività.

 

Approccio per principianti

 

Un principiante potrebbe utilizzare un semplice ciclo for e una lista per raccogliere i numeri di Fibonacci.

n = int(input("Quanti numeri di Fibonacci generare? "))fibonacci_sequence = []if n <= 0:    print("Inserisci un numero intero positivo.")elif n == 1:    print([0])else:    fibonacci_sequence = [0, 1]    for i in range(2, n):        next_number = fibonacci_sequence[-1] + fibonacci_sequence[-2]        fibonacci_sequence.append(next_number)    print(fibonacci_sequence)

 

Approccio per intermedi

 

Un programmatore intermedio potrebbe utilizzare le comprehensions di lista e la funzione zip per un approccio più Pythonico.

n = int(input("Quanti numeri di Fibonacci generare? "))if n <= 0:    print("Inserisci un numero intero positivo.")else:    fibonacci_sequence = [0, 1]    [fibonacci_sequence.append(fibonacci_sequence[-1] + fibonacci_sequence[-2]) for _ in range(n - 2)]    print(fibonacci_sequence[:n])

 

Approccio per esperti

 

Un esperto potrebbe utilizzare i generatori per un approccio più efficiente in termini di memoria, insieme alla funzionalità di unpacking di Python per scambiare variabili in una sola riga.

def generate_fibonacci(n: int):    a, b = 0, 1    for _ in range(n):        yield a        a, b = b, a + bn = int(input("Quanti numeri di Fibonacci generare? "))if n <= 0:    print("Inserisci un numero intero positivo.")else:    print(list(generate_fibonacci(n)))

 

Riassunto

 

Vediamo quali sono le principali differenze e quali differenze programmatiche separano i livelli di competenza.

  • Principiante: Utilizza strutture di controllo e liste di base, diretto ma un po’ verboso
  • Intermedio: Utilizza le comprehensions di lista e zip per una soluzione più Pythonica e concisa
  • Esperto: Utilizza un generatore per una soluzione efficiente in termini di memoria e utilizza l’unpacking per uno scambio elegante di variabili

 

I Benefici della “Ninja” Codifica

 

Se tutto il codice di esempio funziona e alla fine fa il lavoro richiesto, perché dovremmo cercare di diventare i migliori programmatori che possiamo essere? Ottima domanda!

Diventare programmatori competenti significa fare molto di più che far funzionare il codice. Ecco alcuni motivi per cui cercare di essere un programmatore migliore è vantaggioso:

 

1. Efficienza

 

  • Tempo: Scrivere codice più efficiente significa completare le attività più velocemente, il che è vantaggioso sia per il programmatore che per chiunque utilizzi il software
  • Utilizzo delle risorse: Il codice efficiente utilizza meno CPU e memoria, il che può essere cruciale per le applicazioni che funzionano con risorse limitate o su grande scala

 

2. Leggibilità e Manutenibilità

 

  • Collaborazione: Il codice è spesso scritto e mantenuto da team. Un codice pulito, ben strutturato e ben commentato è molto più facile da capire e su cui collaborare per gli altri
  • Longevità: Man mano che i progetti crescono o si evolvono, un codice manutenibile è più facile da estendere, debuggare e rifattorizzare, risparmiando tempo ed effort a lungo termine

 

3. Riutilizzabilità

 

  • Modularità: Scrivere funzioni o moduli che risolvono bene un problema significa che è possibile riutilizzare facilmente quel codice in altri progetti o contesti
  • Contributi della Comunità: Un codice di alta qualità può essere condiviso con la comunità di sviluppatori e beneficiarne

 

4. Robustezza e Affidabilità

 

  • Gestione degli errori: I programmatori avanzati spesso scrivono codice che non solo risolve problemi ma gestisce anche gli errori in modo elegante, rendendo il software più affidabile
  • Test: Capire come scrivere codice testabile e test effettivi assicura che il codice funzioni come previsto in diverse situazioni

 

5. Riconoscimento delle competenze

 

  • Progressione di carriera: Essere riconosciuti come programmatori competenti può portare a promozioni, opportunità di lavoro e salari più alti
  • Soddisfazione personale: C’è un senso di realizzazione e orgoglio nel sapere di essere capaci di scrivere codice di alta qualità

 

6. Adattabilità

 

  • Nuove tecnologie: Solide competenze di base facilitano l’adattamento a nuovi linguaggi, librerie o paradigmi
  • Risoluzione dei problemi: Una comprensione più approfondita dei concetti di programmazione migliora la capacità di affrontare i problemi in modo creativo ed efficace

 

7. Rendimento economico

 

  • Meno debug: Il codice ben scritto è spesso meno soggetto a bug, riducendo il tempo e le risorse spese per il debug
  • Scalabilità: Un buon codice può essere più facilmente aumentato o ridotto, rendendolo più redditizio nel lungo termine

 Quindi, mentre portare a termine il lavoro è certamente importante, il modo in cui lo si fa può avere implicazioni di vasta portata per lo sviluppo personale, il proprio team e l’organizzazione. Dovremmo tutti sforzarci di diventare i migliori programmatori che possiamo essere, e questo vale anche per i data scientist.

****[Matthew Mayo](https://www.kdnuggets.com/wp-content/uploads/./profile-pic.jpg)**** (@mattmayo13) ha una laurea magistrale in informatica e un diploma di studi post-laurea in data mining. Come direttore editoriale di VoAGI, Matthew si impegna a rendere accessibili concetti complessi di data science. I suoi interessi professionali includono l’elaborazione del linguaggio naturale, gli algoritmi di machine learning e l’esplorazione dell’intelligenza artificiale emergente. È guidato da una missione di democratizzare la conoscenza nella comunità della data science. Matthew programma da quando aveva 6 anni.