Primi passi con Python

Hello World!

Python può essere utilizzato anche come linguaggio di scripting, questo implica che il main è implicito nella prima riga del file che viene eseguito. Per vedere questo basta scrivere un file hello.py inserendo la seguente riga

print("Hello World!")
ed eseguire l’interprete python su tale file

python hello.py

il risultato dovrebbe essere proprio la stampa della famigerata stringa Hello World!

Buona pratica: il main

Anche se Python non prevede esplicitamente un main, è sempre buona norma (per evitare futuri mal di testa), organizzare il codice in modo che si rispecchi la classica esecuzione con un main. Per fare questo si può usare la variabile __name__ (inizio e fine con un doppio underscore _) che contiene il nome dell’esecuzione (__main__ quando si esegue l’interprete con il comando mostrato sopra, altro valore comune è __test__).

1
2
3
4
5
def main():
    print("Hello World!")

if __name__ == "__main__":
    main()

Da notare che

  • il file viene ancora eseguito come uno script cioè partendo dalla prima riga,
  • essendo la prima riga un def viene quindi definita una procedura dal nome main
  • successivamente viene eseguito l’if della riga 4 che confronta il valore della variabile __name__ con la stringa (literal) __main__,
  • se questo confronto dà esito positivo, viene invocata la funzione main.

Dove sono i miei args?!

Abbiamo visto come un vero main in Python non esista, ma allora come si possono recuperare i parametri della riga di comando? Ad esempio il comando

python hello_args.py Mario Rossi 34

ha tre parametri: Mario, Rossi e 34. Per accedere a questi parametri, bisogna utilizzare la variabile argv (arguments vector) presente nel modulosys della libreria standard di Python che, tuttavia, importato con l’istruzione import. Copiano in un file con il nome hello_args.py il seguente codice

1
2
3
4
5
6
7
import sys

def main():
    print(sys.argv)

if __name__ == "__main__":
    main()

ed eseguendo l’istruzione sopra, verrà prodotto in output qualcosa simile alla seguente riga

['hello_args.py', 'Mario', 'Rossi', '34']

che indica una lista (lo riconosciamo dalle parantesi quadre [ ]) che contiene

  1. nella prima posizione (indice 0) il nome del programma (script) eseguito,
  2. nelle rimanenti posizioni gli argomenti passati alla linea di comando.
Osserva

Come tutti i linguaggi di programmazione, anche Python ha i commenti. Un commento inizia con il carattere sharp # (cancelletto) e termina con la fine della riga. Non è prevista una sintassi apposita per i blocchi di commento, bisogna quindi utilizzare un # ad ogni inizio di riga di commento.

Variabili

Una differenza di Python con linguaggi come Java e C++ è che le variabili vengono dichiarate senza tipo

a = 10 # intero
b = 3.14 # float
c = "hello" # stringa
cc = 'world!' # stringa
Questo, tuttavia, non vuol dire che Python non sia un linguaggio tipizzato. Ad esempio, le seguenti istruzioni (successivamente a quelle sopra), falliscono generando l’errore riportato sotto.
d = a - 1 # Ok
e = c + a # Errore

Traceback (most recent call last):
File "vars.py", line 5, in <module>
    e = c + a
TypeError: can only concatenate str (not "int") to str

Giustamente, Python si lamenta che (secondo lui) non ha senso concatenare (operatore + su stringhe) una stringa e un intero. Il modo giusto per ottenere l’effetto di creare la string hello10 è convertire prima l’intero a in stringa, questo è possibile utilizzando la funzione built-in str

e = c + str(a) # Ok
print(e)

Oltre a str sono disponibili altre funzioni per le conversioni “basilari”:

  • int(x) converte l’argomento x in intero,
  • float(x) converte l’argomento x in numero decimale (floating point).
Esercizio

Scrivere un programma che calcola la media di 3 numero forniti dalla riga di comando (per accedere agli elementi di una lista, si usa la notazione indice v[i] con indice che prende i valori 0,1,2,...).

Operatori

Python possiede tutti gli operatori aritmetici e logici che sono presenti nei linguaggi di programmazione. Qui presentiamo solo i più importanti di questi operatori, una lista più esauriente si può trovare a questa pagina.

OperatoreNomeEsempio
+Addizione1 + 3 = 5
-Sottrazione3.5 - 2 = 1.5
*Moltiplicazione4 * 4 = 16
/Divisione5 / 10 = 0.5
%Resto4 % 3 = 1
**Potenza2 ** 3 = 8
//Divisione intera5 // 2 = 1
Esercizio

Scrivere un programma che faccia la divisione euclidea di un intero n per un intero m fornendo un intero q (quoziente) e un intero r (resto) tali che \[ n = mq + r \] i valori di input n ed m vanno presi dalla riga di comando mentre i valori di output q ed r vanno stampati sulla console.

Funzioni

