Python 1 - Sintassi Python

Tipi scalari

  • Il tipo booleano può avere solo i valori True e False.
  • I numeri possono essere interi o in virgola mobile. Le divisioni tra interi producono un risultato intero.
  • Per convertire tipi numerici si usano le funzioni di conversine int(<numero>) e float(<numero>)
  • Per prima cosa, occorre sapere che ogni dato in Python è rappresentato con un'istanza di classe, quindi anche un dato scalare avrà dei metodi

Tipi scalari

  • Possiamo utilizzare numeri in un contesto booleano, come in C. Anche in questo caso il valore 0 (o 0.0) vale False, qualunque altro valore True
  • Le variabili non devono essere dichiarate. Basta assegnare un valore ad una variabile per crearla. Python ne determina il tipo in base al valore assegnato.

Strutture di controllo principali

  • Oltre ai soliti operatori aritmetici abbiamo il % che esegue il modulo, il // che esegue la divisione intera e il ** che esegue l'elevamento a potenza
  • Abbiamo l'if con l'else opzionale e l'elif, che contrae ese ed if successivo
  • Ovviamente restano il while, uguale a come lo conosciamo, ed il for, che invece richiama molto il foreach del PHP o il for della shell di Linux
  • ESERCIZIO: Scrivere un progrmma Pytnon che generi la serie di Fibonacci fino al primo valore superiore a 50
  • Partiamo da cosa manca: mancano do-while e switch-case

Strutture di controllo principali

  • Esiste anche la forma con assegnamento += -= *= /= %= //= **= &= != ^= <<= >>= ma non esistono ++ e --
  • L'assegnazione viene fatta con il solito =
  • Gli operatori di confronto sono i soliti == > < >= <= !=
  • Esistono gli operatori logici bit a bit & | ^ ~ << e >>

Strutture di controllo principali

  • Inserisco qui anche print, che sebbene sia a rigor di logica una funzione, può venir richiamata anche senza parentesi, a mo di operatore. Stampa sul terminale una serie di valori, indipendentemente dal tipo, separati da ,
  • Gli operatori logici sono and, or e not

Caratteristiche generali di Python

  • Python può essere eseguito in modalità batch, eseguendo le istruzioni prese da un file di testo
  • Python può utilizzare codice esterno scritto in Python, includendolo tramite l'istruzione import
  • Di norma, alla prima importazione, le librerie vengono salvate nella forma semicompilata, con l'estensione .pyc
  • Python è un linguaggio interpretato che utilizza un Just In Time Compiler per ottimizzare l'esecuzione
  • Un file Python in genere viene salvato con l'estensione .py

Caratteristiche generali di Python

  • Python può essere utilizzato in modalità interattiva, eseguendo le righe di codice man mano che vengono scritte

Metodi delle liste

  • lista.add(<elemento>) aggiunge <elemento> in fondo a lista
  • lista.insert(<posizione>, <elemento>) inserisce <elemento> nella lista in <posizione>, cambiando gli indici di tutti gli elementi che seguono
  • lista.extend(<da_aggiungere>) aggiunge gli elementi della lista <da_aggiungere> in fondo a lista
  • lista.pop(<indice>) elimina l'elemento in <indice> dalla lista, ritornandone il valore; se <indice> manca, elimina e ritorna l'ultimo

Metodi delle liste

  • lista.count(<valore>) ritorna il numero di volte che <valore> compare nella lista
  • A differenza delle funzioni per le liste, i metodi non creano una nuova lista, ma modificano quella esistente.
  • ATTENZIONE se <valore> non compare in lista, viene lanciata un'eccezione
  • lista.index(<valore>) ritorna l'indice del primo elemento che vale <valore>
  • Consideriamo che la variabile lista contenga una lista.

La documentazione in CodeSkulptor

  • Le ultime due etichette contengono la documentazione di CodeSkulptor stesso
  • Le prime due etichette di questa finestra contengono un completo manuale del linguaggio Python.
  • Sul lato destro della barra ci sono tre bottoni. Il primo, Docs, apre la finestra della documentaizione
  • La terza etichetta contiene la documentazione di alcuni moduli standard del linguaggio, inclusi in CodeSkulptor.

