Passaggio all'ora solare 27 ottobre 2019 03:0002:00 sposta indietro l'orologio di 1 ora (si dorme 1 ora in più)
Python è un linguaggio di programmazione multi piattaforma interpretato, interattivo e orientato agli oggetti.
Può essere utilizzato su Windows, Linux, macOS, Azure e altri servizi online.

Prima di poter utilizzare Python è necessario installarlo dal sito ufficiale https://www.python.org/ (l'ultima versione ad oggi è la 3.7.4).
Esistono attualmente due versioni principali, la 2.x e la 3.x, se non avete vincoli particolari, installate l'ultima versione.
Su alcuni sistemi è già presente. Ad esempio alcune versioni di Linux hanno già installato la versione 2.x richiamabile con il comando python, mentre la versione 3.x è richiamabile con il comando python3. Su Windows è richiamabile con il comando py.exe
Tutti gli esempi riportati fanno riferimento alla versione 3.x su Windows.

L'installer mette a disposizione anche il comando pip, ovvero il gestore di pacchetti di Python.
Su Linux la versione 3.x richiede l'uso del comando pip3, può essere necessario installarlo a parte.
Su Windows 10 il comando python apre lo store di Windows proponendo l'installazione di Python, al momento la versione disponibile è la 3.7. Come dice l'avviso non è detto che siano supportate tutte le caratteristiche, meglio installarlo dal sito ufficiale https://www.python.org/

Per iniziare ad usare Python, apri la linea di comando (cmd.exe) e digita py (su Windows):
command line di Pythoncommand line di Python
quando hai finito, digita quit() per uscire.

In ogni caso il modo migliore per utilizzarlo è usare un editor come Visual Studio Code creando un file con estensione .py.
Una volta creato un file è possibile eseguirlo con la sintassi py .\nome_file.py o python3 .\nome_file.py su Linux

Info


Le caratteristiche principali sono:
  • linguaggio interpretato (come JavaScript in NodeJs)
  • variabili non tipizzate (come JavaScript)
  • un forte uso dell'indentazione per le istruzioni di test, cicli, funzioni, ecc...

La prima cosa che si può fare è, ad esempio, utilizzare l'istruzione print() per stampare:
>>> print(1 + 2)
3
>>> print("ciao" + " " + "mondo") 
ciao mondo

Variabili


Come dicevo le variabili non sono tipizzate, è possibile assegnare qualunque valore semplicemente definendo il nome della variabile e assegnandogli un valore
x = 1
y = 2
c = False
print(x + y)
# 3

a = "ciao"  # stringa con virgolette doppi
b = 'mondo'  # stringa con virgolette singole
print(a + " " + b)
# ciao mondo
A differenza di altri linguaggi come JavaScript non è necessario far precedere la variabile da una keyword come var, let, const oppure dalla definizione del tipo (int, string, double, ...) come avviene in C#
Altra cosa importante: non serve nessun terminatore di linea, come ad esempio il punto e virgola ";" usato da JavaScript o C#
Le stringhe posso esse definite indifferentemente con le virgolette doppie o singole, ma conviene darsi uno standard e utilizzare sempre la stessa convenzione

