Python
- Introduzione
- Prerequisiti
- Le variabili
- I commenti
- Istruzioni di assegnazione
- Istruzioni di output
- Istruzioni di input
- Gli operatori
- Programmazione strutturata
- Le strutture condizionali o istruzioni di selezione
- Istruzioni di iterazione
- Liste, stringhe, valori pseudo-casuali
- Le funzioni
Introduzione
Python è un linguaggio di programmazione, ideato dall’informatico olandese Guido van Rossum, pubblicato il 20 febbraio 1991.
Il nome “Python” fu scelto dallo stesso inventore per la sua passione verso i Monty Python, un gruppo comico britannico, attivo principalmente negli anni settanta.
Secondo l’indice TIOBE, Python è uno dei linguaggi di programmazione più popolari.
Prerequisiti
Installazione dell’interprete Python
- Collegarsi a https://www.python.org/downloads/
- Premere sul pulsante che consente di scaricare Python per il proprio sistema operativo
- Una volta scaricato, avviare l’installer di Python
- Importante: appena inviato l’installer, selezionare la casella relativa al PATH (questo consentirà di avviare Python da riga di comando, semplicemente scrivendo
pythonnel terminale)
Scelta dell’editor di testo
Puoi usare l’editor di testo che preferisci. L’installazione di Python include un editor di testo chiamato IDLE.
Personalmente, utilizzo Visual Studio Code, con il componente aggiuntivo Python. VS Code è disponibile per qualsiasi sistema operativo. Una volta installato VS Code, nella barra laterale a sinistra, seleziona la sezione “Componenti aggiuntivi”. Qui, cercando “Python”, troverai il componente aggiuntivo sopra citato.
Le variabili
Una variabile è uno spazio di memoria RAM contenente dati, a cui è stato attribuito un identificatore, cioè un nome.
Normalmente una variabile viene inizializzata, assegnandole un valore, quando viene definita nel codice sorgente. Durante l’esecuzione del programma, poi, il valore assunto dalla variabile può essere aggiornato e cambiare anche più volte. In Python, il tipo di una variabile può cambiare continuamente. Ad esempio, se in una variabile è salvata una stringa, a quella stessa variabile è possibile assegnare successivamente un numero. Per questo motivo, si dice che Python è un linguaggio di programmazione a tipizzazione dinamica. C, ad esempio, è invece un linguaggio di programmazione a tipizzazione statica: una volta che è stato assegnato un tipo a una variabile, esso non può essere modificato.
Python è un linguaggio case-sensitive, cioè distingue le lettere maiuscole dalle minuscole; perciò, per esempio, miaVar è una variabile diversa da MiaVar.
Nei nomi di variabile si possono usare solo: lettere (maiuscole, minuscole, accentate), numeri, il simbolo di underscore _. Ogni altro carattere è vietato. Il nome della variabile non può iniziare con numeri e non può contenere spazi.
Il nome della variabile non può essere una delle parole chiave del linguaggio (non è necessario che le impariate a memoria)
Quelle precedenti sono regole tassative sui nomi di variabile. I seguenti sono, invece, dei consigli:
- il nome di una variabile dovrebbe essere esplicativo del suo contenuto;
- descrivere adeguatamente il contenuto di una variabile può richiedere più parole; per una migliore leggibilità, le parole andrebbero separate con un underscore oppure dovrebbero avere l’iniziale maiuscola: due nomi di variabili adeguati, per esempio, sono
nome_variabileonomeVariabile
Principali tipi di variabile
strper le stringhe. Le stringhe possono essere racchiuse tra singoli apici o tra doppi apici, indifferentemente.intper i numeri interi.floatper i numeri floating point, ovvero i numeri reali rappresentati in virgola mobileboolper i valori booleani:TrueeFalse- infiniti altri
Cenni sulle funzioni
Analizzeremo approfonditamente le funzioni più avanti.
Per ora, notiamo che input(), print(), int(), float(), str(), … sono esempi di funzioni built-in, ovvero funzioni già codificate e pronte per l’uso.
I commenti
In Python, una riga di commento al codice deve iniziare con il carattere #.
print("Hello, world!") # Questo, dopo l'hashtag, è un commento
Un commento costituito da più righe può essere racchiuso tra apici - singoli o doppi - ripetuti tre volte. Ad esempio:
''' Questo
è
un
commento
su
più
righe
'''
Oppure:
""" Questo
è
un
commento
su
più
righe
"""
Istruzioni di assegnazione
Un’istruzione di assegnazione, in Python, crea una nuova variabile e le assegna un valore. Esempi:
messaggio = 'ciao'
n = 17
pi = 3.141592653589793
La prima riga del codice qui sopra, messaggio = 'ciao':
- crea una variabile il cui identificatore è
messaggio - assegna alla variabile il valore
'ciao' - poiché
'ciao'è una stringa, la variabile assume il tipostr
Istruzioni di output
In Python, la principale funzione per mostrare del testo sullo schermo è print().
TODO questa sezione è da approfondire. Se vuoi contribuire, puoi inviare la tua proposta a me@niceo.org ☺️
Formattazione dell’output
Ogni istruzione deve essere scritta su una sola riga. Ma come si fa a scrivere, per esempio, un lungo testo su più righe, dentro la funzione print()? Così:
>>> print('''
Sempre caro mi fu quest'ermo colle
e questa siepe, che da tanta parte
dell'ultimo orizzonte il guardo esclude
''') # Usa l'apice ripetuto tre volte!
Sempre caro mi fu quest'ermo colle
e questa siepe, che da tanta parte
dell'ultimo orizzonte il guardo esclude
Con l’uso degli apici - singoli o doppi - ripetuti tre volte, dunque, il testo viene visualizzato esattamente come è scritto nel codice.
Un’altra possibile soluzione è l’uso del carattere di escape \n, dove la n sta per new line: questo carattere speciale manda a capo il testo nel punto i cui è inserito:
>>> print('Monday\nTuesday\nWednesday')
Monday
Tuesday
Wednesday
Un altro utile carattere di escape è \t, che introduce una tabulazione all’interno del testo:
>>> print('Monday\tTuesday\tWednesday')
Monday Tuesday Wednesday
Istruzioni di input
In Python, la principale funzione per mostrare leggere il testo inserito dall’utente è input().
TODO questa sezione è da approfondire. Se vuoi contribuire, puoi inviare la tua proposta a me@niceo.org ☺️
Conversione dell’input
La funzione input() restituisce sempre al programma un valore di tipo str.
Spesso però si desidera convertire quella variabile dal tipo str a un altro tipo, ad esempio float oppure int.
- La funzione
float()converte in numero decimale l’argomento che le viene passato.
>>> float(4)
4.0
La funzione str() converte in stringa l’argomento che le viene passato:
>>> str(4)
'4'
La funzione int() converte in un numero intero l’argomento che le viene passato.
>>> int('4')
4
>>> int(4.32)
4
>>> int(0b1001)
9
Gli operatori
Operatori aritmetici