È sempre buona norma dividere il codice in blocchi ognuno dei quali si occupa di risolvere un problema ben specifico. Il modo più semplice di dividere in blocchi è utilizzando le funzioni o subroutine (un altro modo è utilizzando la programmazione ad oggetti che tratteremo in una lezione futura).

In Python una funzione si dichiara utilizzando la parola chiave def, seguita dalla firma della funzione:

  • nome della funzione e
  • lista dei parametri.
def nomeFunzione(parametro1, parametro2, ...):
    istruzione1
    istruzione2
    # ...
    return valoreDaRestituire

In Python il tipo ritornato da una funzione ed il tipo dei parametri non sono obbligatori (nelle prime versioni di Python non erano previste, ma più di recente è stata introdotta la possibilità di indicare i tipo). Ad esempio la funzione somma del codice sotto, avrà risultati diverso in base ai parametri forniti

1
2
3
4
5
6
7
8
9
def somma(a, b):
    return a + b

def main():
    print(somma(1,2))
    print(somma("1", "2"))

if __name__ == "__main__":
    main()

Valori di ritorno

Per ritornare un valore da una funzione in Python si usa l’istruzione return. Nell’esempio visto sopra, la funziona somma restituisce il risultato dell’operazione a + b. L’istruzione return fa anche terminare l’esecuzione della funzione ovunque questa si trovi

Le funzioni Python ritornano sempre un valore, quando questo non è esplicitato dal programmatore, questo valore è None.

1
2
3
4
5
def noneReturn():
    pass

a = noneReturn()
print(a)

In questo esempio si vede anche come creare un blocco che non ha alcuna istruzione (in questo caso si tratta di un blocco funzione, ma lo stesso si può fare con blocchi cicli e classi).

Ritornare più valori

Altra caratteristica interessante di Python, è la possibilità che una funziona restituisca più di un valore

1
2
3
4
5
6
7
8
def minmax(a, b):
    return min(a,b), max(a,b)

def main():
    print(minmax(3,1))
    
if __name__ == "__main__":
    main()

Nell’esempio sopra, la funzione minmax restituisce due valori: il minimo ed il massimo dei due parametri passati in ingresso.

Osserva

Nell’esempio di codice minmax si può vedere l’utilizzo di due altre funzioni standard di Python: min restituisce il minimo tra 2 o più valori e max restituisce il massimo tra 2 o più valori.

Esercizio

Ri-scrivere il codice per la divisione euclidea (vedi sopra) utilizzando una funzione che prende in input n ed m e che restituisce i valori q e r.

Esercizio: Equazione di secondo grado

Scrivere una funzione Python secondoGrado che calcola le soluzioni dell’equazione

$$ ax^2 + bx + c = 0 $$

quando \(a\), \(b\) e \(c\) sono input della funzione e le due soluzioni \(x_1\) e \(x_2\) sono output. Per calcolare \(\sqrt{x}\) si può usare la funzione sqrt(x) attraverso il pacchetto math che va importato

import math
...
def secondoGrado(a, b, c):
    ...
    # mette in 'r' la radice quadrata di 'discriminante'
    r = math.sqrt(discriminate) 
    ...

In Python è possibile catturare valori di ritorno multipli sia utilizzando le tuple, sia utilizzando le variabili. Ad esempio per mettere minimo e massimo in due variabile usando la nostra funzione minmax possiamo usare il seguente codice

1
2
3
minimo, massimo = minmax(3, 1)
print(minimo) # stampa 1
print(massimo) # stampa 3

Attenzione

Quando si usano funzioni con più valori ritornati bisogna fare attenzione a cosa viene catturato.

v = minmax(2, -1)
print(v) # stampa (-1, 2) -> tupla
v, w = minmax(2, -1)
print(v) # stampa -1 -> intero
A sinistra dell'uguale ci può essere
  • una sola variabile questa variabile sarà una tupla se la funzione restituisce più di un valore
  • un numero variabili uguale al numero di variabili restituite dalla funzione

In tutti gli altri casi l’interprete Python darà un messaggio d’errore simile al seguente

Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

Parametri opzionali e parametri con nome (named parameters)

Come la maggior parte dei linguaggi, anche Python permette l’utilizzo di valori di default per i parametri di una funzioni. I valori di default sono quelli che il parametro ha quando nulla viene indicato nella chiamata.

1
2
3
4
5
6
def saluta(nome="anonimo", cognome=""):
    print("Hello " + nome + " " + cognome + "!")

saluta() # 'Hello anonimo!'
saluta("Mario") # 'Hello Mario!'
saluta("Mario", "Rossi") # 'Hello Mario Rossi!'

In questo semplice esempio la funziona saluta ha due parametri (nome e cognome) che hanno un valore di default.

  • Quando nessun valore viene passato, i due valori di default vengono utilizzati (sia per nome che per cognome).
  • Quando un valore viene passato, solo il secondo viene inizializzato con il valore di default.
  • Infine, quando due valori vengono passati, nessun valore di default viene utilizzato.

