Python

  1. Introduzione
  2. Prerequisiti
    1. Installazione dell’interprete Python
    2. Scelta dell’editor di testo
  3. Le variabili
    1. Principali tipi di variabile
    2. Cenni sulle funzioni
  4. I commenti
  5. Istruzioni di assegnazione
  6. Istruzioni di output
    1. Formattazione dell’output
  7. Istruzioni di input
    1. Conversione dell’input
  8. Gli operatori
    1. Operatori aritmetici
    2. Operatori di concatenamento e ripetizione
    3. Operatori di comparazione
    4. Operatori logici
    5. Operatori di assegnazione composti
  9. Programmazione strutturata
  10. Le strutture condizionali o istruzioni di selezione
    1. Strutture condizionali semplici e annidate
  11. Istruzioni di iterazione
    1. Il ciclo for
    2. Il ciclo for: la funzione range()
    3. Il ciclo for e le stringhe
    4. Il ciclo while
    5. L’istruzione break
    6. L’istruzione continue
  12. Liste, stringhe, valori pseudo-casuali
  13. Le funzioni
    1. Definizione e vantaggi
    2. La struttura di una funzione in Python
      1. La struttura di una funzione in Python: la segnatura
    3. La struttura di una funzione in Python: il corpo
      1. La struttura di una funzione in Python: la parola chiave return
    4. Procedure
    5. Domande e risposte sulle funzioni
    6. Invocare una funzione
    7. Il valore restituito da una funzione

Introduzione

Python è un linguaggio di programmazione, ideato dall’informatico olandese Guido van Rossum, pubblicato il 20 febbraio 1991.

Guido Van Rossum nel 2014
Guido Van Rossum nel 2014

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.

I Monty Python nel 1969

Secondo l’indice TIOBE, Python è uno dei linguaggi di programmazione più popolari.

Uno screenshot della top 10 dell'indice TIOBE scattato il 17 settembre 2024.

Prerequisiti

Installazione dell’interprete Python

  1. Collegarsi a https://www.python.org/downloads/
  2. Premere sul pulsante che consente di scaricare Python per il proprio sistema operativo
  3. Una volta scaricato, avviare l’installer di Python
  4. Importante: appena inviato l’installer, selezionare la casella relativa al PATH (questo consentirà di avviare Python da riga di comando, semplicemente scrivendo python nel 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:

Principali tipi di variabile

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':

  1. crea una variabile il cui identificatore è messaggio
  2. assegna alla variabile il valore 'ciao'
  3. poiché 'ciao' è una stringa, la variabile assume il tipo str

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.

>>> 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

Gli 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:

Operatori di comparazione

Gli 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:

Operatori di assegnazione composti

Programmazione strutturata

Per il teorema di Bohm – Jacopini, sappiamo che qualsiasi algoritmo si può codificare usando tra soli costrutti formati da blocchi 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:

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:

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

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:

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:

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 è:

Il ciclo for e le stringhe

Ad esempio, il seguente frammento di codice:

for lettera in "ciao":
	print(lettera)

Produrrà come output:

c
i
a
o

Il ciclo while

Il ciclo while

Ricordatevi: si usa il ciclo for quando si conosce il numero di iterazioni da compiere appena prima di iniziare il ciclo; si usa il ciclo while quando 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 break

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:

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:

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:

Nota bene: all’interno di uno stesso file Python, si possono definire molteplici funzioni. Però, ogni funzione deve avere un nome unico.

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

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.