slides.md 18.8 KB
Newer Older
edne's avatar
edne committed
1
# Corso Python 2018
Tancredi Orlando's avatar
Tancredi Orlando committed
2

Niccolò Izzo's avatar
Niccolò Izzo committed
3
4
5
6
7
Niccolò Izzo

[izzo.niccolo@gmail.com](mailto:izzo.niccolo@gmail.com)

D. Raffaele Jr. Di Campli
Jacotsu's avatar
Jacotsu committed
8
9
10

[dcdrj.pub@gmail.com](mailto:dcdrj.pub@gmail.com)

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

Tancredi Orlando's avatar
Tancredi Orlando committed
13
14
15
16
----

Potete ottenere questa presentazione recandovi all'indirizzo:

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

edne's avatar
edne committed
19
---
Tancredi Orlando's avatar
Tancredi Orlando committed
20

edne's avatar
edne committed
21
 Perché Python?
Tancredi Orlando's avatar
Tancredi Orlando committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35

- 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
36
    printf("Hello, world!\n");
Tancredi Orlando's avatar
Tancredi Orlando committed
37
38
39
40
41
42
43
44
45
46
47
    return 0;
}
```

----

## Java

```java
public class HelloWorld {
    public static void main(String[] args) {
Niccolò Izzo's avatar
Niccolò Izzo committed
48
        System.out.println("Goodbye, world!");
Tancredi Orlando's avatar
Tancredi Orlando committed
49
50
51
52
53
54
55
56
57
    }
}
```

----

## Python

```python
Niccolò Izzo's avatar
Niccolò Izzo committed
58
print('Hello, world!')
Tancredi Orlando's avatar
Tancredi Orlando committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
```

----

![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
73
- Noi useremo Python 3
Tancredi Orlando's avatar
Tancredi Orlando committed
74
75
76
77
78
79
80
81
- Fatelo anche voi

----

## Interpretato vs. compilato

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

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
85
86
87
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
88

edne's avatar
edne committed
89
----
Tancredi Orlando's avatar
Tancredi Orlando committed
90
91
92

## Cosa serve

Tancredi Orlando's avatar
Tancredi Orlando committed
93
94
95
- Per scrivere il codice, un editor di testo:
  - Multipiattaforma: Atom
  - Windows: Notepad++
edne's avatar
edne committed
96
- In quanto linguaggio interpretato, l'interprete Python
Tancredi Orlando's avatar
Tancredi Orlando committed
97
98
99
100
101
  - 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
102
103
---

Tancredi Orlando's avatar
Tancredi Orlando committed
104
# Il linguaggio
edne's avatar
edne committed
105

Tancredi Orlando's avatar
Tancredi Orlando committed
106
107
108
109
110
111
----

## REPL

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

Tancredi Orlando's avatar
Tancredi Orlando committed
112
```
Tancredi Orlando's avatar
Tancredi Orlando committed
113
$ python3
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
114
Python 3.6.1 (default, Mar 27 2017, 00:27:06)
Tancredi Orlando's avatar
Tancredi Orlando committed
115
[GCC 6.3.1 20170306] on linux
Niccolò Izzo's avatar
Niccolò Izzo committed
116
117
Type "help", "copyright", "credits" or "license" for more info...
>>> print('Hello, world!')
Tancredi Orlando's avatar
Tancredi Orlando committed
118
119
120
Hello world!
```

edne's avatar
edne committed
121
Per uscire: `quit()` o `CTRL-D`
Tancredi Orlando's avatar
Tancredi Orlando committed
122
123

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
124
125
126
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
127
128
129
130
131

----

## Espressioni

edne's avatar
edne committed
132
```
Tancredi Orlando's avatar
Tancredi Orlando committed
133
134
>>> 2 + 2
4
Tancredi Orlando's avatar
Tancredi Orlando committed
135
```
edne's avatar
edne committed
136

Tancredi Orlando's avatar
Tancredi Orlando committed
137
```
Tancredi Orlando's avatar
Tancredi Orlando committed
138
139
>>> 3 * 3
9
Tancredi Orlando's avatar
Tancredi Orlando committed
140
```
edne's avatar
edne committed
141

Tancredi Orlando's avatar
Tancredi Orlando committed
142
```
edne's avatar
edne committed
143
>>> 4 < 5
Tancredi Orlando's avatar
Tancredi Orlando committed
144
145
146
147
148
True
```

----

edne's avatar
edne committed
149
150
## Commenti

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

Tancredi Orlando's avatar
Tancredi Orlando committed
153
```
edne's avatar
edne committed
154
>>> 1 + 1  # qui posso scrivere quello che voglio
edne's avatar
edne committed
155
156
157
2
```

edne's avatar
edne committed
158
159
----

Tancredi Orlando's avatar
Tancredi Orlando committed
160
161
## Errori

edne's avatar
edne committed
162
```
Tancredi Orlando's avatar
Tancredi Orlando committed
163
164
165
166
167
168
>>> 3 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
```

edne's avatar
edne committed
169
Il segreto degli [hacker](http://www.girodivite.it/Diario-di-un-aspirante-hacker.html)? Leggere le scritte!
Tancredi Orlando's avatar
Tancredi Orlando committed
170
171
172
173
174

----

## Variabili

Tancredi Orlando's avatar
Tancredi Orlando committed
175
```
Tancredi Orlando's avatar
Tancredi Orlando committed
176
>>> x = 6
Tancredi Orlando's avatar
Tancredi Orlando committed
177
>>> y = 2
Tancredi Orlando's avatar
Tancredi Orlando committed
178
179
>>> x
6
Tancredi Orlando's avatar
Tancredi Orlando committed
180
181
182
>>> y
2
```
edne's avatar
edne committed
183

Tancredi Orlando's avatar
Tancredi Orlando committed
184
185
186
187
188
189
```
>>> 2 * y
4
>>> x + y
8
```
edne's avatar
edne committed
190

Tancredi Orlando's avatar
Tancredi Orlando committed
191
192
193
194
```
>>> z = x + y
>>> z
8
Tancredi Orlando's avatar
Tancredi Orlando committed
195
196
```

edne's avatar
edne committed
197
---
Tancredi Orlando's avatar
Tancredi Orlando committed
198

edne's avatar
edne committed
199
200
201
202
203
# Tipi

----

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

edne's avatar
edne committed
205
```
Tancredi Orlando's avatar
Tancredi Orlando committed
206
207
>>> type(3)
<class 'int'>
Tancredi Orlando's avatar
Tancredi Orlando committed
208
```
Tancredi Orlando's avatar
Tancredi Orlando committed
209

Tancredi Orlando's avatar
Tancredi Orlando committed
210
```
Tancredi Orlando's avatar
Tancredi Orlando committed
211
212
213
214
215
216
>>> type(3.14)
<class 'float'>
```

----

edne's avatar
edne committed
217
## Numeri interi (`int`)
Niccolò Izzo's avatar
Niccolò Izzo committed
218

edne's avatar
edne committed
219
```
Niccolò Izzo's avatar
Niccolò Izzo committed
220
221
222
12       # notazione decimale
0xAB     # notazione esadecimale
0b101    # notazione binaria
edne's avatar
edne committed
223
```
edne's avatar
edne committed
224
225
226

----

edne's avatar
edne committed
227
## Numeri decimali (`float`)
edne's avatar
edne committed
228
229

```
edne's avatar
edne committed
230
>>> 3.14 + 1.23
edne's avatar
edne committed
231
4.3740000000000006
Tancredi Orlando's avatar
Tancredi Orlando committed
232
```
edne's avatar
edne committed
233

Tancredi Orlando's avatar
Tancredi Orlando committed
234
```
edne's avatar
edne committed
235
236
>>> 100 / 3
33.333333333333336
Tancredi Orlando's avatar
Tancredi Orlando committed
237
```
Tancredi Orlando's avatar
Tancredi Orlando committed
238

Tancredi Orlando's avatar
Tancredi Orlando committed
239
```
edne's avatar
edne committed
240
241
242
>>> 100 // 3
33
```
Tancredi Orlando's avatar
Tancredi Orlando committed
243
244
245

----

edne's avatar
edne committed
246
## Casting
edne's avatar
edne committed
247
248

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

edne's avatar
edne committed
251
252
253
```
>>> int(4.20)
4
Tancredi Orlando's avatar
Tancredi Orlando committed
254
```
edne's avatar
edne committed
255

Tancredi Orlando's avatar
Tancredi Orlando committed
256
```
edne's avatar
edne committed
257
258
259
>>> x = float(13)
>>> x
13.0
Tancredi Orlando's avatar
Tancredi Orlando committed
260
```
edne's avatar
edne committed
261

Tancredi Orlando's avatar
Tancredi Orlando committed
262
```
edne's avatar
edne committed
263
264
265
266
267
>>> type(x)
float
>>> type(13)
int
```
Tancredi Orlando's avatar
Tancredi Orlando committed
268
269
270

----

edne's avatar
edne committed
271
## Booleani (`bool`)
Tancredi Orlando's avatar
Tancredi Orlando committed
272

edne's avatar
edne committed
273
274
- Possono assumere due valori: **True** o **False**
- Supportano operazioni logiche (**and**, **or**, **not**)
edne's avatar
edne committed
275
276
- Sono il risultato delle operazioni di confronto

Tancredi Orlando's avatar
Tancredi Orlando committed
277
278
279
280
281
----

```
>>> 4 < 5
True
Tancredi Orlando's avatar
Tancredi Orlando committed
282
```
Tancredi Orlando's avatar
Tancredi Orlando committed
283

Tancredi Orlando's avatar
Tancredi Orlando committed
284
```
Tancredi Orlando's avatar
Tancredi Orlando committed
285
286
>>> 3.14 < 2
False
Tancredi Orlando's avatar
Tancredi Orlando committed
287
```
Tancredi Orlando's avatar
Tancredi Orlando committed
288

Tancredi Orlando's avatar
Tancredi Orlando committed
289
```
Tancredi Orlando's avatar
Tancredi Orlando committed
290
291
>>> (4 < 5) or (3.14 < 2)
True
Tancredi Orlando's avatar
Tancredi Orlando committed
292
```
Tancredi Orlando's avatar
Tancredi Orlando committed
293

Tancredi Orlando's avatar
Tancredi Orlando committed
294
```
Tancredi Orlando's avatar
Tancredi Orlando committed
295
296
297
298
299
300
>>> (4 < 5) and (3.14 < 2)
False
```

----

edne's avatar
edne committed
301
302
## Short-circuit evaluation

edne's avatar
edne committed
303
```
Tancredi Orlando's avatar
Tancredi Orlando committed
304
305
>>> (3.14 < 2) or print('Hello world!')
Hello world!
Tancredi Orlando's avatar
Tancredi Orlando committed
306
```
Tancredi Orlando's avatar
Tancredi Orlando committed
307

Tancredi Orlando's avatar
Tancredi Orlando committed
308
```
Tancredi Orlando's avatar
Tancredi Orlando committed
309
310
>>> (3.14 < 2) and print('Hello world!')
False
edne's avatar
edne committed
311
312
```

Tancredi Orlando's avatar
Tancredi Orlando committed
313
- È necessario che il valore di solo un membro dell'espressione sia falso per
edne's avatar
edne committed
314
315
  rendere tutta l'espressione falsa. Tutti gli altri termini non vengono
  valutati.
Tancredi Orlando's avatar
Tancredi Orlando committed
316
317
318
- Python valuta i membri di una espressione finché ritiene sia necessario
  per la corretta esecuzione del codice

edne's avatar
edne committed
319
---
edne's avatar
edne committed
320

edne's avatar
edne committed
321
# Collezioni
Tancredi Orlando's avatar
Tancredi Orlando committed
322
323
324

----

edne's avatar
edne committed
325
## Stringhe (`str`)
Tancredi Orlando's avatar
Tancredi Orlando committed
326

Niccolò Izzo's avatar
Niccolò Izzo committed
327
- Testo
edne's avatar
edne committed
328
329
- Racchiuse tra singoli apici (`'`) o virgolette (`"`)
- Per stringhe su più righe racchiuse tra tripli apici (`'''`) o virgolette (`"""`)
Tancredi Orlando's avatar
Tancredi Orlando committed
330
- Sono *immutabili*
edne's avatar
edne committed
331
332
333
334
335
336