Operatori di concatenamento e ripetizione
In Python, i simboli + e * non hanno soltanto la funzione di operatori aritmetici: si possono usare anche per operare sulle stringhe. In questo caso:
- l’operatore
+è l’operatore di concatenamento: unisce in un’unica stringa il contenuto di due stringhe:>>> 'ciao' + 'mamma' 'ciaomamma' - L’operatore
*è l’operatore di ripetizione: moltiplica più volte, ripetendolo, il contenuto di una stringa:>>> 'mamma' * 3 'mammamammamamma'
Operatori di comparazione

La condizione a == b, per esempio, significa: Confronta il valore della variabile a con quello della variabile b: restituisci True se sono uguali, altrimenti False.
Operatori logici
In Python, sono definiti gli operatori logici booleani or, and, not.
Esempi di condizioni:
x > 1 and x < 10
not (a == 10) and (b or c)
Operatori di assegnazione composti
Servono, semplicemente, a scrivere codice più compatto:

Programmazione strutturata
Per il teorema di Bohm – Jacopini, sappiamo che qualsiasi algoritmo si può codificare usando tra soli costrutti formati da blocchi di istruzioni:
- La sequenza, che esegue le istruzioni in successione, dalla prima all’ultima;
- La struttura condizionale, che fa eseguire certe istruzioni oppure altre;
- Il ciclo iterativo, che esegue ripetutamente un blocco di istruzioni.
Studiando la sintassi per questi costrutti, possiamo programmare qualsiasi cosa in Python.
La sintassi fondamentale di una struttura condizionale in Python è:
if condizione:
... # istruzioni da eseguire se la condizione è vera
else:
... # istruzioni da eseguire se la condizione è falsa
Le strutture condizionali o istruzioni di selezione
È fondamentale tenere presente che Python riconosce i blocchi di codice in base alla loro indentazione. In particolare:
- Le istruzioni
ifedelsedevono essere allineate tra loro e devono terminare con i due punti; - I blocchi di istruzioni da eseguire nei due casi devono avere lo stesso rientro misurato in spazi, o, in alternativa, in tabulazioni.
Nota bene: il linguaggio interpreta in maniera differente spazi e tabulazioni, perciò una tabulazione di dimensione 4 non è identica a 4 spazi. Comunque, VS Code e IDLE gestiscono automaticamente l’indentazione.
Strutture condizionali semplici e annidate
Il costruttore di selezione unaria si crea utilizzando soltanto l’istruzione if, senza l’istruzione else.
Il costrutto di selezione binaria si costruisce utilizzando sia if sia else.
È possibile, inoltre, scrivere strutture condizionali annidate:
if scelta == 1:
print("Hai scelto 1")
else:
if scelta == 2:
print("Hai scelto 2")
else:
print("Hai scelto un altro numero")
Per evitare di annidare molteplici costrutti di selezione e rendere il codice difficile da leggere, in Python esiste la struttura elif (crasi di else if). Si usa così:
if scelta == 1:
print("Hai scelto 1")
elif scelta == 2:
print("Hai scelto 2")
else:
print("Hai scelto un altro numero")
Istruzioni di iterazione
In Python, esistono due costrutti di iterazione fondamentali:
- Il ciclo
for, ovvero il ciclo di iterazione definito, equivalente al PER dello pseudolinguaggio; - Il ciclo
while, ovvero il ciclo di iterazione indefinito precondizionale, equivalente al MENTRE dello pseudolinguaggio;
In Python, non esiste un costrutto di iterazione indefinito post-condizionale, equivalente al RIPETI/FINCHE’ dello pseudolinguaggio (ma esiste in altri linguaggi di programmazione, come C e Java). Comunque, vedremo come sia possibile riprodurre questo costrutto con la sintassi già presente.
Il ciclo for