Si vede come sia impossibile in questo modo avere un valore assegnato al secondo parametro (cognome), ma il valore di default per il primo parametro (nome). Per fare questo si può usare il nome del parametro nella chiamata

saluta(cognome="ignoto") # 'Hello anonimo ignoto!'

I nomi dei parametri si possono anche usare per indicare il valore da dare ai vari parametri senza necessariamente mantenere l’ordine con cui sono stati dichiari

saluta(cognome="Verdi", nome="Andrea") # 'Hello Andrea Verdi!'
Si veda come nell’esempio sopra, prima viene assegnato il valore al parametro cognome (che compare secondo nella lista) e poi al parametro nome (che compare primo nella lista).

Input

Chiedere l’input da tastiera in Python è molto semplice, basta usare la funzione input la quale si metterà in attesa di un input dalla tastiera

1
2
3
nome = input()
  Mario
print(nome) # stampa 'Mario'
È possibile indicare una stringa come parametri di input per aiutare a comprendere l’input richiesto
1
2
3
nome = input("Nome: ")
  Nome: Fabio
print(nome) # stampa 'Fabio'

Esercizio

Scrivere una funzione Python senza parametri che richieda di inserire in input nome e cognome e che restituisca le due stringhe (prima cognome e poi nome).

Condizione if, else e elif

1
2
3
4
5
6
7
8
9
def stampaNumero(numero, base=10):
    if(base == 16):
        print("{0:x}".format(numero))
    elif(base == 8):
        print("{0:o}".format(numero))
    elif(base == 2):
        print("{0:b}".format(numero))
    else:
        print("{0}".format(numero))

Cicli

Ciclo while

In Python è presente il ciclo while che esegue un gruppo di operazione fino a che una certa condizione è vera. La sintassi generica del ciclo while è la seguente

while condizione:
    # operazioni
    # ...
# prima istruzione dopo il ciclo

Si noti come le istruzioni del ciclo iniziano con una indentazione (riga 2 sopra) e terminano quando questa indentazione “rientra” (riga 4 sopra).

Ad esempio per stampare il countdown di capodanno da 10 a 0 si può il seguente ciclo while.

1
2
3
4
5
i = 10
while i>0:
    print(i, "...")
    i -= 1 # Senza il programma non termina!
print("...Buon 1991")

Un esempio più complicato permette di continuare a leggere l’input da tastiera fino a che non viene immesso il carattere q o Q, possiamo usare il seguente ciclo while.

1
2
3
lettura = ""
while (lettura != "q" and lettura != "Q"):
    lettura = input("Carattere (q per uscire): ")

La condizione controllo che contemporaneamente (operatore logico and):

  1. la variabile lettura non sia uguale alla stringa "q" e
  2. la variabile lettura non sia uguale alla string "Q" (notare maiuscolo).

Se una delle condizione (o entrambe) non sono vere, allora la condizione del while non è più vera ed il ciclo termina.

Ciclo for

Oltre al ciclo while, Python prevede un solo altro tipo di ciclo, il ciclo for. Il for di Python è di tipo for each cioè itera ogni elemento di un un oggetto che, ovviamente, deve essere iterabile. Un esempio di oggetto iterabile sono le liste

lista = [0,1,2,3,4,5,6,7,8,9]

La sintassi del for è la seguente

for variabile in iterabile:
    # operazioni
    # ...
# prima istruzione dopo il ciclo

Esattamente come nel ciclo while, l’indentazione del codice è usata per le operazioni all’interno del ciclo.

Esempio

Stampare il numero \(x^2\) (\(x\) al quadrato) per ogni intero \(x\) tra 1 e 9

1
2
3
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for x in lista:
    print(x*x) # si può anche scrivere x**2

La funzione range

Dichiarare esplicitamente gli elementi su cui iterare è, ovviamente, poco pratico e a volte impossibile. Per generare numeri interi in un certo range (intervallo) si può usare la funzione built-in (cioè che fa parte del linguaggio Python) range. Questa funzione accetta uno, due o tre parametri e restituisce in oggetto iterabile. Vediamo in generale l’utilizzo di range.

1
2
3
4
5
6
7
8
9
# Un parametro 'n' -> 0, 1, 2, ..., n-1
for i in range(10):
    print(i) # 0,1,2,...,9
# Due parametri 'm' e 'n' -> m, m+1, m+2, ..., n-1
for i in range(5,10):
    print(i) # 5,6,..,9
# Tre parametri 'm', 'n' e 'k' -> m, m+k, m+k+k, ...
for i in range(0, 100, 10):
    print(i) # 0,10,20,...,90
  • Michele Schimd © 2024
  • Ultimo aggiornamento: 17/02/2024
  • Materiale di studio e di esercizio per gli alunni dello Zuccante.

Creative Commons License