day_1.md 18.7 KB
Newer Older
edne's avatar
edne committed
1
# Corsi Python 2018
Tancredi Orlando's avatar
Tancredi Orlando committed
2

3
![POuL logo](lib/img/logo-text-white.svg)
Niccolò Izzo's avatar
Niccolò Izzo committed
4

Tancredi Orlando's avatar
Tancredi Orlando committed
5
6
7
8
----

Potete ottenere questa presentazione recandovi all'indirizzo:

edne's avatar
edne committed
9
[slides.poul.org/2018/python](https://slides.poul.org/2018/python)
Tancredi Orlando's avatar
Tancredi Orlando committed
10

edne's avatar
edne committed
11
---
Tancredi Orlando's avatar
Tancredi Orlando committed
12

edne's avatar
edne committed
13
 Perché Python?
Tancredi Orlando's avatar
Tancredi Orlando committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27

- Ottimo per i principianti
- Facile da usare
- Estremamente diffuso
- Moduli per qualunque cosa

----

## C

```c
#include <stdio.h>

int main() {
Niccolò Izzo's avatar
Niccolò Izzo committed
28
    printf("Hello, world!\n");
Tancredi Orlando's avatar
Tancredi Orlando committed
29
30
31
32
33
34
35
36
37
38
39
    return 0;
}
```

----

## Java

```java
public class HelloWorld {
    public static void main(String[] args) {
Niccolò Izzo's avatar
Niccolò Izzo committed
40
        System.out.println("Goodbye, world!");
Tancredi Orlando's avatar
Tancredi Orlando committed
41
42
43
44
45
46
47
48
49
    }
}
```

----

## Python

```python
Niccolò Izzo's avatar
Niccolò Izzo committed
50
print('Hello, world!')
Tancredi Orlando's avatar
Tancredi Orlando committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
```

----

![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
- Convivono due versioni (2 e 3)
edne's avatar
edne committed
65
- Noi useremo Python 3
Tancredi Orlando's avatar
Tancredi Orlando committed
66
67
68
69
70
71
72
73
- Fatelo anche voi

----

## Interpretato vs. compilato

- Compilato: tradotto in linguaggio macchina
- Interpretato: eseguito da un altro programma
edne's avatar
edne committed
74
- Python è interpretato (circa)
Tancredi Orlando's avatar
Tancredi Orlando committed
75
76

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
77
78
79
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.
Tancredi Orlando's avatar
Tancredi Orlando committed
80

edne's avatar
edne committed
81
----
Tancredi Orlando's avatar
Tancredi Orlando committed
82
83
84

## Cosa serve

Tancredi Orlando's avatar
Tancredi Orlando committed
85
86
87
- Per scrivere il codice, un editor di testo:
  - Multipiattaforma: Atom
  - Windows: Notepad++
edne's avatar
edne committed
88
- In quanto linguaggio interpretato, l'interprete Python
Tancredi Orlando's avatar
Tancredi Orlando committed
89
90
91
92
93
  - Linux: generalmente preinstallato, altrimenti utilizzare il package manager
  - macOS: [Installer](https://www.python.org/ftp/python/3.6.1/python-3.6.1-macosx10.6.pkg)
  - Windows: [32bit](https://www.python.org/ftp/python/3.6.1/python-3.6.1.exe)
    o [64bit](https://www.python.org/ftp/python/3.6.1/python-3.6.1-amd64.exe)

edne's avatar
edne committed
94
95
---

Tancredi Orlando's avatar
Tancredi Orlando committed
96
# Il linguaggio
edne's avatar
edne committed
97

Tancredi Orlando's avatar
Tancredi Orlando committed
98
99
100
101
102
103
----

## REPL

**R**ead, **E**val, **P**rint **L**oop

Tancredi Orlando's avatar
Tancredi Orlando committed
104
```
Tancredi Orlando's avatar
Tancredi Orlando committed
105
$ python3
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
106
Python 3.6.1 (default, Mar 27 2017, 00:27:06)
Tancredi Orlando's avatar
Tancredi Orlando committed
107
[GCC 6.3.1 20170306] on linux
Niccolò Izzo's avatar
Niccolò Izzo committed
108
109
Type "help", "copyright", "credits" or "license" for more info...
>>> print('Hello, world!')
Tancredi Orlando's avatar
Tancredi Orlando committed
110
111
112
Hello world!
```

edne's avatar
edne committed
113
Per uscire: `quit()` o `CTRL-D`
Tancredi Orlando's avatar
Tancredi Orlando committed
114
115

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
116
117
118
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).
Tancredi Orlando's avatar
Tancredi Orlando committed
119
120
121
122
123

----

## Espressioni

edne's avatar
edne committed
124
```
Tancredi Orlando's avatar
Tancredi Orlando committed
125
126
>>> 2 + 2
4
Tancredi Orlando's avatar
Tancredi Orlando committed
127
```
edne's avatar
edne committed
128

Tancredi Orlando's avatar
Tancredi Orlando committed
129
```
Tancredi Orlando's avatar
Tancredi Orlando committed
130
131
>>> 3 * 3
9
Tancredi Orlando's avatar
Tancredi Orlando committed
132
```
edne's avatar
edne committed
133

Tancredi Orlando's avatar
Tancredi Orlando committed
134
```
edne's avatar
edne committed
135
>>> 4 < 5
Tancredi Orlando's avatar
Tancredi Orlando committed
136
137
138
139
140
True
```

----

edne's avatar
edne committed
141
142
## Commenti

Tancredi Orlando's avatar
Tancredi Orlando committed
143
Tutto ciò posto dopo il cancelletto (`#`) non è interpretato.
edne's avatar
edne committed
144

Tancredi Orlando's avatar
Tancredi Orlando committed
145
```
edne's avatar
edne committed
146
>>> 1 + 1  # qui posso scrivere quello che voglio
edne's avatar
edne committed
147
148
149
2
```

edne's avatar
edne committed
150
151
----

Tancredi Orlando's avatar
Tancredi Orlando committed
152
153
## Errori

edne's avatar
edne committed
154
```
Tancredi Orlando's avatar
Tancredi Orlando committed
155
156
157
158
159
160
>>> 3 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
```

edne's avatar
edne committed
161
Il segreto degli [hacker](http://www.girodivite.it/Diario-di-un-aspirante-hacker.html)? Leggere le scritte!
Tancredi Orlando's avatar
Tancredi Orlando committed
162
163
164
165
166

----

## Variabili

Tancredi Orlando's avatar
Tancredi Orlando committed
167
```
Tancredi Orlando's avatar
Tancredi Orlando committed
168
>>> x = 6
Tancredi Orlando's avatar
Tancredi Orlando committed
169
>>> y = 2
Tancredi Orlando's avatar
Tancredi Orlando committed
170
171
>>> x
6
Tancredi Orlando's avatar
Tancredi Orlando committed
172
173
174
>>> y
2
```
edne's avatar
edne committed
175

Tancredi Orlando's avatar
Tancredi Orlando committed
176
177
178
179
180
181
```
>>> 2 * y
4
>>> x + y
8
```
edne's avatar
edne committed
182

Tancredi Orlando's avatar
Tancredi Orlando committed
183
184
185
186
```
>>> z = x + y
>>> z
8
Tancredi Orlando's avatar
Tancredi Orlando committed
187
188
```

edne's avatar
edne committed
189
---
Tancredi Orlando's avatar
Tancredi Orlando committed
190

edne's avatar
edne committed
191
192
193
194
195
# Tipi

----

## Cosa ho di fronte?
Tancredi Orlando's avatar
Tancredi Orlando committed
196

edne's avatar
edne committed
197
```
Tancredi Orlando's avatar
Tancredi Orlando committed
198
199
>>> type(3)
<class 'int'>
Tancredi Orlando's avatar
Tancredi Orlando committed
200
```
Tancredi Orlando's avatar
Tancredi Orlando committed
201

Tancredi Orlando's avatar
Tancredi Orlando committed
202
```
Tancredi Orlando's avatar
Tancredi Orlando committed
203
204
205
206
207
208
>>> type(3.14)
<class 'float'>
```

----

edne's avatar
edne committed
209
## Numeri interi (`int`)
Niccolò Izzo's avatar
Niccolò Izzo committed
210

edne's avatar
edne committed
211
```
Niccolò Izzo's avatar
Niccolò Izzo committed
212
213
214
12       # notazione decimale
0xAB     # notazione esadecimale
0b101    # notazione binaria
edne's avatar
edne committed
215
```
edne's avatar
edne committed
216
217
218

----

edne's avatar
edne committed
219
## Numeri decimali (`float`)
edne's avatar
edne committed
220
221

```
edne's avatar
edne committed
222
>>> 3.14 + 1.23
edne's avatar
edne committed
223
4.3740000000000006
Tancredi Orlando's avatar
Tancredi Orlando committed
224
```
edne's avatar
edne committed
225

Tancredi Orlando's avatar
Tancredi Orlando committed
226
```
edne's avatar
edne committed
227
228
>>> 100 / 3
33.333333333333336
Tancredi Orlando's avatar
Tancredi Orlando committed
229
```
Tancredi Orlando's avatar
Tancredi Orlando committed
230

Tancredi Orlando's avatar
Tancredi Orlando committed
231
```
edne's avatar
edne committed
232
233
234
>>> 100 // 3
33
```
Tancredi Orlando's avatar
Tancredi Orlando committed
235
236
237

----

edne's avatar
edne committed
238
## Casting
edne's avatar
edne committed
239
240

- È l'azione di conversione del tipo
edne's avatar
edne committed
241
- Si usa il nome del tipo destinazione
Tancredi Orlando's avatar
Tancredi Orlando committed
242

edne's avatar
edne committed
243
244
245
```
>>> int(4.20)
4
Tancredi Orlando's avatar
Tancredi Orlando committed
246
```
edne's avatar
edne committed
247

Tancredi Orlando's avatar
Tancredi Orlando committed
248
```
edne's avatar
edne committed
249
250
251
>>> x = float(13)
>>> x
13.0
Tancredi Orlando's avatar
Tancredi Orlando committed
252
```
edne's avatar
edne committed
253

Tancredi Orlando's avatar
Tancredi Orlando committed
254
```
edne's avatar
edne committed
255
256
257
258
259
>>> type(x)
float
>>> type(13)
int
```
Tancredi Orlando's avatar
Tancredi Orlando committed
260
261
262

----

edne's avatar
edne committed
263
## Booleani (`bool`)
Tancredi Orlando's avatar
Tancredi Orlando committed
264

edne's avatar
edne committed
265
266
- Possono assumere due valori: **True** o **False**
- Supportano operazioni logiche (**and**, **or**, **not**)
edne's avatar
edne committed
267
268
- Sono il risultato delle operazioni di confronto

Tancredi Orlando's avatar
Tancredi Orlando committed
269
270
271
272
273
----

```
>>> 4 < 5
True
Tancredi Orlando's avatar
Tancredi Orlando committed
274
```
Tancredi Orlando's avatar
Tancredi Orlando committed
275

Tancredi Orlando's avatar
Tancredi Orlando committed
276
```
Tancredi Orlando's avatar
Tancredi Orlando committed
277
278
>>> 3.14 < 2
False
Tancredi Orlando's avatar
Tancredi Orlando committed
279
```
Tancredi Orlando's avatar
Tancredi Orlando committed
280

Tancredi Orlando's avatar
Tancredi Orlando committed
281
```
Tancredi Orlando's avatar
Tancredi Orlando committed
282
283
>>> (4 < 5) or (3.14 < 2)
True
Tancredi Orlando's avatar
Tancredi Orlando committed
284
```
Tancredi Orlando's avatar
Tancredi Orlando committed
285

Tancredi Orlando's avatar
Tancredi Orlando committed
286
```
Tancredi Orlando's avatar
Tancredi Orlando committed
287
288
289
290
291
292
>>> (4 < 5) and (3.14 < 2)
False
```

----

edne's avatar
edne committed
293
294
## Short-circuit evaluation

edne's avatar
edne committed
295
```
Tancredi Orlando's avatar
Tancredi Orlando committed
296
297
>>> (3.14 < 2) or print('Hello world!')
Hello world!
Tancredi Orlando's avatar
Tancredi Orlando committed
298
```
Tancredi Orlando's avatar
Tancredi Orlando committed
299

Tancredi Orlando's avatar
Tancredi Orlando committed
300
```
Tancredi Orlando's avatar
Tancredi Orlando committed
301
302
>>> (3.14 < 2) and print('Hello world!')
False
edne's avatar
edne committed
303
304
```

Tancredi Orlando's avatar
Tancredi Orlando committed
305
- È necessario che il valore di solo un membro dell'espressione sia falso per
edne's avatar
edne committed
306
307
  rendere tutta l'espressione falsa. Tutti gli altri termini non vengono
  valutati.
Tancredi Orlando's avatar
Tancredi Orlando committed
308
309
310
- Python valuta i membri di una espressione finché ritiene sia necessario
  per la corretta esecuzione del codice

edne's avatar
edne committed
311
---
edne's avatar
edne committed
312

edne's avatar
edne committed
313
# Collezioni
Tancredi Orlando's avatar
Tancredi Orlando committed
314
315
316

----

edne's avatar
edne committed
317
## Stringhe (`str`)
Tancredi Orlando's avatar
Tancredi Orlando committed
318

Niccolò Izzo's avatar
Niccolò Izzo committed
319
- Testo
edne's avatar
edne committed
320
321
- Racchiuse tra singoli apici (`'`) o virgolette (`"`)
- Per stringhe su più righe racchiuse tra tripli apici (`'''`) o virgolette (`"""`)
Tancredi Orlando's avatar
Tancredi Orlando committed
322
- Sono *immutabili*
edne's avatar
edne committed
323
324
325
326
327
328

```
>>> a = "Hello"
>>> b = "World"
>>> a + ' ' + b
'Hello World'
Tancredi Orlando's avatar
Tancredi Orlando committed
329
330
331
332
```

----

edne's avatar
edne committed
333
## Liste (`list`)
Tancredi Orlando's avatar
Tancredi Orlando committed
334

Tancredi Orlando's avatar
Tancredi Orlando committed
335
336
337
- Collezione **ordinata** di elementi, anche di tipi diversi
- Si definiscono ponendo all'interno di parentesi quadre gli elementi
  intervallati da una virgola
Tancredi Orlando's avatar
Tancredi Orlando committed
338

Tancredi Orlando's avatar
Tancredi Orlando committed
339
340
```
lista = [False, 1, "due", 3.0, 4, 5]
edne's avatar
edne committed
341
342
```

Tancredi Orlando's avatar
Tancredi Orlando committed
343
344
- Si accede a un elemento della lista aggiungendo l'indice dell'elemento
  desiderato tra parentesi quadre
Tancredi Orlando's avatar
Tancredi Orlando committed
345
- Il primo elemento ha indice 0 (zero-based)
edne's avatar
edne committed
346
347
348
349
350
351

```
>>> lista[2]
'due'
```

Tancredi Orlando's avatar
Tancredi Orlando committed
352
353
354
355
356
357
358
----

```
>>> lista = [False, 1, "due", 3.0, 4, 5]
>>> lista
[False, 1, 'due', 3.0, 4, 5]
```
edne's avatar
edne committed
359
360
361

```
>>> lista[0] = 0.0
Tancredi Orlando's avatar
Tancredi Orlando committed
362
363
364
365
366
>>> lista
[0.0, 1, 'due', 3.0, 4, 5]
```

```
edne's avatar
edne committed
367
368
369
>>> lista.append('sei')
>>> lista
[0.0, 1, "due", 3.0, 4, 5, 'sei']
Tancredi Orlando's avatar
Tancredi Orlando committed
370
371
```

Tancredi Orlando's avatar
Tancredi Orlando committed
372
373
374
375
```
>>> lista.remove('sei')
>>> lista
[0.0, 1, "due", 3.0, 4, 5]
Tancredi Orlando's avatar
Tancredi Orlando committed
376
377
378
```

```
Tancredi Orlando's avatar
Tancredi Orlando committed
379
380
381
>>> lista.reverse()
>>> lista
[5, 4, 3.0, 'due', 1, 0.0]
Tancredi Orlando's avatar
Tancredi Orlando committed
382
383
384
```

```
Tancredi Orlando's avatar
Tancredi Orlando committed
385
386
>>> len(lista)
6
Tancredi Orlando's avatar
Tancredi Orlando committed
387
388
```

edne's avatar
edne committed
389
----
edne's avatar
edne committed
390

Tancredi Orlando's avatar
Tancredi Orlando committed
391
392
393
394
395
396
397
398
399
400
401
402
### Slicing

- Permette di formare sottoinsiemi di elementi contigui
- Bisogna indicare un intervallo di indici, separando inizio e fine con
  due punti (`:`)
- L'elemento finale non è incluso

```
>>> lista = [0.0, 1, "due", 3.0, 4, 5, 'sei']
```

```
edne's avatar
edne committed
403
>>> lista[2:5]
Tancredi Orlando's avatar
Tancredi Orlando committed
404
405
406
['due', 3.0, 4]
```

edne's avatar
edne committed
407
408
409
410
----

### Slicing

Tancredi Orlando's avatar
Tancredi Orlando committed
411
412
413
414
415
416
417
418
419
420
- È possibile indicare tutti gli elementi dall'inizio o fino alla fine di una
  lista omettendone l'indice

```
>>> lista[:4]
[0.0, 1, 'due', 3.0]
>>> lista[4:]
[4, 5, 'sei']
```

edne's avatar
edne committed
421
422
423
424
425
426
427
- Utilizzando indici negativi si parte a contare dal fondo

```
>>> lista[-4:]
[3.0, 4, 5, 'sei']  # ultimi 4 elementi
```

Tancredi Orlando's avatar
Tancredi Orlando committed
428
429
----

Tancredi Orlando's avatar
Tancredi Orlando committed
430
### Unpacking
edne's avatar
edne committed
431

Tancredi Orlando's avatar
Tancredi Orlando committed
432
Estrarre valori da un contenitore
edne's avatar
edne committed
433
434
435

```
>>> t = (1, 2)
Tancredi Orlando's avatar
Tancredi Orlando committed
436
```
Tancredi Orlando's avatar
Tancredi Orlando committed
437

Tancredi Orlando's avatar
Tancredi Orlando committed
438
```
edne's avatar
edne committed
439
440
441
>>> a, b = t
>>> b
2
Tancredi Orlando's avatar
Tancredi Orlando committed
442
```
edne's avatar
edne committed
443

Tancredi Orlando's avatar
Tancredi Orlando committed
444
```
edne's avatar
edne committed
445
>>> a, b = b, a
Tancredi Orlando's avatar
Tancredi Orlando committed
446
447
>>> a
2
Tancredi Orlando's avatar
Tancredi Orlando committed
448
```
Tancredi Orlando's avatar
Tancredi Orlando committed
449

Tancredi Orlando's avatar
Tancredi Orlando committed
450
```
Tancredi Orlando's avatar
Tancredi Orlando committed
451
452
>>> c, _ = t
>>> c
edne's avatar
edne committed
453
454
455
1
```

Tancredi Orlando's avatar
Tancredi Orlando committed
456
457
----

Tancredi Orlando's avatar
Tancredi Orlando committed
458
### L'operatore `in`
edne's avatar
edne committed
459

Tancredi Orlando's avatar
Tancredi Orlando committed
460
Valuta l'appartenenza di un elemento ad una collezione
Niccolò Izzo's avatar
Niccolò Izzo committed
461

edne's avatar
edne committed
462
463
464
465
466
```
>>> lista = ['a', 'b', 'c']
>>> 'c' in lista
True
```
Tancredi Orlando's avatar
Tancredi Orlando committed
467

Niccolò Izzo's avatar
Niccolò Izzo committed
468
469
470
471
472
473
474
475
- È un'espressione booleana
- Si può usare con l'operatore `not`

```
>>> lista = ['a', 'b', 'c']
>>> 'c' not in lista
False
```
edne's avatar
edne committed
476

edne's avatar
edne committed
477
478
----

Tancredi Orlando's avatar
Tancredi Orlando committed
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
## 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 "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

```
>>> tupla.append('sei')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
```

----

edne's avatar
edne committed
505
506
## Riferimenti

Tancredi Orlando's avatar
Tancredi Orlando committed
507
508
- Quando assegniamo un oggetto ad una variabile, la variabile contiene solo un
  *riferimento* all'oggetto
edne's avatar
edne committed
509
510
- **Non** l'oggetto stesso.

Tancredi Orlando's avatar
Tancredi Orlando committed
511
```
edne's avatar
edne committed
512
>>> spesa_a = ['mela', 'mango']
Tancredi Orlando's avatar
Tancredi Orlando committed
513
```
Tancredi Orlando's avatar
Tancredi Orlando committed
514

Tancredi Orlando's avatar
Tancredi Orlando committed
515
```
edne's avatar
edne committed
516
517
>>> spesa_b = spesa_a
>>> spesa_b.append('carota')
Tancredi Orlando's avatar
Tancredi Orlando committed
518
519
520
>>> spesa_b
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
521

Tancredi Orlando's avatar
Tancredi Orlando committed
522
```
edne's avatar
edne committed
523
524
525
>>> spesa_a
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
526
527
528

----

edne's avatar
edne committed
529
## Insiemi (`set`)
Tancredi Orlando's avatar
Tancredi Orlando committed
530

Niccolò Izzo's avatar
Niccolò Izzo committed
531
- Come gli insiemi matematici
Tancredi Orlando's avatar
Tancredi Orlando committed
532
- **Non sono ordinati**
Tancredi Orlando's avatar
Tancredi Orlando committed
533
534
- Non contengono elementi duplicati

Tancredi Orlando's avatar
Tancredi Orlando committed
535
536
```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
Niccolò Izzo's avatar
Niccolò Izzo committed
537
>>> frutta
edne's avatar
edne committed
538
{'mele', 'zucchine', 'pere'}
Tancredi Orlando's avatar
Tancredi Orlando committed
539
540
```

Tancredi Orlando's avatar
Tancredi Orlando committed
541
----
Niccolò Izzo's avatar
Niccolò Izzo committed
542

Tancredi Orlando's avatar
Tancredi Orlando committed
543
544
545
546
Supportano le operazioni insiemistiche

```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
Niccolò Izzo's avatar
Niccolò Izzo committed
547
>>> verdure = {"zucchine", "verze", "coste", "porri"}
Tancredi Orlando's avatar
Tancredi Orlando committed
548
```
Tancredi Orlando's avatar
Tancredi Orlando committed
549

Tancredi Orlando's avatar
Tancredi Orlando committed
550
```
Tancredi Orlando's avatar
Tancredi Orlando committed
551
>>> frutta.union(verdure)
edne's avatar
edne committed
552
{'coste', 'mele', 'pere', 'porri', 'verze', 'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
553
```
Tancredi Orlando's avatar
Tancredi Orlando committed
554

Tancredi Orlando's avatar
Tancredi Orlando committed
555
```
Niccolò Izzo's avatar
Niccolò Izzo committed
556
557
>>> frutta.intersection(verdure)
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
558
```
Tancredi Orlando's avatar
Tancredi Orlando committed
559

Tancredi Orlando's avatar
Tancredi Orlando committed
560
```
Tancredi Orlando's avatar
Tancredi Orlando committed
561
562
>>> frutta.difference(verdure)
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
563
```
Tancredi Orlando's avatar
Tancredi Orlando committed
564

Tancredi Orlando's avatar
Tancredi Orlando committed
565
```
Tancredi Orlando's avatar
Tancredi Orlando committed
566
567
568
569
570
571
572
573
574
575
576
>>> verdure.difference(frutta)
{'verze', 'coste', 'porri'}
```

----

La sintesi è anche espressività

```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
>>> verdure = {"zucchine", "verze", "coste", "porri"}
Tancredi Orlando's avatar
Tancredi Orlando committed
577
```
Tancredi Orlando's avatar
Tancredi Orlando committed
578

Tancredi Orlando's avatar
Tancredi Orlando committed
579
```
Tancredi Orlando's avatar
Tancredi Orlando committed
580
>>> frutta | verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
581
{'porri', 'verze', 'pere', 'zucchine', 'coste', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
582
```
Tancredi Orlando's avatar
Tancredi Orlando committed
583

Tancredi Orlando's avatar
Tancredi Orlando committed
584
```
Tancredi Orlando's avatar
Tancredi Orlando committed
585
586
>>> frutta & verdure
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
587
```
Tancredi Orlando's avatar
Tancredi Orlando committed
588

Tancredi Orlando's avatar
Tancredi Orlando committed
589
```
Tancredi Orlando's avatar
Tancredi Orlando committed
590
>>> frutta - verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
591
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
592
```
Tancredi Orlando's avatar
Tancredi Orlando committed
593

Tancredi Orlando's avatar
Tancredi Orlando committed
594
```
Tancredi Orlando's avatar
Tancredi Orlando committed
595
>>> verdure - frutta
Tancredi Orlando's avatar
Tancredi Orlando committed
596
{'verze', 'coste', 'porri'}
Niccolò Izzo's avatar
Niccolò Izzo committed
597
```
edne's avatar
edne committed
598

edne's avatar
edne committed
599
----
Tancredi Orlando's avatar
Tancredi Orlando committed
600

edne's avatar
edne committed
601
## Dizionari (`dict`)
Tancredi Orlando's avatar
Tancredi Orlando committed
602

edne's avatar
edne committed
603
- Associano ogni chiave ad un valore
Tancredi Orlando's avatar
Tancredi Orlando committed
604
- Le chiavi devono essere immutabili (stringhe, tuple)
Tancredi Orlando's avatar
Tancredi Orlando committed
605

edne's avatar
edne committed
606
```python
edne's avatar
edne committed
607
d = {
Tancredi Orlando's avatar
Tancredi Orlando committed
608
    "chiave": "valore",
Tancredi Orlando's avatar
Tancredi Orlando committed
609
    "nome":"Tancredi",
Tancredi Orlando's avatar
Tancredi Orlando committed
610
611
    "cognome":"Orlando",
    ('immutable', 'types'): ['are', 'cool']
Tancredi Orlando's avatar
Tancredi Orlando committed
612
613
614
    }
```

Tancredi Orlando's avatar
Tancredi Orlando committed
615
616
Si accede ai campi come si accede agli elementi di una lista, usando la chiave
al posto dell'indice.
edne's avatar
edne committed
617
618
619
620
621
622

```
>>> d['nome']
'Tancredi'
```

Tancredi Orlando's avatar
Tancredi Orlando committed
623
624
625
626
627
```
>>> print('these things ' + ' '.join(d[('immutable', 'types')])
these things are cool
```

edne's avatar
edne committed
628
---
Tancredi Orlando's avatar
Tancredi Orlando committed
629

Tancredi Orlando's avatar
Tancredi Orlando committed
630
# Controllo del flusso
edne's avatar
edne committed
631

Tancredi Orlando's avatar
Tancredi Orlando committed
632
633
----

edne's avatar
edne committed
634
## `if`
Tancredi Orlando's avatar
Tancredi Orlando committed
635

Tancredi Orlando's avatar
Tancredi Orlando committed
636
Se una condizione è vera esegue un blocco di codice.
edne's avatar
edne committed
637
638
639
640
641
642

```python
if 3 > 2:
    print('Condizione vera')
```

Niccolò Izzo's avatar
Niccolò Izzo committed
643
## Blocchi
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
644

Tancredi Orlando's avatar
Tancredi Orlando committed
645
646
- 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
Niccolò Izzo's avatar
Niccolò Izzo committed
647

edne's avatar
edne committed
648
Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
649
650
Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come
prima.
edne's avatar
edne committed
651

Niccolò Izzo's avatar
Niccolò Izzo committed
652
----
edne's avatar
edne committed
653

edne's avatar
edne committed
654
## `else`
edne's avatar
edne committed
655

Tancredi Orlando's avatar
Tancredi Orlando committed
656
657
- Se la condizione di una istruzione `if` è falsa viene eseguito il blocco
  della istruzione `else` (se presente)
Niccolò Izzo's avatar
Niccolò Izzo committed
658

edne's avatar
edne committed
659
660
661
662
663
664
665
```python
if 3 > 2:
    print('Condizione vera')
else:
    print('Condizione falsa')
```

Tancredi Orlando's avatar
Tancredi Orlando committed
666
667
----

edne's avatar
edne committed
668
## `while`
Tancredi Orlando's avatar
Tancredi Orlando committed
669

Tancredi Orlando's avatar
Tancredi Orlando committed
670
671
672
- Valuta una espressione
- Se è vera esegue un blocco di codice
- Vai al primo punto
edne's avatar
edne committed
673

Tancredi Orlando's avatar
Tancredi Orlando committed
674
```
edne's avatar
edne committed
675
676
>>> x = 0
>>> while x < 3:
Tancredi Orlando's avatar
Tancredi Orlando committed
677
678
...     x = x + 1
...     print("ora x vale", x)
edne's avatar
edne committed
679
680
681
682
683
...
ora x vale 1
ora x vale 2
ora x vale 3
```
Tancredi Orlando's avatar
Tancredi Orlando committed
684

edne's avatar
edne committed
685
----
Tancredi Orlando's avatar
Tancredi Orlando committed
686

edne's avatar
edne committed
687
## `for`
edne's avatar
edne committed
688

Niccolò Izzo's avatar
Niccolò Izzo committed
689
- Esegue un blocco per ogni elemento di una sequenza
Tancredi Orlando's avatar
Tancredi Orlando committed
690

Tancredi Orlando's avatar
Tancredi Orlando committed
691
692
693
694
```
>>> for i in [0, 1, 2, 3, 4]:
...     print(i)
0 1 2 3 4
edne's avatar
edne committed
695
696
```

Tancredi Orlando's avatar
Tancredi Orlando committed
697
698
- La funzione `range()` genera sequenze da usare all'interno di istruzioni
  `for`
Niccolò Izzo's avatar
Niccolò Izzo committed
699

Tancredi Orlando's avatar
Tancredi Orlando committed
700
701
```
>>> for i in range(0, 5):
Niccolò Izzo's avatar
Niccolò Izzo committed
702
...    print(i)
Tancredi Orlando's avatar
Tancredi Orlando committed
703
0 1 2 3 4
Niccolò Izzo's avatar
Niccolò Izzo committed
704
705
```

edne's avatar
edne committed
706
----
edne's avatar
edne committed
707

Tancredi Orlando's avatar
Tancredi Orlando committed
708
## `break` e `continue`
edne's avatar
edne committed
709

Tancredi Orlando's avatar
Tancredi Orlando committed
710
711
712
713
714
- 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
edne's avatar
edne committed
715

Tancredi Orlando's avatar
Tancredi Orlando committed
716
717
718
719
720
721
722
723
```
>>> 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
edne's avatar
edne committed
724
```
edne's avatar
edne committed
725

edne's avatar
edne committed
726
---
edne's avatar
edne committed
727

edne's avatar
edne committed
728
729
# Funzioni

edne's avatar
edne committed
730
----
edne's avatar
edne committed
731

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
732
- Sono porzioni di codice a cui è assegnato un nome
Tancredi Orlando's avatar
Tancredi Orlando committed
733
734
735
736
- È 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`
edne's avatar
edne committed
737

Tancredi Orlando's avatar
Tancredi Orlando committed
738
739
740
741
```
>>> def say_hello():
...     print('Hello world!')
```
edne's avatar
edne committed
742

Tancredi Orlando's avatar
Tancredi Orlando committed
743
744
745
746
747
```
>>> say_hello()  # chiama la funzione
Hello world!
>>> say_hello()  # chiama la funzione nuovamente
Hello world!
edne's avatar
edne committed
748
749
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
750
751
- Le funzioni possono ottenere dati in ingresso, e fornire dati in uscita
- Per tale capacità permettono la riusabilità del codice
edne's avatar
edne committed
752

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
753
----
edne's avatar
edne committed
754

Tancredi Orlando's avatar
Tancredi Orlando committed
755
## Parametri
edne's avatar
edne committed
756

Tancredi Orlando's avatar
Tancredi Orlando committed
757
- La funzione può essere "predisposta" per ricevere parametri
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
758
759
760
- I parametri sono i dati in ingresso di una funzione
- I parametri diventano variabili visibili all'interno della funzione per essere
  usati
Tancredi Orlando's avatar
Tancredi Orlando committed
761

edne's avatar
edne committed
762
763
----

Tancredi Orlando's avatar
Tancredi Orlando committed
764
## Valore di ritorno
edne's avatar
edne committed
765

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
766
767
768
769
- 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
edne's avatar
edne committed
770

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
771
```
edne's avatar
edne committed
772
>>> def somma(a, b):
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
773
774
775
776
...     return a + b
```

```
edne's avatar
edne committed
777
778
>>> somma(1, 2)
3
edne's avatar
edne committed
779
780
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
781
782
783
784
785
786
787
```
>>> a, b = 3, 14
>>> c = somma(a, b)
>>> c
17
```

Tancredi Orlando's avatar
Tancredi Orlando committed
788
789
----

Tancredi Orlando's avatar
Tancredi Orlando committed
790
## Parametri di default
Tancredi Orlando's avatar
Tancredi Orlando committed
791

Tancredi Orlando's avatar
Tancredi Orlando committed
792
793
- Alcuni parametri possono essere opzionali
- Se non specificati assumono un valore di default
Tancredi Orlando's avatar
Tancredi Orlando committed
794

Tancredi Orlando's avatar
Tancredi Orlando committed
795
```
Tancredi Orlando's avatar
Tancredi Orlando committed
796
797
798
799
800
801
802
803
804
805
806
807
808
809
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
```
edne's avatar
edne committed
810

edne's avatar
edne committed
811
----
edne's avatar
edne committed
812

Tancredi Orlando's avatar
Tancredi Orlando committed
813
## Scoping
edne's avatar
edne committed
814

edne's avatar
edne committed
815
- Lo scoping determina la **visibilità** delle variabili
Tancredi Orlando's avatar
Tancredi Orlando committed
816
817
818
819
820
- 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
edne's avatar
edne committed
821

edne's avatar
edne committed
822
----
edne's avatar
edne committed
823

Tancredi Orlando's avatar
Tancredi Orlando committed
824
825
826
827
828
```
>>> x = 'globale'
>>> def f():
...     x = 'locale'
```
edne's avatar
edne committed
829

Tancredi Orlando's avatar
Tancredi Orlando committed
830
831
832
833
834
```
>>> f()
>>> print(x)
globale
```
Niccolò Izzo's avatar
Niccolò Izzo committed
835

Tancredi Orlando's avatar
Tancredi Orlando committed
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
- 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
Niccolò Izzo's avatar
Niccolò Izzo committed
853
854
```

Tancredi Orlando's avatar
Tancredi Orlando committed
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
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.

----

edne's avatar
edne committed
871
872
## None

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
- 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!
```
edne's avatar
edne committed
896

edne's avatar
edne committed
897
---
edne's avatar
Moduli    
edne committed
898
899
900

# Moduli

edne's avatar
edne committed
901
----
edne's avatar
Moduli    
edne committed
902

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
903
904
905
906
- I file contenenti codice Python hanno estensione `.py`
- Ogni file è un **modulo**
- È possibile importare variabili, funzioni e classi da altri moduli con
  l'istruzione `import`
edne's avatar
Moduli    
edne committed
907

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
908
909
910
911
912
913
914
915
916
917
918
919
920
- modulo.py
  ```
  default_lim = 3
  def conta(lim=default_lim):
      for x in range(lim):
          print(x)
  ```
- programma.py
  ```
  import modulo
  x = modulo.default_lim + 2
  modulo.conta(x)
  ```
edne's avatar
Moduli    
edne committed
921

edne's avatar
edne committed
922
----
edne's avatar
Moduli    
edne committed
923

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
924
925
926
927
- È possibile importare solo alcuni elementi da un modulo con la sintassi
  `from <modulo> import <oggetto>`
- Aiuta la leggibilità del codice
- Si omette il modulo di provenienza
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
928

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
- modulo.py
  ```
  default_lim = 3
  def conta(lim=default_lim):
      for x in range(lim):
          print(x)
  ```
- programma.py
  ```
  from modulo import default_lim, conta
  x = default_lim + 2
  conta(x)
  ```

----

Il codice posto nello scope del modulo è comunque eseguito, anche se sono
importati alcuni elementi con la sintassi `from ... import`.

- modulo.py
  ```
  a = 'variabile'
  def f():
      print('funzione')
  print('modulo')
Tancredi Orlando's avatar
Tancredi Orlando committed
954
  ```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
955
956
957
958
959
960
- dalla REPL
  ```
  >>> from modulo import f
  modulo
  >>> f()
  funzione
Tancredi Orlando's avatar
Tancredi Orlando committed
961
  ```
edne's avatar
Moduli    
edne committed
962

edne's avatar
edne committed
963
----
edne's avatar
Moduli    
edne committed
964

edne's avatar
edne committed
965
966
967
È possibile eseguire del codice solo se il file è eseguito direttamente
e non è stato importato come modulo

edne's avatar
Moduli    
edne committed
968
969

if __name__ == '__main__':
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
970
    print('Programma eseguito direttamente')
edne's avatar
Moduli    
edne committed
971
else:
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
972
    print('Questo modulo è stato importato')
edne's avatar
Moduli    
edne committed
973
```
edne's avatar
edne committed
974

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
975
976
977
978
- La variabile `__name__` contiene il nome del modulo corrente
- Se un modulo è eseguito direttamente la variabile `__name__` assume valore
  ‘`__main__`’

Tancredi Orlando's avatar
Tancredi Orlando committed
979
980
981
982
983
984
985
986
987
988
989
990
991
----

- Python dispone di numerosi moduli già inclusi
- Le capacità del linguaggio si possono estendere con moduli esterni
- È possibile installare ulteiori moduli tramite `pip`

```
$ pip install --user shouty
Collecting shouty
Installing collected packages: shouty
Successfully installed shouty-0.1.dev6
```

edne's avatar
edne committed
992
---
edne's avatar
edne committed
993

edne's avatar
edne committed
994
995
996
997
# Input e Output

----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
998
999
1000
- Purtroppo a volte è necessario interagire con l'utente
- È possibile ottenere un valore dall'utente
- È possibile accedere a un file presente sul disco
edne's avatar
edne committed
1001

edne's avatar
edne committed
1002
1003
----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1004
## Formattazione dell'output
edne's avatar
edne committed
1005
1006

```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1007
1008
1009
1010
1011
>>> s = 'Corsi {} {}'
>>> s.format('Python', '2017')
'Corsi Python 2017'
>>> s.format('Linux', 'base')
'Corsi Linux base'
edne's avatar
edne committed
1012
1013
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1014
1015
1016
1017
1018
```
>>> s = 'Corsi {argomento} {tipo}'
>>> s.format(tipo='avanzati', argomento='antani')
'Corsi antani avanzati'
```
edne's avatar
edne committed
1019

edne's avatar
edne committed
1020
1021
1022
1023
1024
1025
```
from math import pi
>>> '{:.2f}'.format(pi)
3.14
```

edne's avatar
edne committed
1026
----
edne's avatar
edne committed
1027

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1028
## Input dall'utente
edne's avatar
edne committed
1029

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1030
1031
1032
1033
1034
1035
```
>>> a = input()
asd
>>> a
'asd'
```
edne's avatar
edne committed
1036

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1037
1038
1039
1040
1041
```
>>> nome = input("Inserisci il tuo nome: ")
Gattuso
>>> 'Il tuo nome è {}.'.format(nome)
'Il tuo nonme è Gattuso.'
edne's avatar
edne committed
1042
1043
```

edne's avatar
edne committed
1044
----
edne's avatar
edne committed
1045

Niccolò Izzo's avatar
Niccolò Izzo committed
1046
## Aprire i file
edne's avatar
edne committed
1047

Niccolò Izzo's avatar
Niccolò Izzo committed
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
```python
f = open("documento.txt", "w")
f.write("contenuto")
f.close()
```


- `open(filename, mode)` ritorna un riferimento al file
- Il parametro `mode` specifica la  modalità

| mode  | descrizione                     |
| :---- | :------------------------------ |
| r     | Apertura in sola lettura        |
| w     | Apertura in sola scrittura      |
| r+    | Apertura in lettura e scrittura |
| a     | Scrittura in coda               |

----

## Usare i file

- Per scrivere su un file
```
>>> f = open("documento.txt", "w")
>>> f.write("Contenuti serissimi.")
20
>>> f.close()
```
- Per leggere da un file
```
>>> f = open("documento.txt", "r")
>>> f.read()
'Contenuti serissimi.'
>>> f.close()
```
- I metodi `readline` e `writeline` leggono e scrivono una riga alla volta
- Ricordiamoci di chiudere sempre il file con la funzione `close()`

----

## Una scorciatoia

```python
with open("documento.txt", "w") as f:
	f.write("contenuto")
```

- All'interno del blocco, `f` è un riferimento al file
- Non serve chiudere esplicitamente
- Se vengono sollevati errori o eccezioni il file viene chiuso
edne's avatar
edne committed
1098
- Usate `with` quando potete
Niccolò Izzo's avatar
Niccolò Izzo committed
1099
1100
1101
1102
1103

----

## Guardiamoci le spalle

Tancredi Orlando's avatar
Tancredi Orlando committed
1104
1105
1106
- Gli errori non sono sempre causati dal programmatore
- Si possono presentare situazioni in cui è plausibile che si verifichi un
  errore
Niccolò Izzo's avatar
Niccolò Izzo committed
1107
1108
1109
1110
1111
1112
1113

```
>>> f = open("documento.rtf", "r")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory ...
```
Tancredi Orlando's avatar
Tancredi Orlando committed
1114
1115

- Queste situazioni si chiamano **eccezioni**.
Niccolò Izzo's avatar
Niccolò Izzo committed
1116
1117
1118

----

Tancredi Orlando's avatar
Tancredi Orlando committed
1119
1120
1121
1122
1123
1124
## Eccezioni

- Il codice che potrebbe dare errori si include in un blocco `try`
- Si indica l'errore con l'istruzione `except`
- Si indica il codice da eseguire in caso si presenti l'errore dentro un blocco
  `except`
Niccolò Izzo's avatar
Niccolò Izzo committed
1125
1126
1127

```
>>> try:
edne's avatar
edne committed
1128
1129
...     with open("documento.txt", "r") as f:
...         print('Do stuff')
Niccolò Izzo's avatar
Niccolò Izzo committed
1130
... except FileNotFoundError:
edne's avatar
edne committed
1131
...     print("Ops")
Niccolò Izzo's avatar
Niccolò Izzo committed
1132
```
Tancredi Orlando's avatar
Tancredi Orlando committed
1133
1134
1135

----

edne's avatar
edne committed
1136
I più ardimentosi possono anche "sollevare" eccezioni all'interno del proprio
Tancredi Orlando's avatar
Tancredi Orlando committed
1137
1138
codice con l'istruzione `raise`.

Niccolò Izzo's avatar
Niccolò Izzo committed
1139
1140
1141
1142
1143
1144
1145
1146
1147
```
>>> raise Exception("No internet connection!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: No internet connection!
```

----

Tancredi Orlando's avatar
Tancredi Orlando committed
1148
# Nella prossima puntata
Niccolò Izzo's avatar
Niccolò Izzo committed
1149

edne's avatar
edne committed
1150
Giovedì 19 alle 17.15 in aula 5.0.2.
Niccolò Izzo's avatar
Niccolò Izzo committed
1151

edne's avatar
edne committed
1152
1153
1154
- Classi
- Metodi
- Ereditarietà
edne's avatar
edne committed
1155
1156
1157
- List comprehensions
- Decoratori
- yield
Niccolò Izzo's avatar
Niccolò Izzo committed
1158
1159

----
edne's avatar
edne committed
1160

Tancredi Orlando's avatar
Tancredi Orlando committed
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
```
>>> 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.
[...]
```

----

edne's avatar
edne committed
1178
1179
# Thank you!

Tancredi Orlando's avatar
Tancredi Orlando committed
1180
![POuL](https://www.poul.org/wp-content/themes/hipoul/img/newlogo.svg)
Tancredi Orlando's avatar
Tancredi Orlando committed
1181

Tancredi Orlando's avatar
Tancredi Orlando committed
1182
![Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png)