L’istruzione for, che deve terminare con due punti, dichiara una variabile intera nome_variabile, che funge da contatore delle iterazioni del ciclo.
Dopo la parola chiave in, la funzione built-in range() determina la gamma di valori del contatore e può avere tre argomenti, che rappresentano nell’ordine:
- Il valore iniziale di
nome_variabile, da cui le iterazioni avranno inizio; - Il limite esterno, ovvero il valore di
nome_variabileprima del quale si fermerà; - Il passo, cioè l’incremento del valore di
nome_variabilea ogni iterazione.
Ad esempio, il seguente frammento di codice:
for num in range(2, 21, 3):
print(num)
Produrrà come output:
2
5
8
11
14
17
20
Il ciclo for: la funzione range()
Se si desidera decrementare il contatore, anziché incrementarlo, è sufficiente specificare negli argomenti di range() un valore iniziale minore del limite esterno. Per ottenere la stessa sequenza dell’esempio precedente, in ordine inverso:
for num in range(20, -1, -3):
print(num)
L’unico parametro obbligatorio per range() è il limite esterno: gli altri due sono opzionali. Ad esempio, il seguente ciclo for è valido:
for num in range(10):
print(num)
Esso stampa i numeri da 0 a 9. Infatti:
10è interpretato come limite esterno;- Il valore iniziale, quando non è specificato, è ritenuto pari a zero;
- Il passo, quando non è specificato, è ritenuto pari a 1.
Il ciclo for e le stringhe
Le stringhe sono un particolare tipo di dato. Python le interpreta come una sequenza di caratteri, associando a ogni carattere un indice numerico, che parte dal valore 0 per il primo carattere.
I singoli caratteri di una stringa si individuano specificando tra parentesi quadre il valore del loro indice. Così, per esempio, le due istruzioni:
saluto = "ciao"
print(saluto[1], saluto[3], sep=" ")
Producono come output: i o
Tratteremo le stringhe in modo più approfondito nel prossimo capitolo (strutture dati), ma anticipiamo qui l’argomento perché un’applicazione tipica del ciclo for consiste nello scorrere sequenze di dati, quali sono per l’appunto le stringhe.
La sintassi per questa operazione è:

