Python e' case sensitive
I nomi delle variabili iniziano con un carattere alfabetico e contengono caratteri, numeri o underscore: "_" . Nomi che iniziano con "_" hanno significati speciali, ed alcuni sono definiti dall'interprete.
Una linea che termina con il carattere: "\" continua nella successiva; espressioni fra parentesi possono occupare piu' righe e linee vuote vengono ignorate. Piu' istruzioni possono stare sulla stessa riga, se separate da punto e virgola ";"
I commenti sono identificati dal carattere: "#", ed il commento va dal carattere a fine linea. Nell'ambiente Unix, se si crea un file eseguibile e si mette: #!/usr/bin/python all'inizio del file, si segnala al sistema che il file va eseguito come programma python.
Caratteri bianchi all'inizio di una riga sono utilizzati per definire blocchi logici del programma (vedremo poi come).
Python e' orientato alla programmazione ad oggetti, nel senso che tutti i tipi di variabili e tutte le entita' su cui Python opera sono,o si comportano, come oggetti.
I nomi delle variabili sono in realta' riferimenti (reference) ad oggetti, cioe' sono implementati internamente come indirizzi degli oggetti. Quando si definisce una variabile si crea un oggetto con il valore della variabile, ed un riferimaneto ad esso.
Gli oggetti ereditano tutti l'oggetto base "object", che ha , fra i suoi attributi, un tipo ed un "reference count": il numero di riferimenti che puntano ad esso. Quando il "reference count" diventa zero, un sistema di garbage collection automaticamente elimina l'oggetto. In caso di ereditarieta' complicate puo' essere che un oggetto , nella gerarchia, abbia un riferimento a se stesso. Per questi casi ci sono algoritmi particolari per vedere quando l'oggetto puo' essere eliminato.
Oggetti base in Python (fra cui numeri e caratteri), sono immutabili, nel senso che una volta creati non si possono cambiare; le variabili sono riferimenti a questi oggetti, e maneggiare le variabili non tocca gli oggetti cui si riferiscono. Salvo che quando un oggetto non ha piu' riferimenti viene eliminato.
Oggetti mutabili sono oggetti composti, costruiti internamente con insiemi di riferimenti ad oggetti immutabili. Questi si possono modificare a run-time.
Python ha pochi comandi (keywords), che in Python 3.10 sono:
False None True and as assert break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield async await match case
In Python ci sono alcuni tipi base, come interi, float, caratteri etc., ma ogni oggetto definisce implicitamente un tipo di variabili. Alle variabili non e' assegnato un tipo a priori ed il tipo delle variabili non va dichiarato, come in FORTRAN, C o Pascal, ma quando ad una variabile viene assegnato un oggetto viene definito anche il tipo della variabile. Questo viene chiamato "run-time binding", "late binding" o "dynamic binding", e permette al programma di essere scritto in modo indipendente dai tipi di variabili (polimorfismo). Ovviamente non si riescono a fare operazioni che non sono ammesse per il tipo che la variabile rappresenta, ed il Python in questi casi da errori, che possono essere rilevati sono all'esecuzione del programma, visto non c'e' una compilazione e l'interprete ignora i tipi delle variabili e non fa controlli fino all'esecuzione dell'istruzione.
Python, se puo' , effettua automaticamente la conversione fra tipi nelle operazioni numeriche.
Python ha anche tipi che sono sequenze; le sequenze sono insiemi di elementi ordinati, cui ci si puo' riferire tramite indici interi. Gli indici partono da zero, analogamente a quanto accade in C, non da uno, come in FORTRAN. Indici negativi partono dal fondo della sequenza. Gli indici sono rappresentati come numeri, o variabili, fra parentesi quadre. Ad esempio: se la variabile 'a' rappresenta una sequenza, il suo primo elemento sara': a[0], il suo secondo elemento a[1] e cosi' via.
I tipi di base sono:
int : interi con segno , (immutabili), possono avere un numero illimitato di cifre.
- se preceduti da 0O oppure 0o sono in notazione ottale
- se preceduti da 0x oppure 0X sono in notazione esadecimale
- se preceduti da 0b oppure 0B sono binari
Esempi:
7 ; 2147483647 ; 0o177 ; 0b100110111 ; 0xdeadbeef 79228162514264337593543950336
oct(x) visualizza il numero x in ottale, hex(x) in esadecimale, bin(x) in binario
float : numeri reali, in doppia precisione, (immutabili),
l'esponente e' preceduto dalla lettera E on e e segue la parte frazionaria.
Esempi:
3.14 ; 10. ; .001 ; 1e100 ; 3.14e-10 ; 0e0
complessi : sono somma di reale e di immaginario (immutabili),
la parte immaginaria e' seguito da j oppure J
Esempi:
1+3.14j ; 10.j ; 1.e2+10j ; 0+.001j ; 1e100j ; 3+3.14e-10j
decimali e frazionari :
sono tipi numerici supportati dalla libreria standard, ove sono create le classi relative. I decimali hanno un numero fisso di cifre decimali, i frazionari sono frazioni, usati per rappresentare senza approssimazione i numeri razionali.
bool : booleani,
possono essere veri o falsi; assumono uno dei 2 valori: True, False. Il numero 0 e' considerato falso, altri numeri sono considerati veri, una stringa definita e' vera, un oggetto vuoto e' falso.
- None : e' una variabile speciale che indica l'assenza di un valore.
None e' usata specialmente per stringhe ed e' il tipo: "NoneType"; la variabile None e' considerata falsa.
str : stringhe
sono sequenze di di caratteri (immutabili). Sono in codifica unicode in Python3, in codifica ascii in Python 2. Le stringhe, intese come sequenze di caratteri, permettono di accedere a singoli caratteri tramite un indice intero. Le stringhe sono rappresentate con caratteri fra apici doppi o semplici. La stringa fra doppi apici puo' contenere apici semplici e viceversa
Esempi:
"abcd" ; '123AAQH' ; "123'34"
bytes : sequenze di interi, nel range 0-255, (immutabili).
Esistono solo in Python3, ma non in Python2. Siccome le stringhe in Python3 sono in codifica Unicode non sono piu' uno strumento adatto a trattare piccoli interi, per questo e' stato introdotto questo tipo di dati.
byte array : e' un tipo analogo al tipo byte, ma mutabile
list : sono sequenze di oggetti eterogenei (mutabili).
Sono rappresentate come elementi separati da virgole, racchiusi fra parentesi quadre. Le liste possono contenere ogni tipo di oggetto, liste comprese.
Esempi:
[0,1,2,3,4] ; [1,2,'abc/,12.5E3] ; [0,1,2,['a','b','c'],32.4]
tuple : sono sequenze di oggetti eterogenei immutabili.
Sono analoghe alle liste, ma sono rappresentate con valori racchiusi fra parentesi tonde. Le tuple possono contenere liste, che sono mutabili, la lista nella tupla puo' mutare, ma non essere tolta dalla tupla, che e' immutabile.
Esempi:
(0,1,2,3,4) ; (1,2,'abc/,12.5E3) ; (0,1,2,('a','b','c'),32.4)
dict : dizionari, od array associativi.
Sono insiemi i cui elementi non hanno come indice un numero, ma sono individuati da un oggetto, detto chiave (key). Gli elementi di un dizionario non hanno un ordine definito, come le sequenze. Anche i dizionari contengono oggetti eterogenei, ma le chiavi devono essere oggetti immutabili; siccome internamente i dizionari sono rappresentati come "hash tables", le chiavi devono essere oggetti "hashable", cioe' adatti ad essere trasformati in indirizzi dagli algoritmi interni di Python.
I dizionari sono rappresentati come coppie "chiave:valore", con elementi separati da virgole e fra parentesi graffe. Un elemento del dizionario e' individuato dalla chiave, messa fra parentesi quadre dopo la variabile che si riferisce al dizionario
Esempio:
D={'key1':3,'key2':6,1:'abc'}
qui D['key1'] si riferisce al numero 3, D[1] alla stringa 'abc'
set : insiemi.
Sono gli insiemi della matematica insiemistica. Sono composti di oggetti non sono ordinati che non sono recuperabili con un indice; su di loro si possono fare operazioni come: unione, intersezione, differenza etc. etc.
Sono oggetti mutabili, ma che contengono oggetti immutabili ed in un unica copia. Sono rappresentati da elementi fra parentesi graffe, separati da virgole.
Esempio:
a={1,2,3,'cc',1,2} a contiene: {'cc', 1, 2, 3} : non ci sono oggetti multipli
frozenset : sono come i set, ma immutabili.
Si possono creare da una lista, tupla o dizionario, con la funzione frozenset.
Esempio:
a=frozenset([1,2,3])
range : sono oggetti che permettono di iterare su sequenze di interi.
Sono creati con la funzione range, che ha come argomenti il primo, l'ultimo valore (escluso) ed il passo della sequenza.
Esempio:
range(2) e' la sequenza: 0-1, range(2,4) e' la sequenza 2-4, range(1,5,2) e' la sequenza 1-3
Stringhe, liste, tuple, range, sono sequenze. Le sequenze, ma anche i dizionari e gli insiemi sono detti iterable , sono cioe' oggetti i cui elementi si possono estrarre uno per volta, scorrendo sulle componenti dell'oggetto. Questo perche' sono oggetti che implementano tutte le funzioni per fare questo. Questo modo di classificare gli oggetti in base alla loro interfaccia e' chiamato "duck typing": qui e' il comportamento di un oggetto definisce il suo tipo. E' un concetto che si ritrova nei moderni linguaggi interpretati; una specie di polimorfismo, ma questa e' un'idea ancora piu' generale e l'interfaccia stessa diventa la definizione del tipo di dato.
In python 2 c'era il tipo long per interi a molte cifre ed int era limitato ad interi a 32 bit. Un numero che finiva con un "L" era long anche se era definito con poche cifre. Con python3 gli interi possono sempre avere molte cifre ed il tipo 'long' e' scomparso.
La funzione type(oggetto) dice di che tipo e' l'oggetto, la funzione id(oggetto) e' un identificatore unico per l'oggetto, in pratica: l'indirizzo. La funzione isistance(oggetto,tipo) e' un test sul tipo:
Esempio:
type([]) produce: <class 'list'> isinstance([], list) produce: True id([]) e' l'indirizzo della lista vuota, tipo: 140377705648640
Esistono funzioni specifiche per la conversione di valori fra tipi diversi. nelle operazioni aritmetiche ed i confronti.
All'inizio del file, o di una funzione o classe, e' buona pratica mettere una stringa descrittiva, anche su piu' linee. Questa finisce nella variabile __doc__ dell'oggetto o della funzione e serve da documentazione, E' mostrata dalla funzione help con l'oggetto come argomento. Questa stringa descrittiva si chiama "docstring".