Realizziamo un programma sui numeri primi in Python utilizzando le strutture iterative studiate finora, al fine di approfondirle.
Ricordiamo dunque la definizione di numero primo:
Un numero è primo quando ha solo due divisori: uno e se stesso.
Quindi è primo ciascun numero naturale maggiore di 1 che sia divisibile solamente per 1 e per sé stesso.
La successione dei numeri primi comincia con 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, …
Algoritmo per i numeri primi in Python
Abbiamo già realizzato questo algoritmo in linguaggio C: numero primo in C. Inoltre, anche con Algobuild, abbiamo affrontato lo stesso argomento: numeri primi da 1 a 100 con Algobuild e con Scratch: numeri primi da 1 a 100 con Scratch.
Dato in input un numero verificare che sia primo.
Descrizione dell’algoritmo:
- Dato in input un numero, verifichiamo che sia maggiore di 1. Se non lo è, visualizziamo un messaggio di errore poiché i numeri primi sono definiti solo per numeri maggiori di 1.
- Iniziamo con l’impostare una variabile
diva 2 e una variabilecounta 0.divè il divisore con cui verificheremo se il numero è primo, mentrecounttiene traccia del numero di divisori trovati. - Utilizziamo un ciclo
whileche continua finchédivè minore o uguale alla metà del numero ecountè uguale a 0. Questo ci permette di ottimizzare l’algoritmo evitando di dividere inutilmente numeri molto grandi. - All’interno del ciclo, controlliamo se il numero è divisibile per
divusando l’operatore modulo (%). Se il resto della divisione è zero, incrementiamocountpoiché abbiamo trovato un divisore. - Dopo ogni iterazione, incrementiamo
divdi uno. - Se alla fine del ciclo
countè ancora zero, il numero è primo. Altrimenti, non è primo.
Video Tutorial Gratuiti su Python: vai al canale per trovare la playlist dedicata
Ecco dunque il codice completo:
numero = int(input('Inserire un numero: '))
if numero <= 1:
print('Devi inserire un numero maggiore di 1')
else:
div, count = 2, 0
while div <= numero / 2 and count == 0:
if numero % div == 0:
count += 1
div += 1
if count == 0:
print('Numero primo!')
else:
print('Il numero non è primo!')
Con questo algoritmo, siamo in grado di determinare se un numero inserito dall’utente è primo o meno.
Miglioramenti e ottimizzazioni algoritmo sui numeri primi in Python
Potremmo fare alcune ottimizzazioni all’algoritmo precedentemente proposto. In particolare possimo evidenziare questo miglioramenti e ottimizzazioni:
- Verifica dei numeri pari: Possiamo ottimizzare ulteriormente l’algoritmo evitando di controllare i divisori per i numeri pari, ad eccezione di 2. Se il numero è pari diverso da 2, sappiamo già che non è primo perché è divisibile per 2.
- Ottimizzazione della ricerca dei divisori: Possiamo limitare la ricerca dei divisori fino alla radice quadrata del numero anziché fino alla sua metà . Questo perché se un numero ha un divisore maggiore della sua radice quadrata, avrà anche un divisore minore della sua radice quadrata.
- Refactoring del codice: Possiamo migliorare leggibilità e chiarezza del codice suddividendo le responsabilità in funzioni più piccole e descrivendo chiaramente l’intento di ciascuna parte dell’algoritmo.
- Gestione degli input non validi: Possiamo aggiungere controlli aggiuntivi per gestire input non validi, ad esempio se l’utente inserisce caratteri non numerici anziché numeri.
Ecco un esempio di implementazione con ottimizzazioni:
import math
def is_prime(numero):
if numero <= 1:
return False
elif numero == 2:
return True
elif numero % 2 == 0:
return False
else:
limite = int(math.sqrt(numero)) + 1
for div in range(3, limite, 2):
if numero % div == 0:
return False
return True
numero = int(input('Inserire un numero: '))
if is_prime(numero):
print('Numero primo!')
else:
print('Il numero non è primo!')
Nella funzione is_prime, sono state apportate diverse ottimizzazioni per migliorare l’efficienza e la chiarezza dell’algoritmo per determinare se un numero è primo:
- Controllo se il numero è minore o uguale a 1: Il primo controllo verifica se il numero è minore o uguale a 1. In tal caso, restituisce
Falsepoiché i numeri primi sono definiti come numeri naturali maggiori di 1. - Controllo se il numero è uguale a 2: Successivamente, controlla se il numero è uguale a 2. Se sì, restituisce
Trueperché 2 è il primo numero primo. - Controllo se il numero è pari: Se il numero è pari diverso da 2, viene restituito
Falsepoiché i numeri pari (ad eccezione del 2) non possono essere primi. - Calcolo del limite della ricerca dei divisori: Per ottimizzare la ricerca dei divisori, il limite viene calcolato come la radice quadrata del numero (
math.sqrt(numero)), arrotondata per eccesso e incrementata di 1. Questo perché se un numero ha un divisore maggiore della sua radice quadrata, avrà anche un divisore minore della sua radice quadrata. - Iterazione sui divisori dispari: Il ciclo
foritera sui divisori dispari a partire da 3 fino al limite calcolato, incrementando di 2 ad ogni passaggio. Questo perché abbiamo già escluso i numeri pari diversi da 2 come potenziali divisori. - Controllo dei divisori: Durante l’iterazione, viene controllato se il numero è divisibile per il divisore corrente. Se sì, viene restituito
Falsepoiché il numero non è primo. - Restituzione del risultato: Se il ciclo termina senza trovare divisori, il numero è primo e viene restituito
True.
Queste ottimizzazioni riducono il numero di iterazioni necessarie per determinare se un numero è primo, rendendo l’algoritmo più efficiente e veloce, soprattutto per numeri grandi.
Se stai pensando di iscriverti ad un corso in diretta su Python, ecco alcuni suggerimenti per esplorare al meglio questa opportunità :
- Apprendimento Interattivo: I corsi in diretta offrono un’esperienza di apprendimento interattiva, che ti permette di interagire direttamente con l’istruttore e gli altri partecipanti. Questo può favorire un apprendimento più rapido e approfondito.
- Guida Esperta: I corsi in diretta sono condotti da istruttori esperti che possono guidarti attraverso i concetti chiave e rispondere alle tue domande in tempo reale. Questo ti permette di ottenere una comprensione più approfondita dei concetti e delle best practices di programmazione Python.
- Feedback Personalizzato: Durante il corso, avrai l’opportunità di ricevere feedback personalizzato sull’avanzamento del tuo apprendimento e sui tuoi progetti. Questo può aiutarti a identificare e superare le tue sfide specifiche di apprendimento.
- Networking: Partecipare ad un corso in diretta ti offre l’opportunità di connetterti con altri studenti e professionisti del settore. Questo può portare a collaborazioni future, opportunità di mentoring e sviluppo di una rete professionale preziosa.
- Progetti Pratici: I corsi in diretta spesso includono progetti pratici che ti consentono di applicare ciò che hai imparato in situazioni reali. Questi progetti ti aiutano a sviluppare competenze pratiche e a costruire un portfolio di lavoro.
- Aggiornamenti Continui: Python è un linguaggio di programmazione in continua evoluzione. Partecipare ad un corso in diretta ti consente di rimanere aggiornato sulle ultime novità del linguaggio e sulle best practices di sviluppo.
Ancora indeciso? Contattaci per maggiori informazioni: info@insegnarecoding.com
Alcuni link utili
Indice tutorial sul linguaggio Python
1 – Introduzione al linguaggio Python
2 – Le variabili
3 – Operatori aritmetici e di assegnazione
4 – Stringhe
5 – Casting
6 – Input e print
7 – Primi esercizi in Python
8 – Errori in Python
9 – Script Python
10 – Scambio di variabili

