Sintassi

Variabili

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

Riferimenti ed oggetti

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.

Keywords

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

Tipi

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.

Docstring:

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