La documentazione in CodeSkulptor

  • La quarta etichetta contiene la documentazione del modulo SimpleGui, dell'interfaccia grafica (simile a pyGame)

Numero Casuali

  • Per finire, random.shuffle(<lista>) mischia gli elementi di <lista>
  • random.randrange([<inferiore>,] <superiore> [, <passo>) ritorna un numero intero casuale compreso tra <inferiore> incluso e <superiore> escluso intervallati di <passo>. Se <inferiore> manca, si prende 0, se <passo> manca si prende 1
  • Con random.choice(<sequenza>) si estrae un elemento a caso dalla sequenza (lista, tupla o insieme)
  • ramdom.random() ritorna un numero casuale in virgola mobile tra 0.0 compreso es 1.0 escluso

Numero Casuali

  • Per utilizzare numeri causali occorre importare il modulo random:
    import random
  • random.randint(<minimo>, <masimo>) ritorna un numero intero casuale compreso tra <minimo> e <massimo> inclusi

L'Interfaccia di CodeSkulptor

  • Nella finestra dei risultati (3) comparirà ciò che lo script stampa quando viene eseguito o gli eventuali errori
  • La finestra del codice (2) è un semplice editor, dotato di evidenziazione sintattica
  • L'interfaccia è costituita da una barra degli strumenti(1), una finestra per il codice (2) ed una per i risultati (3)
  • Il bottone c servirebbe per scaricare sul nostro disco il lo script. Si attiva quando modifichiamo il nostro script

L'Interfaccia di CodeSkulptor

  • Il bottone a serve per eseguire lo script
  • Il bottone e serve per caricare nell'editor un file Python dal nostro disco
  • Il bottone b serve per salvare il codice. Quando salviamo il link alla pagina cambia e rimanda ad una nuova versione del codice. Il link termina con il numero di versione. se lo cambiamo possiamo tornare alle versioni salvate in precedenza
  • Il bottone d serve per creare un link ad un nuovo programma. Il numero di versione ripartirà da 0 al prossimo salvataggio

L'Interfaccia di CodeSkulptor

  • Il bottone f serve per cancellare la finestra del risultato (3) e resettare il programma

CodeSkupltor

  • Possiede anche un'interfaccia grafica semplificata chiamata SimleGUI
  • CodeSkulptor è un interprete Python inserito nel browser, non richiede l'installazione di software sul PC
  • È corredato di un'ampia documentazione online e di un semplice debugger
  • È stato scritto da Scott Rixner (https://www.cs.rice.edu/~rixner/) della Rice Univiersity (https://www.cs.rice.edu/) ed è liberamente utilizzabile online senza necessità di registrazione.

CodeSkupltor

  • Lo strumento che utilizzeremo in questo corso è http://www.codeskulptor.org
  • Consente di salvare il codice su uno spazio in rete, con un rudimentale meccanismo di versioning

Stringhe

  • Attenzione perché se la stringa non contiene esclusivamente un numero correttamente formattato, viene generata un'eccezione
  • Le stringhe sono sequenze di caratteri Unicode. Non vengono convertite automaticamente in numeri, né i numeri vengono convertiti automaticamente in stringhe al bisogno come in PHP. Occorre utilizzare dei metodi o delle funzioni di conversione.
  • Le stringhe non possono venire modificate. Ogni volta che faccio un'operazione su una stringa, ottengo una nuova stringa modificata

Stringhe

  • Per trasformare una stringa in un numero si può usare il type cast: int(<stringa>) o float(<stringa>)

Sintassi generale del linguaggio

  • Non esistono parole chiave che identifichino l'inizio o la fine di un blocco
  • Il terminatore delle istruzioni è il fine riga
  • I commenti sono preceduti dal simbolo #
  • Un blocco è identificato dal livello di indentazione
  • una stringa multiriga, delimitata da """ (tre volte ") può essere usata come commento (ma anche come stringa nelle assegnazioni o altrove)
  • I costrutti del linguaggio (come l'if o il while) vengono terminati con il :

Sintassi generale del linguaggio

  • Assomiglia più ad uno script di shell che ad un linguaggio strutturato
  • Si può inserire una sola istruzione per riga

Tipi mutabili ed immutabili

  • In python viene enfatizzata la differenza tra tipi mutabili ed immutabili
  • Troveremo altre strutture mutabili e immutabili.
  • Al contrario le liste sono mutabili, in quanto abbiamo metodi che, oltre a modificare gli elementi contenuti, ne possono anche modificare la lunghezza
  • Ad esempio le stringhe sono tipi immutabili, in quanto le funzioni che le modificano non modificano mai l'originale, ma una copia

Insiemi

  • Il parametro deve essere un tipo iterabile come stringa, lista, tupla o set.
  • Nel caso sia una lista o tupla di stringhe, conterrà le stringhe che le costituiscono.
  • Nel caso il parametro sia una stringa, il set conterrà le sue lettere.
  • Un insieme può venir creato con la funzione set(), che accetta un solo parametro.
  • L'insieme risultante sarà costituito da tutti gli elementi del parametro, non ripetuti.

Insiemi

  • Gli elementi di un insieme possono anche essere di tipo diverso.
  • Un insieme (o set) è una collezione di elementi immutabili non ripetuti e non ordinati
  • Possiamo anche creare un insieme mettendo la lista degli elementi tra { e }
  • l'insieme a sua volta è un tipo mutabile

Operazioni Logiche

  • Per controllare che un dato non sia di un certo tipo, si usa is not
  • Per controllare il tipo di un dato si può utilizzate l'operatore is
  • Gli operatori di confronto sono gli stessi del C ( == != < > >= <= ) in più si può usare <> per diverso
  • Per verificare l'assenza di un elemento su utilizza not in
  • Per gli operatori logici invece non si utilizzano quelli del C, ma and, or e not

Operazioni Logiche

  • Per verificare la presenza di un elemento in una lista, o in un altro tipo di dati multiplo si può utilizzare l'oepratore in

Operazioni con le liste

  • L'operatore + tra liste produce una nuova lista che è la concatenazione delle due liste
  • È possibile estrarre un pezzo della lista indicando un intervallo come indice: lista[<inizio>:<fine>]
  • Tutti gli elementi che seguono quello cancellato cambieranno indice.
  • Se non indichiamo <inizio>, prenderemo i primi elementi
  • per cancellare un elemento da una lista potremo scrivere: del lista[<indice>]

Operazioni con le liste

  • Se invece omettiamo <fine> prenderemo gli ultimi elementi
  • Se <fine> è negativo, è riferito alla fine della lista

Esercizio

  • Stampare la lista ottenuta
  • Creare tre liste con la funzione list() contenenti la prima una serie di nomi di persona, la seconda alcuni verbi in terza persona singolare e la terza alcuni oggetti.
  • Aggiungere in fondo alla lista, una ad una, tutte le possibili combinazioni <nome> <verbo> <oggetto> che si possono creare con i nomi nelle precedenti tre liste
  • Creare una lista vuota

For e funzione range

  • Se però volessimo un for più tradizionale, che magari faccia un numero elevato di iterazioni con un indice che varia dimuna quantità costante, creare la lista diventerebbe brigoso
  • La sintassi della funzione range è:
    range([<inizio>,] <limite> [, <passo>])
  • Ci viene in aiuto la funzione range()
  • Naturalmente possiamo creare liste a nostro piacere per utilizzarle con il for
  • <limite> indica il limite dei valori prodotti. L'ultimo valore della lista sarà non raggiunge mai <limite>

For e funzione range

  • In Python il costrutto for ripete un'azione su ogni elemento di una lista
  • <inizio> indica il primo valore della lista, se non è specificato, si inizia con 0
  • <passo> indica di quanto modificare il valore ad ogni iterazione. Deve essere dello stesso segno di <massimo> - <minimo>. Se manca indicato si utilizza 1 o -1 a seconda dei casi
  • La sintassi del for è:
    for <variabile> in <lista>:

Dizionari

  • Per creare un dizionario, si può inserire un elenco di coppie <chiave>:<valore> tra { e }:
    tel = {'pippo': 4098, 'pluto': 4139}
  • <dizionario>.keys[] ritorna la lista delle chiavi
  • Per eliminare un elemento si usa del <dizionario>[<chiave>]
  • Ovviamente <dizionario>[<chiave>] restituisce il valore associato a <chiave>.
  • Per aggiungere un elemento, basta fare un'assegnazione <dizionario>[<chiave>] = <valore>

Dizionari

  • I dizionari mettono in relazione una serie di dati con una serie di stringhe.
  • Un modo semplice per pensarli è pensare ad un vettore che abbia stringhe al posto di numeri come indici

Tuple

  • Le tuple sono versioni immutabili delle liste
  • Possiamo accedere ad un elemento qualsiasi di una tupla tramite la notazione dell'indice, come nelle liste:
    val = tupla[3]
  • Per chiarezza spesso si utilizzano le parentesi tonde:
    tupla = ('a', 'b', 'c', 'd', 'e')
  • Possiamo, con la notazione di intervallo, estrarre un pezzo da una tupla:
    t1 = tupla[1:3]

Tuple

  • Per creare una tupla basta indicare una serie di elementi separati da virgole:
    tupla = 'a', 'b', 'c', 'd', 'e'
  • Oppure possiamo concatenare due tuple con il segno +:
    tupla += ('x','y')
  • Naturalmente, dato che la tupla è immutabile, non possiamo fare il contrario:
    tupla[3] = 'x'

Liste

  • Una lista è mutabile, nel senso che può essere modificata, sia nel contenuto che nella dimensione
  • Per creare una lista, si raccolgono una serie di valori o variabili tra [], ad esempio:
    list= [3, "pippo", 12, 9,75, True]
  • Oppure si usa la funzione list([<elemento>][,<elemento>]...) che ritorna una nuova lista.
  • Ovviamente, gli oggetti contenuti in una lista possono essere tipi base come booleani, numeri o stringhe, ma anche oggetti complessi, come liste o altri tipi che vedremo

Liste

  • Se l'indice è negativo, si parte dal fondo. lista[-1] corrisponde all'ultimo elemento di lista
  • Ovviamente possiamo anche creare una lista vuota, non mettendo valori tra le []:
    lista = []
  • Una lista è una collezione ordinata di oggetti eterogenei.
  • Possiamo gestire un elemento di lista utilizzando la classica notazione con l'indice tra [ e ].

Assegnazione a tuple

  • Una funzione (che vedremo più avanti) può ritornare una tupla.
  • È possibile creare una tupla di variabili ed assegnare una tupla (o una lista) a quest'ultima:
    a, b = 52, 53
  • Con le notazioni viste potremo assegnare i valori della tupla ad una lista o a delle singole variabili.
  • Possiamo convertire una tupla in lista con la funzione list() delle liste:
    lista = list(tupla)

Assegnazione a tuple

  • L'istruzione precedente crea una tupla anonima contenente le variabili a e b (non necessariamente definite in precedenza, e la inizializza con la tupla contenente i valori 52 e 53

Ancora Operazioni sugli Insiemi

  • Esistono poi questi metodi che modificano l'insieme:
    • s.add(x) aggiunge l'elemento x all'insieme s
    • s.remove(x) rimuove x dall'insieme s; solleva l'eccezione KeyError se non presente
    • s.discard(x) rimuove x dall'insieme s se presente
    • s.pop() rimuove e restituisce un elemento arbitrario da s; solleva l'eccezione KeyError se non presente
    • s.update(t) aggiunge ad s gli elementi di t
    • s.intersection_update(t) toglie da s gli elementi che non sono anche in t
    • s.difference_update(t) toglie da s gli elementi che sono anche in t
    • s.symmetric_difference_update(t) mette in s gli elementi presenti in s o t ma non in entrambi
    • s.clear() rimuove tutti gli elementi dall'insieme s

Operazioni Sugli Insiemi

  • Per verificare la presenza di un elemento in un insieme usiamo l'operatore <elemento> in <insieme>
  • Per verificarne l'assenza, <elemento> not in <insieme>

Operazioni Sugli Insiemi

  • Abbiamo poi questi metodi che restituiscono un valore:
    • len(s) numero di elementi dell'insieme s
    • s.issubset(t) verifica se ogni elemento in s è in t
    • s.issuperset(t) verifica se ogni elemento in t è in s
    • s.union(t) nuovo insieme con elementi sia di s che di t
    • s.intersection(t) nuovo insieme con elementi comuni tra s e t
    • s.difference(t) nuovo insieme con elementi in s ma non in t
    • s.symmetric_difference(t) nuovo insieme con gli elementi di s o t ma non di entrambi
    • s.copy() nuovo insieme, una copia di s

Funzioni

  • Manca il tipo di ritorno, come i tipi dei parametri (i tipi sono automatici in Python)
  • Il corpo della funzione va indentato
  • È possibile indicare valori di default per i parametri, nel qual caso quei parametri potranno essere omessi
  • Le variabili create all'interno di una funzione sono locali
  • Le variabili locali possono avere nomi uguali alle globali; sono comunque diverse
  • Se non ridefinite, le variabili globali sono in sola lettura.

Funzioni

  • Se vogliamo modificare una variabile globale in una funzione, dobbiamo prima indicare:
    global <varGlobale>
  • La definizione di funzioni in Python differisce di poco dagli altri linguaggi:
    def <nome> ([<parametro> [ = <default>] [, <parametro> [ = <default>]] ...]):
  • La parola chiave def indica la definizione di una funzione
  • L'istruzione return funziona come sempre. Non ci sono problemi a ritornare dati strutturati creati all'interno della funzione

Costrutti "Pythonici"

  • E molti altri... (ricorda che Internet ti è amico!)
  • Per generare un set con una serie di numeri (ad esempio i quadrati dei primi dodici interi): pippo = (n*n for n in range(10))
  • Per prima cosa, se vogliamo utilizzare le accentate nel testo del programma o nei commenti dobbiamo indicare la codifica. Questo s fa aggiungendo il commento (per l'UTF-8, che consiglio):
    # -*- coding: utf-8 -*-
  • Python possiede una serie di costrutti particolari. Vediamone alcuni

Costrutti "Pythonici"

  • Per fare un ciclo su un dizionario, recuperando insieme chiave e valore: for <chiave>, <valore> in <dizionario>.iteritems():
  • Abbiamo già visto l'assegnazione di una lista o una tupla ad una tupla anonima, per assegnare più variabili contemporaneamente: a, b = [13, 22]

Formattazione delle stringhe

  • Tra { e } possiamo anche indicare il numero di un parametro, a partire da 0, per usarli più volte o non in ordine
  • Un segnaposto è racchiuso tra { e }. Il caso più semplice è quindi {}
  • In Python non esiste una funzione di stampa formattata come la printf
  • Ad esempio "La variabile {} vale {}".format("pi", 3.1412) produce 'La variabile pi vale 3.1412'

Formattazione delle stringhe

  • Per prima cosa predisporremo una stringa contenente dei segnaposto, quindi applicheremo il metodo format, con i valori da sostituire come parametri
  • In compenso la classe string possiede un potente metodo format
  • La formattazione è sofisticata come nella printf. Ad esempio c indica di formattare come carattere, d come numero decimale, b come binario e x come esadecimale.
  • Si possono indicare anche una conversione (di cui non parlo) ed una formattazione: {[<campo>][!<conversione>][:<formattazione>]}
[any material that should appear in print but not on the slide]