Nel caso il nome di variabile sia composto da più parole, la convenzione è quella di scrivere le parole in minuscolo sperate da un underscore:
saldo_finale = 234.5
Una cosa importante da ricordare, non esiste un cast implicito tra più tipi come avviene in JavaScript. Ad esempio questo genera un eccezione:
x = 1
a = "3"
print(x + a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
è sempre necessario specificare un cast esplicito
>>> print(x + int(a))
4
>>> print(str(x) + a)
13
Il simbolo + è usato sia come operatore di somma, nel caso di operandi numerici, oppure come operatore di concatenamento nel caso di stringhe.

Commenti


Come in tutti i linguaggi i commenti sono importanti è indispensabili.
Servono per:
  • commentare momentaneamente alcune parti del codice non più necessarie o momentaneamente non necessarie (debug)
  • chiarire alcune parti del codice
  • ricordarci cosa abbiamo fatto a distanza di tempo
  • aiutare i colleghi quando dovranno intervenire sul nostro codice
I commenti sono molto importanti quindi vanno usati.
In Python i commenti iniziano con il carattere sharp/cancelletto #
a = "ciao"  # commento in linea
# le seguente istruzione è solo di debug, abilitare se serve
# print("valore di a: " + a)
# questo è un esempio di commento
# e questa è un altra linea di commento
print("commento")
Per convenzione e leggibilità, va lasciato uno spazio dopo il carattere #

Stringhe


Le stringhe, come già accennato, possono essere definite sia tra due apici singoli che tra due doppi apici.
Hanno a disposizone varie funzioni per modificare il valore, qui sotto alcune di esempio
>>> mia_stringa = "ciao mondo"
>>> mia_stringa.upper()
'CIAO MONDO'

>>> mia_stringa.lower()
'ciao mondo'

>>> mia_stringa.capitalize()
'Ciao mondo'

>>> mia_stringa.count()
TypeError: count() takes at least 1 argument (0 given)
>>> mia_stringa.count("0")
3

>>> mia_stringa
'ciao mondo'
se invece voglio calcolare la lunghezza di una stringa uso la funzione len()
>>> len(mia_stringa)
10
Formattazione

Per scenari più complessi, dove non devo semplicemente concatenare due stringhe, ma formattarle secondo un pattern specifico, posso usare 3 formalismi tramite l'uso delle parentesi graffe
x = 1
y = 3
# primo esempio: segue l'ordine posizionale dei parametri
"Risultato: {} + {} = {}".format(x, y, x + y)

# secondo esempio: indico esplicitamente la posizone del parametro da usare
"Risultato: {1} + {2} = {0}".format(x + y, x, y)

# terzo esempio: solo python3, inserisco direttamente le variabili in linea 
f"Risultato: {x} + {y} = {x+ y}"

# in tutti i casi il risultato è questo
# 'Risultato: 1 + 3 = 4'
Nell'ultimo esempio la stringa è preceduta dalla lettera f minuscola e le variabile sono iserite direttamente all'interno delle parentesi graffe
Se voglio inserire un ritorno a capo nella stringa posso usare la sequenza di escape \n
print("riga1\nriga2")

Numeri


Per gestire i numeri ci sono i seguenti operatori:
  • + (somma)
  • - (sotrazione)
  • * (moltipicazione)
  • / (divisione)
  • // (divisione intera)
  • % (resto della divisione)
  • ** (elevamento a potenza)
Se devo convertire una stringa in numero posso usare le funzioni int() o float()
# converte la stringa "1234" nel numero 1234
int("1234")

# converte la stringa, con separatore decimale, "1.234" nel numero 1.234
float("1.234")

# la seguente istruzione genera un eccezione, 
# non posso convertire una string che rappresenta un float in int
int("1.234")
# ValueError: invalid literal for int() with base 10: '1.234'

# devo fare la conversione in due passaggi
int(float("1.234"))
# ritorna 1
Tramite la libreria math ho a disposizione altre funzioni come
# import di tutta la libreria
import math

# calcolo radice quadrata
math.sqrt(9)
# 3.0

# arrotondamento per eccesso
math.ceil(3.45)
# 4

# arrotondamento per difetto
math.floor(3.45)
# 3

math.pi
# 3.141592653589793
Se voglio generare numeri casuali posso usare la libreria random
import random
# numero casuale tra 1 e 10
print(random.randint(1, 11))
Con la sintassi import nome_libreria importo completamente tutta la libreria

Valori boleani


I valori boleani possono assumere il valore True o False e possono essere combinati con gli operatori logici: and, or e not.
Attenzione, rispetto a JavaScript o C#, le keywors True / False hanno la lettera iniziale Maiuscola

Date


Ovviamente spesso si ha a che fare anche con i valori di tipo data e ora. Python mette a disposizione una specifica libreria (standard) per questire questo tipo di dato di nome datetime.

La libreria va prima caricata con l'istruzione from nome_libreria import item1
from datetime import datetime
# from datetime import datetime, timedelta
La sintassi from nome_libreria import item1, item2, ..., a differenza della precedente import nome_libreria, non importa tutta la libreria, ma solo le parti indicate dopo la keyword import
dopo l'import posso usare la libreria
# data ora corrente
now = datetime.now()
print(now)
# 2019-10-06 23:52:36.458734

# se devo concatenerla ad una stringa devo fare il cast con str()
print("Adesso: " + str(now)) 

# posso prendere solo alcune parti
f"Data: {now.day}/{now.month}/{now.year}"
# 'Data: 6/10/2019'
nel caso avessi una data in formato stringa, posso fare un parse, usando la funzione datetime.strptime()
str = input("Che giorno è oggi? (gg/mm/aaaa) ")
# Che giorno è oggi? (gg/mm/aaaa) 06/09/2019

dt = datetime.strptime(str , "%d/%m/%Y")
print(dt)
# 2019-09-06 00:00:00

Input


Oltre a visualizzare delle informazioni con print(), posso anche richiede un input all'utente tramite la funzione input()
x = input("primo numero: ")
# primo numero: 1

y = input("secondo numero: ")
# secondo numero: 3

f"Somma di {x} + {y} = {x + y}"
# 'Somma di 1 + 3 = 13'

Istruzioni condizionali


In qualsiasi programma vi è sempre la necessità di condizionare il flusso del codice in base a delle espressioni logiche. Il risultato True o False di queste espressioni, permette di eseguire una parte di codice o meno.

In Python si ottiene con l'istruzione if - elif - else nella forma
if espressione_logica_1:
    istruzioni da eseguire se espressione_logica_1 è vera
    eventuali altre istruzioni
elif espressione_logica_2 e:
    istruzioni da eseguire se espressione_logica_2 è vera
    eventuali altre istruzioni
elif espressione_logica_N e:
    istruzioni da eseguire se espressione_logica_N è vera
    eventuali altre istruzioni
else:
    istruzioni eseguite se nessuna condizione è vera
    eventuali altre istruzioni
ad esempio
x = input("Inserisci un numero: ")
if x < 0:
  # se espressione "if" è vera
  print("negativo")
elif x > 0:
  # se espressione "elif" è vera
  print("positivo")
else:
  # se nessuna condizione è vera
  print("zero")
Attenzione all'indentazione, in Python è fondamentale per la corretta esecuzione del codice.
A differenza di altri linguaggi, non ci sono istruzioni, then else endif come in VisualBasic, oppure caratteri separatori, parentesi graffe ({}) o punto e virgola (;) come in C#, per identificare quali istruzioni sono all'interno dei singoli blocchi dell'if - elif - else.
L'unica discriminante è l'Indentazione, quindi è molto importante usare sempre lo stesso sisitema di indentazione, ovvero usare sempre gli spazi oppure sempre il tab. Anche in questo caso usa sempre la stessa convenzione univoca e manentienila nel tempo, altrimenti potrebbero verificarsi dei comportamenti inaspettati del codice.
Operatori di comparazione

Gli operatori di comparazione disponibili sono:
  • > (maggiore)
  • < (minore)
  • <= (minore o uguale)
  • >= (maggiore o uguale)
  • == (uguale)
  • != (diverso)
nel caso di comparazione tra stringhe esiste anche l'operatore in
if frutta in ('mele', 'pere', 'arancie'):
  print("OK")
se voglio fare una comparazione case insensitive uso la funzione lower()
if frutta.lower() in ('mele', 'pere', 'arance'):
  print("OK")
l'operatore in è la forma compatta di
if frutta == 'mele' or frutta == 'pere' or frutta == 'arance':
  print("OK")
dove si vede l'utilizzo dell'operatore or; gli altri operatori disponibili sono and e not.
Fai attenzione al due punti (:) che compare alla fine della riga con l'espressione logica di confronto, è fondamentale come l'indentazione.
Operatore ternario

Anche in Python esiste l'operatore ternario nella forma
valore_Vero if espressione else valore_Falso
ad esempio
>>> print(4 if True else 5)
4
>>> print(4 if False else 5)
5
>>> y = 4
>>> x = "Positivo" if y >= 0 else "Negativo"
>>> print(x)
Positivo
l'equivalente in JavaScript è
espressione ? valoreVero : valoreFalso

Collection


Come altri linguaggi, Python, supporta vari tipi di collection come: Liste, Array e Dizionari
Liste / List

Le liste si creano delimitando i valori in parentesi quadre [ ... ]
lista_vuota = []
lista_citta = ["Milano", "Como", "Bergamo"]
print(lista_citta)
# ['Milano', 'Como', 'Bergamo']

# aggiungo valori alla lista
lista_citta.append("Verona")
print(lista_citta)
# ['Milano', 'Como', 'Bergamo', 'Verona']

print(lista_citta[1])  # secondo elemento della lista
# como

lista_citta.insert(0, "Torino")  # inserisce un valore all'inizio
# ['Torino', 'Milano', 'Como', 'Bergamo', 'Verona']

len(lista_citta)
# 5

lista_citta.sort()
print(lista_citta)
# ['Bergamo', 'Como', 'Milano', 'Torino', 'Verona']

print(lista_citta[2:3])  # dal terzo elemento al quarto
#['Milano', 'Torino']
Array

Per usare gli Array, deve prima essere importata la libreria array
from array import array
vari = array("f")  # array di float (f)
vari.append(11)
vari.append(12.5)
vari.append(4.75)
print(vari)
# array('f', [11.0, 12.5, 4.75])

print(vari[-1])  # ultimo elemento
# 4.75
Le differenze principale tra List e Array sono:
  • List: può contenere qualunque tipo di dato
  • Array: può contenere solo tipi semplici, come i numeri, inoltre devono essere tutti dello stesso tipo
Anche sugli Array posso usare le funzioni delle List come: insert, sort, ecc...
Dictionary

Un Dictionary è una collection composta da una serie di chiavi e valori compresi tra le parentesi graffe { ... }
persona = {"nome": "Alberto", "citta": "Monza"}  # creo un dictionary
print(persona)
# {'nome': 'Alberto', 'citta': 'Monza'}

print(persona["nome"])
# Alberto

persona["login"] = "local\\alberto"  # aggiungo una coppia chiave=valore
print(persona)
# {'nome': 'Alberto', 'citta': 'Monza', 'login': 'local\\alberto'}
posso aggiugere un dictionary ad una lista
lista_citta.append(persona)
print(lista_citta)
# ['Bergamo', 'Como', 'Milano', 'Torino', 'Verona', {'nome': 'Alberto', 'citta': 'Monza', 'login': 'local\\alberto'}]
o aggiungere una lista ad un dictionary
persona["numeri"] = [1, 3, 7]
print(persona)
# {'nome': 'Alberto', 'citta': 'Monza', 'login': 'local\\alberto', 'numeri': [1, 3, 7]}
Le differenze principali tra List e Dictionary sono:
  • List: indicizzazione degli elementi partendo dal valore zero, l'ordine è quello di inserimento
  • Dictionary: è un elenco di coppie composte da chiave e valore, l'ordine con cui sono persistite, normalmente, non coincide con quello di inserimento

Cicli


Il cicli possono essere gestiti con for o con while
for

Le sintassi per il for sono due:
  • for variabile in collection
  • for variabile_indice in range(start, stop, step)
# sintassi basata sulle collection
lista_citta = ['Milano', 'Como', 'Bergamo', 'Verona']
for citta in lista_citta:
    print(citta)
    # altre istruzioni all'interno del ciclo

# da come risultato
Milano
Como
Bergamo
Verona
se invece voglio fare un ciclo basato su un numero compreso tra un minimo e massimo, uso al funzione range(start, stop, step)
for n in range(3, 8):
    print(n)

# da come risultato
3
4
5
6
7
allo stesso modo posso fare un ciclo con numeri che si decrementano
for n in range(10, 1, -2):
    print(n)

# da come risultato
10
8
6
4
2
while

Viene esegue il ciclo finchè l'espressione di controllo è vera
while espressione_controllo:
    istruzioni
    modifica_espressione_controllo
ad esempio
n = 0
while n < 5:
    print(n)
    n = n + 1

# da come risultato
0
1
2
3
4
Nel caso dovessi uscire dal ciclo prima che la condizione di controllo diventi False, posso usare l'istruzione break
lista_citta = ['Milano', 'Como', 'Bergamo', 'Verona']
cerca = "como"
# esempio di find
n = 0
while n < len(lista_citta):
    citta = lista_citta[n]
    print(citta)
    if citta.lower() == cerca.lower():
        print(f"Trovato '{cerca}', esco dal ciclo")
        break
    n = n + 1

# da come risultato
Milano
Como
Trovato 'como', esco dal ciclo
Anche nel caso dei cicli, fai attenzione all'indentazione e ai due punti (:) dopo l'espressione di controllo. Questi due aspetti sono essenziali per il corretto funzionamento.

Continua a leggere Cominciare ad usare Python - Parte 2