Introduzione a Python

Guida rapida a Python

[TOC]

Le basi del linguaggio

Qualche premessa

  • Python è stato progettato per la leggibilità e presenta alcune somiglianze con la lingua inglese, influenzato anche dal linguaggio della matematica. ed i tipi di dato sono statici.

  • In Python si usa andare a capo al termine di ogni comando, al contrario di altri linguaggi di programmazione che spesso usano punto e virgola o parentesi.

  • In Python si distinguono sempre le minuscole e le maiuscole.

  • In Python si conta sempre partendo da 0 (non da 1), ogni indice parte da 0.

  • In Python è fondamentale l’indentazione, cioè il rientro delle linee di testo del programma, con spazi bianchi o tabulazioni. L’indentazione si usa per distinguere blocchi di istruzioni, da eseguire insieme nel controllo del flusso del programma, ad esempio nella definizione di funzioni, istruzioni condizionali, cicli di istruzioni da ripetere, gestione degli errori. Altri linguaggi di programmazione usano spesso le parentesi graffe per questo scopo.

  • In Python non si devono dichiarare le variabili all’inizio del programma, ed il tipo di dati non è fisso. Per questo è più facile da apprendere per i principianti. Altri linguaggi come Perl, Julia, PHP, JavaScript si comportano in modo simile. Invece in linguaggi come C, C++, Java le variabili vanno dichiarate rima di usarle.

  • Quando viene eseguito un programma (script) Python viene prima precompilato in bytecode, un codice intermedio tra il codice sorgente ed il linguaggio macchina, poi il bytecode viene salvato per un successivo riutilizzo, infine interpretato e convertito in linguaggio macchina per la vera e propria esecuzione.

  • In alcuni casi le funzioni Python sono compilate in tempo reale in linguaggio macchina (piattaforma Numba) oppure convertite in C e compilate come in quel linguaggio (piattaforma Cython). In questo modo si velocizza molto l’esecuzione del programma.

  • Python ammette anche una modalità interattiva, ideale per i principianti, in cui si inseriscono i comandi e si vede subito il risultato. In questo è simile al Lisp ed a software come SageMath, Octave, MatLab, Mathematica, ma differente dagli altri linguaggi di programmazione.

La documentazione online.

Variabili

Una variabile si può nominare in qualsiasi modo a condizione che obbedisca alle seguenti regole:

  1. Può essere una sola parola, non una frase.
  2. Può utilizzare solo lettere, numeri e il carattere di sottolineatura _ , il trattino basso .
  3. Non può iniziare con un numero.
  4. Deve essere un nome diverso dai nomi riservati di funzioni, costanti ed istruzioni del linguaggio.

Assegnazione del valore

L’operatore di assegnazione è =

Esempi:

  • a = b assegna il valore b alla variabile a
  • x = 1 assegna il valore 1 alla variabile x
  • spam = 'Ciao' assegna il valore ‘Ciao’ alla variabile spam.

Non confondere mai l’operatore di assegnazione del valore ad una variabile = con l’operatore di uguaglianza tra due termini di una espressione ==.

assegnazione multipla

Il trucco dell’assegnazione multipla è una scorciatoia che consente di assegnare valori a più variabili nella stessa riga di codice.

Esempi:

*assegnazione singola°

size = 'grasso'
color = 'arancio'
disposition = 'forte'

*assegnazione multipla°

size, color, disposition = ['grasso', 'arancio', 'forte']

L’assegnazione multipla è utile anche per scambiare i valori tra due variabili:

Esempio:

a, b = 'Alice', 'Bob'
a, b = b, a
print(a)
print(b)

Tipi di dati incorporati nel linguaggio

Un programma tratta molti tipi diversi di dati, come numeri, caratteri, testi. I più comuni sono:

NomeDescrizione
intNumero intero, con segno
floatNumero decimale in virgola mobile (floating-point in inglese)
complexnumero complesso, come 2 + 3j ( j è l’unità immaginaria )
boolValore logico (booleano), vero o falso (true o false in inglese)
strStringa, una sequenza di caratteri, come una parola od una frase

Note:

  1. Per i numeri decimali si usa sempre il punto, al posto della virgola, come in inglese
  • I numeri decimali si scrivono sia con il punto seguito dalle cifre decimali che in notazione esponenziale (scientifica), con e per indicare la potenza di 10 per cui moltiplicare

  • Per i numeri complessi si usa j come unità immaginaria (il quadrato di j è uguale a -1, $j^2 = -1$ ), al posto di i che si usa invece in matematica.

  • I caratteri delle stringhe sono memorizzati in Unicode (metodo di codifica dei caratteri indipendente dalla lingua e dal sistema informatico utilizzato)