```
>>> a = "Hello"
>>> b = "World"
>>> a + ' ' + b
'Hello World'
Tancredi Orlando's avatar
Tancredi Orlando committed
337
338
339
340
```

----

edne's avatar
edne committed
341
## Liste (`list`)
Tancredi Orlando's avatar
Tancredi Orlando committed
342

Tancredi Orlando's avatar
Tancredi Orlando committed
343
344
345
- 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
346

Tancredi Orlando's avatar
Tancredi Orlando committed
347
348
```
lista = [False, 1, "due", 3.0, 4, 5]
edne's avatar
edne committed
349
350
```

Tancredi Orlando's avatar
Tancredi Orlando committed
351
352
- Si accede a un elemento della lista aggiungendo l'indice dell'elemento
  desiderato tra parentesi quadre
Tancredi Orlando's avatar
Tancredi Orlando committed
353
- Il primo elemento ha indice 0 (zero-based)
edne's avatar
edne committed
354
355
356
357
358
359

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

Tancredi Orlando's avatar
Tancredi Orlando committed
360
361
362
363
364
365
366
----

```
>>> lista = [False, 1, "due", 3.0, 4, 5]
>>> lista
[False, 1, 'due', 3.0, 4, 5]
```
edne's avatar
edne committed
367
368
369