Ad esempio, il seguente frammento di codice:
for lettera in "ciao":
print(lettera)
Produrrà come output:
c
i
a
o
Il ciclo while

Ricordatevi: si usa il ciclo
forquando si conosce il numero di iterazioni da compiere appena prima di iniziare il ciclo; si usa il ciclowhilequando non si conosce il numero di iterazioni da compiere prima di iniziare il ciclo.
L’istruzione break
L’istruzione break, se la condizione è soddisfatta, interrompe l’esecuzione del ciclo e passa il controllo del programma alla prima istruzione successiva al ciclo.

L’istruzione continue
L’istruzione continue, diversamente da break, non interrompe l’esecuzione del ciclo ma ne fa «saltare» una o più iterazioni.
Per esempio, il codice:
for n in range(1, 10):
if n % 3 == 0:
continue
print(n, end=' ')
Produce come output:
1 2 4 5 7 8
Liste, stringhe, valori pseudo-casuali
A questa pagina si trovano dei collegamenti utili per imparare:
- i metodi per le liste
- i metodi per le stringhe
- le principali funzioni per la generazione di valori pseudo-casuali, grazie alla libreria
random
Le funzioni
Definizione e vantaggi
Una funzione è un gruppo di istruzioni che si può eseguire ogni volta che serve, scrivendolo una volta sola.
Utilizzare le funzioni consente di:
- aumentare la leggibilità e l’eleganza del codice
- riutilizzare codice già scritto in precedenza
- diminuendo il numero di righe di codice da scrivere, diminuisce le possibilità di errore
La struttura di una funzione in Python
Consideriamo, come esempio, la seguente funzione:
def somma(lista_numeri: list[int]) -> int:
somma = 0
for numero in lista_numeri:
somma += numero
return somma
Essa riceve come parametro una lista di numeri interi e restituisce, come risultato, la somma degli elementi della lista.
La struttura di una funzione in Python: la segnatura
La riga:
def somma(lista_numeri: list[int]) -> int:
è chiamata segnatura, o firma, della funzione. In inglese, essa è detta signature.
La segnatura è sempre composta da:
def: una parola chiave di Python, utilizzata sempre per iniziare la segnatura di una funzionesomma: il nome della funzione, ovvero quello utilizzato per invocare la funzione all’interno di un programma.sommaè solo un esempio di nome di funzione: si può scegliere un nome qualsiasi.
Nota bene: all’interno di uno stesso file Python, si possono definire molteplici funzioni. Però, ogni funzione deve avere un nome unico.
lista_numeri: è un argomento, o parametro formale, della funzionesomma. Ogni funzione può avere zero, uno, o molteplici parametri formali.: list[int]: è il tipo del parametro formale. La funzionesommadel nostro esempio, quando è invocata, deve riceve un solo parametro, il quale deve essere una lista di numeri interi.-> int: è il tipo del valore restituito dalla funzione. Come vedremo tra poco, una funzione, di solito, restituisce un valore. Il suo tipo è indicato nella parte finale della segnatura. Ovviamente, al posto diint, una funzione potrebbe restituire valori di altro tipo.
Ecco altri esempi validi di segnatura di funzione:
def multiples(n: int) -> list[int]:
def to_celsius(fahrenheit: float) -> float:
# Una funzione con due parametri formali! 😵💫
def randfloat(a: int, b: int) -> float:
def abbondante(n: int) -> bool:
# Una funzione con zero parametri formali! 🥵
def saluto() -> None:
# Un'altra funzione con zero parametri formali! 🥵
def randchar() -> str:
Nota bene: la segnatura di una funzione termina sempre con due punti
:.
La struttura di una funzione in Python: il corpo
Le righe:
somma = 0
for numero in lista_numeri:
somma += numero
return somma
costituiscono il corpo della funzione somma.
‘Implementare’ una funzione significa scrivere le righe di codice che formano il suo corpo.
La struttura di una funzione in Python: la parola chiave return
Spesso, nel corpo di una funzione si incontra la parola chiave return.
Quando si esegue l’istruzione return, la funzione restituisce il valore indicato appena dopo la parola chiave e termina immediatamente la propria esecuzione.
Ad esempio, la seguente - semplicissima - funzione:
def opposto(n: int) -> int:
return -n
Restituisce l’opposto del numero n. Se, dopo l’istruzione return, ci fossero state altre istruzioni, esse non sarebbero mai state eseguite: sarebbero state, al contrario, totalmente ignorate!
def opposto(n: int) -> int:
return -n
n = n * 2 # riga di codice totalmente ignorata
print("Aiutooo") # riga di codice totalmente ignorata
Procedure
Tutte le funzioni restituiscono un valore? Ovvero: in tutte le funzioni si usa la parola chiave return? La risposta è no.
Una funzione che non restituisce nessun valore è detta procedura. Ecco un esempio di procedura:
def saluto() -> None:
print("Ciao!")
La funzione saluto è una procedura. Essa, infatti, non restituisce nessun valore: la parola chiave return non è mai usata.
Attenzione: ‘mostrare un valore in output’ e ‘restituire un valore’ sono due concetti totalmente diversi. Il valore restituito da una funzione, oltre a poter essere mostrato in output, può essere usato per mille altre finalità: per essere salvato in una variabile, per essere usato come parametro di un’altra funzione…
Nota bene: il tipo del valore restituito da una procedura è sempre
None.
Domande e risposte sulle funzioni
- Posso creare variabili all’interno di una funzione?
Sì - Se creo una variabile all’interno di una funzione, allora quella variabile potrà essere utilizzata anche fuori dalla funzione?
No.
Una funzione riceve dei valori dall’esterno attraverso i parametri formali. La funzione restituisce un risultato all’esterno attraverso
return. Nessuna altra interazione è presente tra una funzione e ciò che sta al di fuori di essa.
Invocare una funzione
Consideriamo il seguente file Python, funzione.py:
def opposto(n: int) -> int:
return -n
Se provaste a eseguire tale file, non accadrebbe nulla. Infatti, in funzione.py è stata implementata la funzione opposto, ma essa non è mai stata invocata (o utilizzata).
Per invocare una funzione, bisogna scrivere il suo nome seguito, tra parentesi tonde, da un valore per ogni parametro formale richiesto. Tali valori sono detti parametri attuali. Ad esempio, questo codice mostrerebbe l’opposto di un numero n, chiesto in input:
def opposto(n: int) -> int:
return -n
if __name__ == "__main__":
numero = int(input("Inserisci un numero intero: "))
print(f"L'opposto di {n} è {opposto(numero)}")
All’ultima riga del codice, la funzione opposto è stata invocata, passandole come parametro attuale il valore custodito nella variabile numero.
Nota bene: il nome della variabile usata come parametro attuale non deve necessariamente coincidere con il nome della variabile usata come parametro formale.
Nota bene: una funzione deve ricevere esattamente il numero di parametri attuali richiesto ed esattamente del tipo richiesto. Ecco alcune invocazioni errate:
def opposto(n: int) -> int:
return -n
if __name__ == "__main__":
numero = input("Inserisci un numero intero: ")
opposto_numero = opposto(numero) # Perché questa invocazione è errata?
print(opposto()) # Perché questa invocazione è errata?
l = [1, 2, 3]
print(opposto(l)) # Perché questa invocazione è errata?
n1, n2 = 4, 8
print(opposto(n1, n2)) # Perché questa invocazione è errata?
Il valore restituito da una funzione
Come si diceva, il valore restituito da una funzione si può usare in “mille” modi. Ecco degli esempi:
def opposto(n: int) -> int:
return -n
if __name__ == "__main__":
numero = int(input("Inserisci un numero intero: "))
opposto_numero = opposto(numero) # Qui il valore restituito da 'opposto' è salvato in una variabile
print(opposto(3)) # Qui il valore restituito da 'opposto' è mostrato in output e non è salvato da nessuna parte
opposto(opposto(8)) # Qui il valore restituito da 'opposto' è usato come parametro attuale per invocare un'altra funzione.