Esempi:

  • -2, -1, 0, 1, 2, 3, 4, 5 sono numeri interi ( int).
  • -1.25, -1.0, --0.5, 0.0, 0.5, 1.0, 1.25 sono numeri a virgola mobile (float).
  • 1.2e3, che equivale a 1200, è sempre un numero a virgola mobile in notazione esponenziale a base 10.
  • 'a', 'aaa', 'Ciao!', '11 gatti', '345' sono stringhe (str), e sono sempre racchiuse tra apici (quotate).

Sono definiti internamente alcuni tipi di dati per le strutture dati composte, formate con i tipi semplici (scalari) precedenti

NomeDescrizione
setInsieme, una collezione di dati qualunque non ordinata, modificabile
listLista, una collezione ordinata di dati, con un indice
tupleTupla, una lista non modificabile
dictun dizionario, una tabella composta di coppie chiave - valore

Altri tipi di dati utili non sono incorporati nel linguaggio, ma forniti da moduli aggiuntivi.

NomeModuloDescrizione
fractionfractionsfrazione, numero razionale come 2/3, 0.1
decimaldecimaldecimale con precisione assegnata, alternativo a float
arraynumpyvettore, matrice, griglia multidimensionale di dati
datetimedatetimeuna combinazione di data, ora e fuso orario

Operatori matematici

In ordine di precedenza:

OperatoreOperazioneEsempio
**Esponente, elevamento a potenza2 ** 3 = 8
%Modulo/Resto della divisione intera22 % 8 = 6
//Divisione tra interi22 // 8 = 2
/Divisione tra interi o decimali22 / 8 = 2.75
*Moltiplicazione3 * 3 = 9
-Sottrazione5 - 2 = 3
+Addizione2 + 2 = 4

Per alterare la precedenza si usano le espressioni come in matematica.

Esempio di espressioni nell’interprete interattivo:

2 + 3 * 6
(2 + 3) * 6
2 ** 8
23 // 7
23 % 7
(5 - 1) * ((7 + 1) / (3 - 1))

Alcune funzioni base

Nel linguaggio base sono definite molte funzioni, qui alcune tra le più comuni

FunzioneDescrizione
print()stampa in uscita una stringa di risultati
input()legge in ingresso dati inseriti dall’utente
help()informazioni di aiuto su una funzione od un modulo
type()controlla il tipo dati di una variabile
abs(n)Restituisce il valore assoluto di un numero
round(x)Arrotonda un numero
divmod(m,n)Restituisce il quoziente ed il resto di una divisione
len(string)Restituisce la lunghezza di una stringa

La funzione print

Stampa la stringa o le variabili passate tra parentesi come argomento

print('Ciao Mondo!')
a = 42
print('Ciao Mondo! La risposta è ', a)

Per modificare la print si usano le parole chiave end: terminatore e sep: separatore

print('Ciao', end='')
print('Mondo')
print('gatti', 'cani', 'topi')
print('gatti', 'cani', 'topi', sep=',')

La funzione input

La funzione input serve per leggere il valore di un dato, che deve essere immesso dall’esecutore del programma

Esempio:

print('Come ti chiami?')   # chiede il nome
myName = input()
print('Un vero piacere incontrarti,', myName)

La funzione help

Informazioni sulle funzioni

help(print)

Informazioni su un modulo (da caricare prima nel programma con import)

import math
help(math)
help(math.cosh)

Senza argomenti è uno strumento interattivo per consultare la documentazione del linguaggio

elp()

La funzione type

Se non si è sicuri del tipo di dato si usa la funzione speciale type per visualizzarlo:

*  type(27)  dà come risultato *int*
*  type('ciao') dà come risultato *str*

Le funzioni di conversione str, int, float, …

FunzioneDescrizione
int()Converte in un numero intero
float()Converte in un numero decimale
complex()Converte in un numero complesso
bool()Restituisce il valore booleano (vero o falso)
chr()Converte un codice Unicode in un carattere
str()Converte in una stringa
bin()Converte un numero in binario
oct()Converte un numero in ottale
hex()Converte un numero in esadecimale
dict()Converte i dati in un dictionary
tuple()Converte i dati in una tupla
set()Converte i dati in un set
frozenset()Converte i dati in un frozenset
bytearray()Converte in una lista di bytes modificabile
bytes()Converte in una lista di bytes immutabile

I nomi dei tipi di dato corrispondono anche a delle funzioni per convertire un tipo in un altro. Ad esempio: * int(‘345’) converte la stringa ‘345’ nel numero intero 345 * float(27) converte il numero intero 27 nel numero decimale 27.0