```
>>> lista[0] = 0.0
Tancredi Orlando's avatar
Tancredi Orlando committed
370
371
372
373
374
>>> lista
[0.0, 1, 'due', 3.0, 4, 5]
```

```
edne's avatar
edne committed
375
376
377
>>> lista.append('sei')
>>> lista
[0.0, 1, "due", 3.0, 4, 5, 'sei']
Tancredi Orlando's avatar
Tancredi Orlando committed
378
379
```

Tancredi Orlando's avatar
Tancredi Orlando committed
380
381
382
383
```
>>> lista.remove('sei')
>>> lista
[0.0, 1, "due", 3.0, 4, 5]
Tancredi Orlando's avatar
Tancredi Orlando committed
384
385
386
```

```
Tancredi Orlando's avatar
Tancredi Orlando committed
387
388
389
>>> lista.reverse()
>>> lista
[5, 4, 3.0, 'due', 1, 0.0]
Tancredi Orlando's avatar
Tancredi Orlando committed
390
391
392
```

```
Tancredi Orlando's avatar
Tancredi Orlando committed
393
394
>>> len(lista)
6
Tancredi Orlando's avatar
Tancredi Orlando committed
395
396
```

edne's avatar
edne committed
397
----
edne's avatar
edne committed
398

Tancredi Orlando's avatar
Tancredi Orlando committed
399
400
401
402
403
404
405
406
407
408
409
410
### 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
411
>>> lista[2:5]
Tancredi Orlando's avatar
Tancredi Orlando committed
412
413
414
['due', 3.0, 4]
```

edne's avatar
edne committed
415
416
417
418
----

### Slicing

Tancredi Orlando's avatar
Tancredi Orlando committed
419
420
421
422
423
424
425
426
427
428
- È 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
429
430
431
432
433
434
435
- 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
436
437
----

Tancredi Orlando's avatar
Tancredi Orlando committed
438
### Unpacking
edne's avatar
edne committed
439

Tancredi Orlando's avatar
Tancredi Orlando committed
440
Estrarre valori da un contenitore
edne's avatar
edne committed
441
442
443

```
>>> t = (1, 2)
Tancredi Orlando's avatar
Tancredi Orlando committed
444
```
Tancredi Orlando's avatar
Tancredi Orlando committed
445

Tancredi Orlando's avatar
Tancredi Orlando committed
446
```
edne's avatar
edne committed
447
448
449
>>> a, b = t
>>> b
2
Tancredi Orlando's avatar
Tancredi Orlando committed
450
```
edne's avatar
edne committed
451

Tancredi Orlando's avatar
Tancredi Orlando committed
452
```
edne's avatar
edne committed
453
>>> a, b = b, a
Tancredi Orlando's avatar
Tancredi Orlando committed
454
455
>>> a
2
Tancredi Orlando's avatar
Tancredi Orlando committed
456
```
Tancredi Orlando's avatar
Tancredi Orlando committed
457

Tancredi Orlando's avatar
Tancredi Orlando committed
458
```
Tancredi Orlando's avatar
Tancredi Orlando committed
459
460
>>> c, _ = t
>>> c
edne's avatar
edne committed
461
462
463
1
```

Tancredi Orlando's avatar
Tancredi Orlando committed
464
465
----

Tancredi Orlando's avatar
Tancredi Orlando committed
466
### L'operatore `in`
edne's avatar
edne committed
467

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

edne's avatar
edne committed
470
471
472
473
474
```
>>> lista = ['a', 'b', 'c']
>>> 'c' in lista
True
```
Tancredi Orlando's avatar
Tancredi Orlando committed
475

Niccolò Izzo's avatar
Niccolò Izzo committed
476
477
478
479
480
481
482
483
- È un'espressione booleana
- Si può usare con l'operatore `not`

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

edne's avatar
edne committed
485
486
----

Tancredi Orlando's avatar
Tancredi Orlando committed
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
## 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
513
514
## Riferimenti

Tancredi Orlando's avatar
Tancredi Orlando committed
515
516
- Quando assegniamo un oggetto ad una variabile, la variabile contiene solo un
  *riferimento* all'oggetto
edne's avatar
edne committed
517
518
- **Non** l'oggetto stesso.

Tancredi Orlando's avatar
Tancredi Orlando committed
519
```
edne's avatar
edne committed
520
>>> spesa_a = ['mela', 'mango']
Tancredi Orlando's avatar
Tancredi Orlando committed
521
```
Tancredi Orlando's avatar
Tancredi Orlando committed
522

Tancredi Orlando's avatar
Tancredi Orlando committed
523
```
edne's avatar
edne committed
524
525
>>> spesa_b = spesa_a
>>> spesa_b.append('carota')
Tancredi Orlando's avatar
Tancredi Orlando committed
526
527
528
>>> spesa_b
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
529

