Potete ottenere questa presentazione recandovi all'indirizzo: [slides.poul.org/2019/python](https://slides.poul.org/2019/python) --- Perché Python? - Ottimo per i principianti - Facile da usare - Estremamente diffuso - Moduli per qualunque cosa - Immediato ---- # Come Scrivere Hello HelloWorld ## C ```c #include int main() { printf("Hello, world!\n"); return 0; } ``` ---- ## Java ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Goodbye, world!"); } } ``` ---- ## Python ```python print('Hello, world!') ``` - Facile, No ? ---- ![import antigravity](https://imgs.xkcd.com/comics/python.png) ---- ## Breve storia - Nasce nel 1991 per mano di Guido van Rossum - Prende il nome dai Monty Python - È in continua evoluzione ( Costantemente Aggioranto) - Convivono due versioni (2 e 3) - La versione 2 verrà deprecata alla fine di quest'anno - Noi useremo Python 3 - Fatelo anche voi ( Per tutti i futuri sviluppatori) ---- ## Interpretato vs. compilato - Compilato: tradotto in linguaggio macchina C: come compito scritto --> Una volta consegnato, non puoi modificare - Interpretato: eseguito da un altro programma come un orale --> capacità di modificare rapidamente un errore - Python è interpretato (circa) Notes: Python è compilato in quanto la sintassi Python è compilata in bytecode, ed è interpretato in quanto il bytecode è eseguito da un altro programma, la VM Python e non eseguito direttamente dal processore. --- # Il linguaggio ---- ## REPL **R**ead, **E**val, **P**rint **L**oop ``` $ python3 Python 3.6.1 (default, Mar 27 2017, 00:27:06) [GCC 6.3.1 20170306] on linux Type "help", "copyright", "credits" or "license" for more info... >>> print('Hello, world!') Hello world! ``` Per uscire: `quit()` o `CTRL-D` Notes: Mostrare la differenza tra interprete (il software che converte le istruzioni in bytecode e poi esegue quest'ultimo) e l'interfaccia REPL Python (il software che si interfaccia con l'utente). ---- ## Espressioni ``` >>> 2 + 2 4 ``` ``` >>> 3 * 3 9 ``` ``` >>> 4 < 5 True ``` ---- ## Commenti Tutto ciò posto dopo il cancelletto (`#`) non è interpretato. ``` >>> 1 + 1 # qui posso scrivere quello che voglio 2 ``` ---- ## Errori ``` >>> 3 / 0 Traceback (most recent call last): File "", line 1, in ZeroDivisionError: division by zero ``` Il segreto degli [hacker](http://www.girodivite.it/Diario-di-un-aspirante-hacker.html)? Leggere le scritte! ---- ## Variabili ``` >>> x = 6 >>> y = 2 >>> x 6 >>> y 2 ``` ``` >>> 2 * y 4 >>> x + y 8 ``` ``` >>> z = x + y >>> z 8 ``` ---- Le Variabili di Python non sono fisse e possono facilmente essere cambiate ''' >>> x = 2 >>> x 2 >>> type(x) >>> x = 'stringa' >>> type(x) # facilmente si può modificare il tipo # in linguaggi compilati tipo C ciò non è possibile >>> ''' ---- ## Liste (`list`) - Collezione **ordinata** di elementi, anche di tipi diversi - Si definiscono ponendo all'interno di parentesi quadre gli elementi intervallati da una virgola ``` lista = [False, 1, "due", 3.0, 4, 5] ``` - Si accede a un elemento della lista aggiungendo l'indice dell'elemento desiderato tra parentesi quadre - Il primo elemento ha indice 0 (zero-based) ``` >>> lista[2] 'due' ``` ---- ``` >>> lista = [False, 1, "due", 3.0, 4, 5] >>> lista [False, 1, 'due', 3.0, 4, 5] ``` ``` >>> lista[0] = 0.0 >>> lista [0.0, 1, 'due', 3.0, 4, 5] ``` ``` >>> lista.append('sei') >>> lista [0.0, 1, "due", 3.0, 4, 5, 'sei'] ``` ``` >>> lista.remove('sei') >>> lista [0.0, 1, "due", 3.0, 4, 5] ``` ``` >>> lista.reverse() >>> lista [5, 4, 3.0, 'due', 1, 0.0] ``` ``` >>> len(lista) 6 ``` ---- ## Tuple (`tuple`) - Esattamente come le liste, ma **immutabili** - Sono quindi anche **ordinate** - Si definiscono con le parentesi tonde ```python tupla = ('a', 1, 2, '3.0') ``` ``` >>> tupla[1] = 1.0 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment ``` ``` >>> tupla.append('sei') Traceback (most recent call last): File "", line 1, in AttributeError: 'tuple' object has no attribute 'append' ``` ---- ## Dizionari (`dict`) - Associano ogni chiave ad un valore - Le chiavi devono essere immutabili (stringhe, tuple) ```python d = { "chiave": "valore", "nome":"Tancredi", "cognome":"Orlando", ('immutable', 'types'): ['are', 'cool'] } ``` Si accede ai campi come si accede agli elementi di una lista, usando la chiave al posto dell'indice. ``` >>> d['nome'] 'Tancredi' ``` ``` >>> print('these things ' + ' '.join(d[('immutable', 'types')]) these things are cool ``` --- # Input e Output ---- - Purtroppo a volte è necessario interagire con l'utente - È possibile ottenere un valore dall'utente ---- ## Formattazione dell'output ``` >>> s = 'Corsi {} {}' >>> s.format('Python', '2017') 'Corsi Python 2017' >>> s.format('Linux', 'base') 'Corsi Linux base' ``` ``` >>> s = 'Corsi {argomento} {tipo}' >>> s.format(tipo='avanzati', argomento='antani') 'Corsi antani avanzati' ``` ``` from math import pi >>> '{:.2f}'.format(pi) 3.14 ``` ---- ## Input dall'utente ``` >>> a = input() asd >>> a 'asd' ``` ``` >>> nome = input("Inserisci il tuo nome: ") Gattuso >>> 'Il tuo nome è {}.'.format(nome) 'Il tuo nonme è Gattuso.' ``` --- # Controllo del flusso ---- ## `if` Se una condizione è vera esegue un blocco di codice. ```python if 3 > 2: print('Condizione vera') ``` ## Blocchi - Sono corpi di codice allineati con una spaziatura multipla coerente - Per bontà agli dèi usate quattro spazi ed evitate le tabulazioni come la peste Notes: Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come prima. ---- ## `else` - Se la condizione di una istruzione `if` è falsa viene eseguito il blocco della istruzione `else` (se presente) ```python if 3 > 2: print('Condizione vera') else: print('Condizione falsa') ``` ---- ## `while` - Valuta una espressione - Se è vera esegue un blocco di codice - Vai al primo punto ``` >>> x = 0 >>> while x < 3: ... x = x + 1 ... print("ora x vale", x) ... ora x vale 1 ora x vale 2 ora x vale 3 ``` ---- ## `for` - Esegue un blocco per ogni elemento di una sequenza ``` >>> for i in [0, 1, 2, 3, 4]: ... print(i) 0 1 2 3 4 ``` - La funzione `range()` genera sequenze da usare all'interno di istruzioni `for` ``` >>> for i in range(0, 5): ... print(i) 0 1 2 3 4 ``` ---- ## `break` e `continue` - Sono entrambe istruzioni da usare all'interno di un ciclo, `while` o `for` - Dopo una istruzione `break` tutto il ciclo è interrotto e la condizione non sarà più valutata - Dopo una istruzione `continue` solo l'iterazione corrente è interrotta, il ciclo ripende a partire dalla valutazione della condizione ``` >>> for i in [0, 1, 2, 3, 4, 5, 6, 7]: ... if i == 2: ... continue ... if i == 6: ... break ... print(i) 0 1 3 4 5 ``` --- # Funzioni ---- - Sono porzioni di codice a cui è assegnato un nome - È possibile eseguire il codice di una funzione similmente a come si ottiene il valore contenuto da una variabile - Permettono di riutilizzare il codice che scriviamo - Si definiscono con l'istruzione `def` ``` >>> def say_hello(): ... print('Hello world!') ``` ``` >>> say_hello() # chiama la funzione Hello world! >>> say_hello() # chiama la funzione nuovamente Hello world! ``` - Le funzioni possono ottenere dati in ingresso, e fornire dati in uscita - Per tale capacità permettono la riusabilità del codice ---- ## Parametri - La funzione può essere "predisposta" per ricevere parametri - I parametri sono i dati in ingresso di una funzione - I parametri diventano variabili visibili all'interno della funzione per essere usati ---- ## Valore di ritorno - Il valore di ritorno è ciò che fornisce in uscita la funzione, il proprio risultato - Lo si specifica inserendo l'istruzione `return` seguita dal valore di ritorno - La funzione termina subito dopo l'istruzione return ``` >>> def somma(a, b): ... return a + b ``` ``` >>> somma(1, 2) 3 ``` ``` >>> a, b = 3, 14 >>> c = somma(a, b) >>> c 17 ``` ---- ## Parametri di default - Alcuni parametri possono essere opzionali - Se non specificati assumono un valore di default ``` def f(a, b=3, c=6): print(a, b, c) ``` ``` >>> f(1) 1 3 6 >>> f(1, 2) 1 2 6 >>> f(1, c=4) 1 3 4 ``` ---- ## \*args e \*\*kwargs A volte ci tornerebbe comodo prendere una quantità indefinita di argomenti, in questo caso gli \*args e \*\*kwargs vengono in nostro aiuto (N.B. Il nome **args** e **kwargs** è del tutto arbitrario, ma tuttavia standandard de facto del linguaggio python) ---- ## Scoping - Lo scoping determina la **visibilità** delle variabili - Le variabili definite all'interno di uno scope sono accessbili solo al suo interno - Gli scope sono definiti da funzioni, classi e moduli - Le classi sono contenitori di funzioni e di variabili - I moduli sono contenitori di classi, di funzioni e di variabili ---- ``` >>> x = 'globale' >>> def f(): ... x = 'locale' ``` ``` >>> f() >>> print(x) globale ``` - All'interno della funzione `f()` viene creata una seconda varibile di nome `x` accessibile solo all'interno della funzione - La variabile `x` **all'interno della funzione** è chiamata **locale** - La variabile `x` **al di fuori della funzione** è chiamata **globale** - Sono due variabili **diverse** ---- Se all'interno della funzione non è stato usato il nome di una variabile globale è possibile accedere ad essa in lettura. ``` >>> x = 'globale' >>> def f(): ... print(x) >>> f() globale ``` Tuttavia non è possibile modificarla. ``` >>> x = 'globale' >>> def f(): ... print(x) ... x = 'variabile ' + x >>> f() UnboundLocalError: local variable 'x' referenced before assignment ``` L'interprete ci informa che stiamo chiamando una variabile `x` che non è stata assegnata. Infatti dentro la funzione la variabile `x` non esiste. ---- ## None - Equivale al `NULL` di C - Una funzione ritorna `None` se priva di `return` - Una variabile si può confrontare a None con l'istruzione di comparazione `is` ``` >>> def f(): ... print('funzione') ... return None ``` ``` >>> f() funzione >>> x = f() >>> x None ``` ``` >>> if x is None: ... print('esatto!') esatto! ``` ---- # Nella prossima puntata Giovedì 19 alle 17.15 in aula 5.0.2. * Utilizzo File * List Comprehension * Tipi e Casting * Metodi di String * Standard Library * Moduli custom ---- ``` >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. [...] ```