Integer to String or Float:

str(29)
print('I am {} years old.'.format(str(29)))
str(-3.14)

Float to Integer:

int(7.7)
int(7.7) + 1

Commenti

Per rendere il codice più comprensibile è una buona pratica aggiungere molti commenti.

Commento su una linea:

# Questo è un commento inline

Commento multilinea:

#  Questo invece è un commento
#  su più righe

Codice con un commento:

a = 1  # inizializzazione

Notare i due spazi prima del commento.

Pacchetti e moduli aggiuntivi

Importazione di moduli

In Python si chiama modulo o libreria una raccolta di funzioni, dati e costanti (classi, oggetti e metodi nel linguaggio della programmazione orientata agli oggetti). Un modulo in genere è contenuto in un file del computer con estensione .py.

Per utilizzare un modulo si usa l’istruzione import all’inizio di un programma

import math

in questo caso viene importata la libreria standard di funzione matematiche, dal file math.py. Nel resto del programma si possono usare funzioni, costanti e tipi di dati del modulo usando math come prefisso. Esempio:

import math
math.pi
math.cos( 0.15 * math.pi )

Si può anche cambiare nome al modulo con il comando import, ed utilizzare nel programma il nuovo prefisso

import math as m
m.cos( 0.15 * m.pi )

Infine si possono importare nello spazio dei nomi principale del programma alcune funzioni e costanti del modulo ed utilizzarle direttamente senza prefisso

from math import pi,sin
sin(0.3 * pi)

E’ possibile anche importare direttamente nel programma tutti i nomi di un modulo. Ma è una pessima pratica, generatrice di errori e confusione, che ha senso utilizzare solo da principianti, quando si muovono i primi passi nel mondo della programmazione e del linguaggio python, e si scrivono programmi molto semplici

from math import *
cos(0.2 * pi)
import random

for i in range(5):
    print(random.randint(1, 10))
import random, sys, os, math
from random import *.

La funzione dir

Una funzione interna del linguaggio, dir(), elenca tutti i nomi di funzioni e variabili di un modulo

import math
dir(math)

Se si chiama dir() senza argomenti vengono elencati tutti i nomi noti nel programma

dir()

I moduli base per la matematica

ModuloDescrizione
mathmatematica con i numeri reali, funzioni e costanti più comuni
cmathmatematica con i numeri complessi
mpmathmatematica con precisione decimale arbitraria
decimaldecimali, per ovviare ad alcune limitazioni del tipo float in math
fractionsfrazioni, per ovviare ad alcune limitazioni del tipo float in math
randomnumeri casuali, probabilità
statisticsfunzioni statistiche

I moduli aggiuntivi più comuni per la matematica

ModuloDescrizione
sympySymbolic Python, calcolo simbolico, algebra assistita dal calcolatore
numpyNumerical Python, calcolo numerico, costanti matematiche
scipyScientic Python, estensione di numpy, calcolo, costanti fisiche e chimiche
pandasAnalisi e manipolazione dei dati, in particolare tabelle e serie temporali
matplotlibModulo per disegno, grafica e visualizzazione dei dati

Controllo di Flusso

Operatori logici (Boolean)

OperatoreDescrizione
and(expr1) and (expr2) , vero se entrambe le espressioni sono vere
or(expr1) or (expr2), vero se una delle due è vera
notnot (expr), vero se l’espressione è falsa
is(expr) is True (False), l’espressione è vera (o falsa)
is not(expr) is not True (False), l’espressione non è vera (o non è falsa)

Tavola della verità per and:

EspressioneRisultato
True and TrueTrue
True and FalseFalse
False and TrueFalse
False and FalseFalse

Tavola della verità per or:

EspressioneRisultato
True or TrueTrue
True or FalseTrue
False or TrueTrue
False or FalseFalse

Tavola della verità per not:

EspressioneRisultato
not TrueFalse
not FalseTrue

Operatori di confronto

OperatoreSignificato
==Uguale
!=Diverso
<Minore di
>Maggiore di
<=Minore od uguale
>=Maggiore od uguale

Un’espressione con questi operatori è vera o falsa a seconda che la condizione sia soddisfatta o meno.

Esempi:

42 == 42

True

40 == 42

False

'hello' == 'hello'

True

'hello' == 'Hello'

False

'gatto' != 'cane'

Vero

42 == 42.0

True

42 == '42'

False (il secondo termine è una stringa)

Queste istruzioni sono equivalenti:

if a is True:
   pass