Tancredi Orlando's avatar
Tancredi Orlando committed
530
```
edne's avatar
edne committed
531
532
533
>>> spesa_a
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
534
535
536

----

edne's avatar
edne committed
537
## Insiemi (`set`)
Tancredi Orlando's avatar
Tancredi Orlando committed
538

Niccolò Izzo's avatar
Niccolò Izzo committed
539
- Come gli insiemi matematici
Tancredi Orlando's avatar
Tancredi Orlando committed
540
- **Non sono ordinati**
Tancredi Orlando's avatar
Tancredi Orlando committed
541
542
- Non contengono elementi duplicati

Tancredi Orlando's avatar
Tancredi Orlando committed
543
544
```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
Niccolò Izzo's avatar
Niccolò Izzo committed
545
>>> frutta
edne's avatar
edne committed
546
{'mele', 'zucchine', 'pere'}
Tancredi Orlando's avatar
Tancredi Orlando committed
547
548
```

Tancredi Orlando's avatar
Tancredi Orlando committed
549
----
Niccolò Izzo's avatar
Niccolò Izzo committed
550

Tancredi Orlando's avatar
Tancredi Orlando committed
551
552
553
554
Supportano le operazioni insiemistiche

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

Tancredi Orlando's avatar
Tancredi Orlando committed
558
```
Tancredi Orlando's avatar
Tancredi Orlando committed
559
>>> frutta.union(verdure)
edne's avatar
edne committed
560
{'coste', 'mele', 'pere', 'porri', 'verze', 'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
561
```
Tancredi Orlando's avatar
Tancredi Orlando committed
562

Tancredi Orlando's avatar
Tancredi Orlando committed
563
```
Niccolò Izzo's avatar
Niccolò Izzo committed
564
565
>>> frutta.intersection(verdure)
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
566
```
Tancredi Orlando's avatar
Tancredi Orlando committed
567

Tancredi Orlando's avatar
Tancredi Orlando committed
568
```
Tancredi Orlando's avatar
Tancredi Orlando committed
569
570
>>> frutta.difference(verdure)
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
571
```
Tancredi Orlando's avatar
Tancredi Orlando committed
572

Tancredi Orlando's avatar
Tancredi Orlando committed
573
```
Tancredi Orlando's avatar
Tancredi Orlando committed
574
575
576
577
578
579
580
581
582
583
584
>>> 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
585
```
Tancredi Orlando's avatar
Tancredi Orlando committed
586

Tancredi Orlando's avatar
Tancredi Orlando committed
587
```
Tancredi Orlando's avatar
Tancredi Orlando committed
588
>>> frutta | verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
589
{'porri', 'verze', 'pere', 'zucchine', 'coste', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
590
```
Tancredi Orlando's avatar
Tancredi Orlando committed
591

Tancredi Orlando's avatar
Tancredi Orlando committed
592
```
Tancredi Orlando's avatar
Tancredi Orlando committed
593
594
>>> frutta & verdure
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
595
```
Tancredi Orlando's avatar
Tancredi Orlando committed
596

Tancredi Orlando's avatar
Tancredi Orlando committed
597
```
Tancredi Orlando's avatar
Tancredi Orlando committed
598
>>> frutta - verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
599
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
600
```
Tancredi Orlando's avatar
Tancredi Orlando committed
601

Tancredi Orlando's avatar
Tancredi Orlando committed
602
```
Tancredi Orlando's avatar
Tancredi Orlando committed
603
>>> verdure - frutta
Tancredi Orlando's avatar
Tancredi Orlando committed
604
{'verze', 'coste', 'porri'}
Niccolò Izzo's avatar
Niccolò Izzo committed
605
```
edne's avatar
edne committed
606

edne's avatar
edne committed
607
----
Tancredi Orlando's avatar
Tancredi Orlando committed
608

edne's avatar
edne committed
609
## Dizionari (`dict`)
Tancredi Orlando's avatar
Tancredi Orlando committed
610

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

edne's avatar
edne committed
614
```python
edne's avatar
edne committed
615
d = {
Tancredi Orlando's avatar
Tancredi Orlando committed
616
    "chiave": "valore",
Tancredi Orlando's avatar
Tancredi Orlando committed
617
    "nome":"Tancredi",
Tancredi Orlando's avatar
Tancredi Orlando committed
618
619
    "cognome":"Orlando",
    ('immutable', 'types'): ['are', 'cool']
Tancredi Orlando's avatar
Tancredi Orlando committed
620
621
622
    }
```

Tancredi Orlando's avatar
Tancredi Orlando committed
623
624
Si accede ai campi come si accede agli elementi di una lista, usando la chiave
al posto dell'indice.
edne's avatar
edne committed
625
626
627
628
629
630

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

Tancredi Orlando's avatar
Tancredi Orlando committed
631
632
633
634
635
```
>>> print('these things ' + ' '.join(d[('immutable', 'types')])
these things are cool
```

edne's avatar
edne committed
636
---
Tancredi Orlando's avatar
Tancredi Orlando committed
637

Tancredi Orlando's avatar
Tancredi Orlando committed
638
# Controllo del flusso
edne's avatar
edne committed
639

Tancredi Orlando's avatar
Tancredi Orlando committed
640
641
----

edne's avatar
edne committed
642
## `if`
Tancredi Orlando's avatar
Tancredi Orlando committed
643

Tancredi Orlando's avatar
Tancredi Orlando committed
644
Se una condizione è vera esegue un blocco di codice.
edne's avatar
edne committed
645
646
647
648
649
650

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

Niccolò Izzo's avatar
Niccolò Izzo committed
651
## Blocchi
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
652

Tancredi Orlando's avatar
Tancredi Orlando committed
653
654
- 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
655

edne's avatar
edne committed
656
Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
657
658
Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come
prima.
edne's avatar
edne committed
659

Niccolò Izzo's avatar
Niccolò Izzo committed
660
----
edne's avatar
edne committed
661

edne's avatar
edne committed
662
## `else`
edne's avatar
edne committed
663

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

edne's avatar
edne committed
667
668
669
670
671
672
673
```python
if 3 > 2:
    print('Condizione vera')
else:
    print('Condizione falsa')
```

Tancredi Orlando's avatar
Tancredi Orlando committed
674
675
----

edne's avatar
edne committed
676
## `while`
Tancredi Orlando's avatar
Tancredi Orlando committed
677

Tancredi Orlando's avatar
Tancredi Orlando committed
678
679
680
- Valuta una espressione
- Se è vera esegue un blocco di codice
- Vai al primo punto
edne's avatar
edne committed
681

Tancredi Orlando's avatar
Tancredi Orlando committed
682
```
edne's avatar
edne committed
683
684
>>> x = 0
>>> while x < 3:
Tancredi Orlando's avatar
Tancredi Orlando committed
685
686
...     x = x + 1
...     print("ora x vale", x)
edne's avatar
edne committed
687
688
689
690
691
...
ora x vale 1
ora x vale 2
ora x vale 3
```
Tancredi Orlando's avatar
Tancredi Orlando committed
692

edne's avatar
edne committed
693
----
Tancredi Orlando's avatar
Tancredi Orlando committed
694

edne's avatar
edne committed
695
## `for`
edne's avatar
edne committed
696

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

Tancredi Orlando's avatar
Tancredi Orlando committed
699
700
701
702
```
>>> for i in [0, 1, 2, 3, 4]:
...     print(i)
0 1 2 3 4
edne's avatar
edne committed
703
704
```

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

Tancredi Orlando's avatar
Tancredi Orlando committed
708
709
```
>>> for i in range(0, 5):
Niccolò Izzo's avatar
Niccolò Izzo committed
710
...    print(i)
Tancredi Orlando's avatar
Tancredi Orlando committed
711
0 1 2 3 4
Niccolò Izzo's avatar
Niccolò Izzo committed
712
713
```

edne's avatar
edne committed
714
----
edne's avatar
edne committed
715

Tancredi Orlando's avatar
Tancredi Orlando committed
716
## `break` e `continue`
edne's avatar
edne committed
717

Tancredi Orlando's avatar
Tancredi Orlando committed
718
719
720
721
722
- 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
723

Tancredi Orlando's avatar
Tancredi Orlando committed
724
725
726
727
728
729
730
731
```
>>> 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
732
```
edne's avatar
edne committed
733

edne's avatar
edne committed
734
---
edne's avatar
edne committed
735

edne's avatar
edne committed
736
737
# Funzioni

edne's avatar
edne committed
738
----
edne's avatar
edne committed
739

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
740
- Sono porzioni di codice a cui è assegnato un nome
Tancredi Orlando's avatar
Tancredi Orlando committed
741
742
743
744
- È 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
745

Tancredi Orlando's avatar
Tancredi Orlando committed
746
747
748
749
```
>>> def say_hello():
...     print('Hello world!')
```
edne's avatar
edne committed
750

Tancredi Orlando's avatar
Tancredi Orlando committed
751
752
753
754
755
```
>>> say_hello()  # chiama la funzione
Hello world!
>>> say_hello()  # chiama la funzione nuovamente
Hello world!
edne's avatar
edne committed
756
757
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
758
759
- 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
760

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
761
----
edne's avatar
edne committed
762

Tancredi Orlando's avatar
Tancredi Orlando committed
763
## Parametri
edne's avatar
edne committed
764

Tancredi Orlando's avatar
Tancredi Orlando committed
765
- La funzione può essere "predisposta" per ricevere parametri
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
766
767
768
- 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
769

edne's avatar
edne committed
770
771
----

Tancredi Orlando's avatar
Tancredi Orlando committed
772
## Valore di ritorno
edne's avatar
edne committed
773

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
774
775
776
777
- 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
778

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
779
```
edne's avatar
edne committed
780
>>> def somma(a, b):
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
781
782
783
784
...     return a + b
```

```
edne's avatar
edne committed
785
786
>>> somma(1, 2)
3
edne's avatar
edne committed
787
788
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
789
790
791
792
793
794
795
```
>>> a, b = 3, 14
>>> c = somma(a, b)
>>> c
17
```

Tancredi Orlando's avatar
Tancredi Orlando committed
796
797
----

Tancredi Orlando's avatar
Tancredi Orlando committed
798
## Parametri di default
Tancredi Orlando's avatar
Tancredi Orlando committed
799

Tancredi Orlando's avatar
Tancredi Orlando committed
800
801
- Alcuni parametri possono essere opzionali
- Se non specificati assumono un valore di default
Tancredi Orlando's avatar
Tancredi Orlando committed
802

Tancredi Orlando's avatar
Tancredi Orlando committed
803
```
Tancredi Orlando's avatar
Tancredi Orlando committed
804
805
806
807
808
809
810
811
812
813
814
815
816
817
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
818

edne's avatar
edne committed
819
----
edne's avatar
edne committed
820

Tancredi Orlando's avatar
Tancredi Orlando committed
821
## Scoping
edne's avatar
edne committed
822

edne's avatar
edne committed
823
- Lo scoping determina la **visibilità** delle variabili
Tancredi Orlando's avatar
Tancredi Orlando committed
824
825
826
827
828
- 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
829

edne's avatar
edne committed
830
----
edne's avatar
edne committed
831

Tancredi Orlando's avatar
Tancredi Orlando committed
832
833
834
835
836
```
>>> x = 'globale'
>>> def f():
...     x = 'locale'
```
edne's avatar
edne committed
837

Tancredi Orlando's avatar
Tancredi Orlando committed
838
839
840
841
842
```
>>> f()
>>> print(x)
globale
```
Niccolò Izzo's avatar
Niccolò Izzo committed
843

Tancredi Orlando's avatar
Tancredi Orlando committed
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
- 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
861
862
```

Tancredi Orlando's avatar
Tancredi Orlando committed
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
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
879
880
## None

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
- 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
904

edne's avatar
edne committed
905
---
edne's avatar
Moduli    
edne committed
906
907
908

# Moduli

edne's avatar
edne committed
909
----
edne's avatar
Moduli    
edne committed
910

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
911
912
913
914
- 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
915

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
916
917
918
919
920
921
922
923
924
925
926
927
928
- 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
929

edne's avatar
edne committed
930
----
edne's avatar
Moduli    
edne committed
931

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
932
933
934
935
- È 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
936

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
- 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
962
  ```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
963
964
965
966
967
968
- dalla REPL
  ```
  >>> from modulo import f
  modulo
  >>> f()
  funzione
Tancredi Orlando's avatar
Tancredi Orlando committed
969
  ```
edne's avatar
Moduli    
edne committed
970

edne's avatar
edne committed
971
----
edne's avatar
Moduli    
edne committed
972

edne's avatar
edne committed
973
974
975
È possibile eseguire del codice solo se il file è eseguito direttamente
e non è stato importato come modulo

edne's avatar
Moduli    
edne committed
976
977

if __name__ == '__main__':
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
978
    print('Programma eseguito direttamente')
edne's avatar
Moduli    
edne committed
979
else:
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
980
    print('Questo modulo è stato importato')
edne's avatar
Moduli    
edne committed
981
```
edne's avatar
edne committed
982

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
983
984
985
986
- 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
987
988
989
990
991
992
993
994
995
996
997
998
999
----

- 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
1000
---
edne's avatar
edne committed
1001

edne's avatar
edne committed
1002
1003
1004
1005
# Input e Output

----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1006
1007
1008
- 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
1009

edne's avatar
edne committed
1010
1011
----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1012
## Formattazione dell'output
edne's avatar
edne committed
1013
1014

```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1015
1016
1017
1018
1019
>>> s = 'Corsi {} {}'
>>> s.format('Python', '2017')
'Corsi Python 2017'
>>> s.format('Linux', 'base')
'Corsi Linux base'
edne's avatar
edne committed
1020
1021
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1022
1023
1024
1025
1026
```
>>> s = 'Corsi {argomento} {tipo}'
>>> s.format(tipo='avanzati', argomento='antani')
'Corsi antani avanzati'
```
edne's avatar
edne committed
1027

edne's avatar
edne committed
1028
1029
1030
1031
1032
1033
```
from math import pi
>>> '{:.2f}'.format(pi)
3.14
```

edne's avatar
edne committed
1034
----
edne's avatar
edne committed
1035

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1036
## Input dall'utente
edne's avatar
edne committed
1037

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1038
1039
1040
1041
1042
1043
```
>>> a = input()
asd
>>> a
'asd'
```
edne's avatar
edne committed
1044

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1045
1046
1047
1048
1049
```
>>> nome = input("Inserisci il tuo nome: ")
Gattuso
>>> 'Il tuo nome è {}.'.format(nome)
'Il tuo nonme è Gattuso.'
edne's avatar
edne committed
1050
1051
```

edne's avatar
edne committed
1052
----
edne's avatar
edne committed
1053

Niccolò Izzo's avatar
Niccolò Izzo committed
1054
## Aprire i file
edne's avatar
edne committed
1055

Niccolò Izzo's avatar
Niccolò Izzo committed
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
1098
1099
1100
1101
1102
1103
1104
1105
```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
1106
- Usate `with` quando potete
Niccolò Izzo's avatar
Niccolò Izzo committed
1107
1108
1109
1110
1111

----

## Guardiamoci le spalle

Tancredi Orlando's avatar
Tancredi Orlando committed
1112
1113
1114
- 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
1115
1116
1117
1118
1119
1120
1121

```
>>> 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
1122
1123

- Queste situazioni si chiamano **eccezioni**.
Niccolò Izzo's avatar
Niccolò Izzo committed
1124
1125
1126

----

Tancredi Orlando's avatar
Tancredi Orlando committed
1127
1128
1129
1130
1131
1132
## 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
1133
1134
1135

```
>>> try:
edne's avatar
edne committed
1136
1137
...     with open("documento.txt", "r") as f:
...         print('Do stuff')
Niccolò Izzo's avatar
Niccolò Izzo committed
1138
... except FileNotFoundError:
edne's avatar
edne committed
1139
...     print("Ops")
Niccolò Izzo's avatar
Niccolò Izzo committed
1140
```
Tancredi Orlando's avatar
Tancredi Orlando committed
1141
1142
1143

----

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

Niccolò Izzo's avatar
Niccolò Izzo committed
1147
1148
1149
1150
1151
1152
1153
1154
1155
```
>>> 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
1156
# Nella prossima puntata
Niccolò Izzo's avatar
Niccolò Izzo committed
1157

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

edne's avatar
edne committed
1160
1161
1162
- Classi
- Metodi
- Ereditarietà
edne's avatar
edne committed
1163
1164
1165
- List comprehensions
- Decoratori
- yield
Niccolò Izzo's avatar
Niccolò Izzo committed
1166
1167

----
edne's avatar
edne committed
1168

Tancredi Orlando's avatar
Tancredi Orlando committed
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
```
>>> 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
1186
1187
# Thank you!

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

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