if a is not False:
   pass
if a:
   pass

Ed anche queste:

if a is False:
   pass
if a is not True:
   pass
if not a:
   pass

Mescolare operatori logici e di confronto

(4 < 5) and (5 < 6)
(4 < 5) and (9 < 6)
(1 == 2) or (2 == 2)
2 + 2 == 4 and not 2 + 2 == 5 and 2 * 2 == 2 + 2

L’istruzione if

if name == 'Alice':
    print('Hi, Alice.')

L’istruzione else

name = 'Bob'

if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger.')

L’istruzione elif

name = 'Bob'
age = 5

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
name = 'Bob'
age = 30

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')

Cicli while

Con while seguito da una condizione si definisce un blocco di istruzioni che viene ripetuto finchè la condizione è soddisfatta

spam = 0

while spam < 5:
    print('Hello, world.')
    spam = spam + 1

L’istruzione break

Se durante l’esecuzione del programma si raggiunge un’istruzione break, si esce immediatamente dal ciclo while

while True:
    print('Please type your name.')
    name = input()
    if name == 'your name':
        break

print('Thank you!')

L’istruzione continue

Se durante l’esecuzione del programma si raggiunge un’istruzione contina, si ritorna all’inizio del ciclo.

while True:
    print('Who are you?')
    name = input()
    if name != 'Joe':
        continue
    print('Hello, Joe. What is the password? (It is a fish.)')
    password = input()
    if password == 'swordfish':
        break

print('Access granted.')

La funzione range()

FunzioneDescrizione
range(n)Crea una sequenza di numeri interi, da 0 a n - 1
range(i,j,k)Crea una sequenza da i a j (escluso) con incremento k

La lista risultante, di tipo range, è una sequenza di numeri interi. |

La funzione * range () * può anche essere chiamata con tre argomenti. I primi due argomenti saranno i valori iniziale e finale, e il terzo sarà il passo. Il passo, o incremento, è la quantità di cui la variabile viene aumentata dopo ogni iterazione. Per un conto alla rovescia si definisce un incremento negativo.

Esempi:

range(20)
range(1, 20, 2):
range(10, 0, -1):

I cicli for, finiti

Con l’istruzione for si definisce la ripetizone di un blocco di istruzioni per una serie di valori di una variabile, un ciclo finito

Esempi:

print('My name is')
for i in range(5):
    print('Jimmy Five Times ({})'.format(str(i)))
for i in range(0, 10, 2):
   print(i)
for i in range(5, -1, -1):
    print(i)

Funzioni

L’istruzione def

L’istruzione def serve per definire nuove funzioni

def hello(name):
    print('Hello {}'.format(name))

L’istruzione return ed i valori restituiti

Quando si crea una funzione utilizzando l’istruzione def, si può specificare il valore restituito con un’istruzione return. Un’istruzione return è composta dalla chiave return seguita dal valore o dall’espressione che la funzione dovrebbe restituire.

import random
def getAnswer(answerNumber):
    if answerNumber == 1:
        return 'It is certain'
    elif answerNumber == 2:
        return 'It is decidedly so'
    elif answerNumber == 3:
        return 'Yes'
    elif answerNumber == 4:
        return 'Reply hazy try again'
    elif answerNumber == 5:
        return 'Ask again later'
    elif answerNumber == 6:
        return 'Concentrate and ask again'
    elif answerNumber == 7:
        return 'My reply is no'
    elif answerNumber == 8:
        return 'Outlook not so good'
    elif answerNumber == 9:
        return 'Very doubtful'

r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)

Il valore None

spam = print('Hello!')
spam is None

Nota: non confrontare mai “None” con l’operatore “==”. Usa sempre “is”.

Gestione base delle eccezioni, istruzioni try … except

Di solito quando si fa un errore durante l’esecuzione il programma si interrompe. Per modificare questo comportamento si usa un blocco di istruzioni

try:
	<qualche operazione che può dare un errore>
except  <Tipo di errore > as e:
	<fai qualcos'altro invece di uscire dal programma>

Esempio:

def spam(divideBy):
    try:
        return 42 / divideBy
    except ZeroDivisionError as e:
        print('Error: Invalid argument: {}'.format(e))

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

Lo Zen di Python

Dal sito PEP 20 – The Zen of Python :

Il programmatore esperto Tim Peters ha elencato i principi guida per un progetto Python in 20 aforismi, solo 19 dei quali sono stati scritti.

import this

Note conclusive

Una rapida introduzione al linguaggio python basata su python cheatsheet e molte altre fonti, citate in bibliografia, con licenze Creative Commons license .