day_1.md 15.8 KB
Newer Older
Tancredi Orlando's avatar
Tancredi Orlando committed
1
2
3
4
5
6
7
8
# Corsi Python 2017

----

Potete ottenere questa presentazione recandovi all'indirizzo:

[slides.poul.org/2017/python](https://slides.poul.org/2017/python)

edne's avatar
edne committed
9
---
Tancredi Orlando's avatar
Tancredi Orlando committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# Perché Python?

- 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
26
    printf("Hello, world!\n");
Tancredi Orlando's avatar
Tancredi Orlando committed
27
28
29
30
31
32
33
34
35
36
37
    return 0;
}
```

----

## Java

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

----

## Python

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

----

![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
63
- Noi useremo Python 3
Tancredi Orlando's avatar
Tancredi Orlando committed
64
65
66
67
68
69
70
71
- Fatelo anche voi

----

## Interpretato vs. compilato

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

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
75
76
77
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
78

edne's avatar
edne committed
79
----
Tancredi Orlando's avatar
Tancredi Orlando committed
80
81
82

## Cosa serve

Tancredi Orlando's avatar
Tancredi Orlando committed
83
84
85
- Per scrivere il codice, un editor di testo:
  - Multipiattaforma: Atom
  - Windows: Notepad++
edne's avatar
edne committed
86
- In quanto linguaggio interpretato, l'interprete Python
Tancredi Orlando's avatar
Tancredi Orlando committed
87
88
89
90
91
  - 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
92
93
---

Tancredi Orlando's avatar
Tancredi Orlando committed
94
# Il linguaggio
edne's avatar
edne committed
95

Tancredi Orlando's avatar
Tancredi Orlando committed
96
97
98
99
100
101
----

## REPL

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

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

edne's avatar
edne committed
111
Per uscire: `quit()`
Tancredi Orlando's avatar
Tancredi Orlando committed
112
113

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
114
115
116
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
117
118
119
120
121

----

## Espressioni

edne's avatar
edne committed
122
```
Tancredi Orlando's avatar
Tancredi Orlando committed
123
124
>>> 2 + 2
4
Tancredi Orlando's avatar
Tancredi Orlando committed
125
```
edne's avatar
edne committed
126

Tancredi Orlando's avatar
Tancredi Orlando committed
127
```
Tancredi Orlando's avatar
Tancredi Orlando committed
128
129
>>> 3 * 3
9
Tancredi Orlando's avatar
Tancredi Orlando committed
130
```
edne's avatar
edne committed
131

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

----

edne's avatar
edne committed
139
140
## Commenti

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

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

edne's avatar
edne committed
148
149
----

Tancredi Orlando's avatar
Tancredi Orlando committed
150
151
## Errori

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

Niccolò Izzo's avatar
Niccolò Izzo committed
159
Il segreto degli hacker? Leggere le scritte!
edne's avatar
edne committed
160

Tancredi Orlando's avatar
Tancredi Orlando committed
161
162
163
164
165
166
([Lettura consigliata](http://www.girodivite.it/Diario-di-un-aspirante-hacker.html))

----

## 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
## Interi (`int`)
edne's avatar
edne committed
210

Tancredi Orlando's avatar
Tancredi Orlando committed
211
Cifre senza punto
Niccolò Izzo's avatar
Niccolò Izzo committed
212

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

----

edne's avatar
edne committed
221
## Decimali (`float`)
edne's avatar
edne committed
222

Tancredi Orlando's avatar
Tancredi Orlando committed
223
Cifre con punto
edne's avatar
edne committed
224
225
226
227

```
>>> 3.14 + 1.234
4.3740000000000006
Tancredi Orlando's avatar
Tancredi Orlando committed
228
```
edne's avatar
edne committed
229

Tancredi Orlando's avatar
Tancredi Orlando committed
230
```
edne's avatar
edne committed
231
232
>>> 100 / 3
33.333333333333336
Tancredi Orlando's avatar
Tancredi Orlando committed
233
```
Tancredi Orlando's avatar
Tancredi Orlando committed
234

Tancredi Orlando's avatar
Tancredi Orlando committed
235
```
edne's avatar
edne committed
236
237
238
>>> 100 // 3
33
```
Tancredi Orlando's avatar
Tancredi Orlando committed
239
240
241

----

edne's avatar
edne committed
242
## Casting
edne's avatar
edne committed
243
244

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

edne's avatar
edne committed
247
248
249
```
>>> int(4.20)
4
Tancredi Orlando's avatar
Tancredi Orlando committed
250
```
edne's avatar
edne committed
251

Tancredi Orlando's avatar
Tancredi Orlando committed
252
```
edne's avatar
edne committed
253
254
255
>>> x = float(13)
>>> x
13.0
Tancredi Orlando's avatar
Tancredi Orlando committed
256
```
edne's avatar
edne committed
257

Tancredi Orlando's avatar
Tancredi Orlando committed
258
```
edne's avatar
edne committed
259
260
261
262
263
>>> type(x)
float
>>> type(13)
int
```
Tancredi Orlando's avatar
Tancredi Orlando committed
264
265
266

----

edne's avatar
edne committed
267
## Booleani (`bool`)
Tancredi Orlando's avatar
Tancredi Orlando committed
268

edne's avatar
edne committed
269
270
271
272
- Possono assumere due valori: `True` o `False`
- Supportano operazioni logiche (`and`, `or`, `not`)
- Sono il risultato delle operazioni di confronto

Tancredi Orlando's avatar
Tancredi Orlando committed
273
274
275
276
277
----

```
>>> 4 < 5
True
Tancredi Orlando's avatar
Tancredi Orlando committed
278
```
Tancredi Orlando's avatar
Tancredi Orlando committed
279

Tancredi Orlando's avatar
Tancredi Orlando committed
280
```
Tancredi Orlando's avatar
Tancredi Orlando committed
281
282
>>> 3.14 < 2
False
Tancredi Orlando's avatar
Tancredi Orlando committed
283
```
Tancredi Orlando's avatar
Tancredi Orlando committed
284

Tancredi Orlando's avatar
Tancredi Orlando committed
285
```
Tancredi Orlando's avatar
Tancredi Orlando committed
286
287
>>> (4 < 5) or (3.14 < 2)
True
Tancredi Orlando's avatar
Tancredi Orlando committed
288
```
Tancredi Orlando's avatar
Tancredi Orlando committed
289

Tancredi Orlando's avatar
Tancredi Orlando committed
290
```
Tancredi Orlando's avatar
Tancredi Orlando committed
291
292
293
294
295
296
>>> (4 < 5) and (3.14 < 2)
False
```

----

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

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

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

edne's avatar
edne committed
313
---
edne's avatar
edne committed
314

edne's avatar
edne committed
315
# Collezioni
Tancredi Orlando's avatar
Tancredi Orlando committed
316
317
318

----

edne's avatar
edne committed
319
## Stringhe (`str`)
Tancredi Orlando's avatar
Tancredi Orlando committed
320

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

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

----

edne's avatar
edne committed
335
## Liste (`list`)
Tancredi Orlando's avatar
Tancredi Orlando committed
336

Tancredi Orlando's avatar
Tancredi Orlando committed
337
338
339
- 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
340

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

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
354
355
356
357
358
359
360
----

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

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

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

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

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

```
Tancredi Orlando's avatar
Tancredi Orlando committed
387
388
>>> len(lista)
6
Tancredi Orlando's avatar
Tancredi Orlando committed
389
390
```

edne's avatar
edne committed
391
----
edne's avatar
edne committed
392

Tancredi Orlando's avatar
Tancredi Orlando committed
393
394
395
396
397
398
399
400
401
402
403
404
### 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
405
>>> lista[2:5]
Tancredi Orlando's avatar
Tancredi Orlando committed
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
['due', 3.0, 4]
```

- È 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']
```

----

Tancredi Orlando's avatar
Tancredi Orlando committed
421
### Unpacking
edne's avatar
edne committed
422

Tancredi Orlando's avatar
Tancredi Orlando committed
423
Estrarre valori da un contenitore
edne's avatar
edne committed
424
425
426

```
>>> t = (1, 2)
Tancredi Orlando's avatar
Tancredi Orlando committed
427
```
Tancredi Orlando's avatar
Tancredi Orlando committed
428

Tancredi Orlando's avatar
Tancredi Orlando committed
429
```
edne's avatar
edne committed
430
431
432
>>> a, b = t
>>> b
2
Tancredi Orlando's avatar
Tancredi Orlando committed
433
```
edne's avatar
edne committed
434

Tancredi Orlando's avatar
Tancredi Orlando committed
435
```
edne's avatar
edne committed
436
>>> a, b = b, a
Tancredi Orlando's avatar
Tancredi Orlando committed
437
438
>>> a
2
Tancredi Orlando's avatar
Tancredi Orlando committed
439
```
Tancredi Orlando's avatar
Tancredi Orlando committed
440

Tancredi Orlando's avatar
Tancredi Orlando committed
441
```
Tancredi Orlando's avatar
Tancredi Orlando committed
442
443
>>> c, _ = t
>>> c
edne's avatar
edne committed
444
445
446
1
```

Tancredi Orlando's avatar
Tancredi Orlando committed
447
448
----

Tancredi Orlando's avatar
Tancredi Orlando committed
449
### L'operatore `in`
edne's avatar
edne committed
450

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

edne's avatar
edne committed
453
454
455
456
457
```
>>> lista = ['a', 'b', 'c']
>>> 'c' in lista
True
```
Tancredi Orlando's avatar
Tancredi Orlando committed
458

Niccolò Izzo's avatar
Niccolò Izzo committed
459
460
461
462
463
464
465
466
- È un'espressione booleana
- Si può usare con l'operatore `not`

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

edne's avatar
edne committed
468
469
----

Tancredi Orlando's avatar
Tancredi Orlando committed
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
## 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
496
497
## Riferimenti

Tancredi Orlando's avatar
Tancredi Orlando committed
498
499
- Quando assegniamo un oggetto ad una variabile, la variabile contiene solo un
  *riferimento* all'oggetto
edne's avatar
edne committed
500
501
- **Non** l'oggetto stesso.

Tancredi Orlando's avatar
Tancredi Orlando committed
502
```
edne's avatar
edne committed
503
>>> spesa_a = ['mela', 'mango']
Tancredi Orlando's avatar
Tancredi Orlando committed
504
```
Tancredi Orlando's avatar
Tancredi Orlando committed
505

Tancredi Orlando's avatar
Tancredi Orlando committed
506
```
edne's avatar
edne committed
507
508
>>> spesa_b = spesa_a
>>> spesa_b.append('carota')
Tancredi Orlando's avatar
Tancredi Orlando committed
509
510
511
>>> spesa_b
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
512

Tancredi Orlando's avatar
Tancredi Orlando committed
513
```
edne's avatar
edne committed
514
515
516
>>> spesa_a
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
517
518
519

----

edne's avatar
edne committed
520
## Insiemi (`set`)
Tancredi Orlando's avatar
Tancredi Orlando committed
521

Niccolò Izzo's avatar
Niccolò Izzo committed
522
- Come gli insiemi matematici
Tancredi Orlando's avatar
Tancredi Orlando committed
523
- **Non sono ordinati**
Tancredi Orlando's avatar
Tancredi Orlando committed
524
525
- Non contengono elementi duplicati

Tancredi Orlando's avatar
Tancredi Orlando committed
526
527
```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
Niccolò Izzo's avatar
Niccolò Izzo committed
528
>>> frutta
edne's avatar
edne committed
529
{'mele', 'arance', 'pere'}
Tancredi Orlando's avatar
Tancredi Orlando committed
530
531
```

Tancredi Orlando's avatar
Tancredi Orlando committed
532
----
Niccolò Izzo's avatar
Niccolò Izzo committed
533

Tancredi Orlando's avatar
Tancredi Orlando committed
534
535
536
537
Supportano le operazioni insiemistiche

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

Tancredi Orlando's avatar
Tancredi Orlando committed
541
```
Tancredi Orlando's avatar
Tancredi Orlando committed
542
543
>>> frutta.union(verdure)
{'porri', 'verze', 'pere', 'zucchine', 'coste', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
544
```
Tancredi Orlando's avatar
Tancredi Orlando committed
545

Tancredi Orlando's avatar
Tancredi Orlando committed
546
```
Niccolò Izzo's avatar
Niccolò Izzo committed
547
548
>>> frutta.intersection(verdure)
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
549
```
Tancredi Orlando's avatar
Tancredi Orlando committed
550

Tancredi Orlando's avatar
Tancredi Orlando committed
551
```
Tancredi Orlando's avatar
Tancredi Orlando committed
552
553
>>> frutta.difference(verdure)
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
554
```
Tancredi Orlando's avatar
Tancredi Orlando committed
555

Tancredi Orlando's avatar
Tancredi Orlando committed
556
```
Tancredi Orlando's avatar
Tancredi Orlando committed
557
558
559
560
561
562
563
564
565
566
567
>>> 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
568
```
Tancredi Orlando's avatar
Tancredi Orlando committed
569

Tancredi Orlando's avatar
Tancredi Orlando committed
570
```
Tancredi Orlando's avatar
Tancredi Orlando committed
571
>>> frutta | verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
572
{'porri', 'verze', 'pere', 'zucchine', 'coste', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
573
```
Tancredi Orlando's avatar
Tancredi Orlando committed
574

Tancredi Orlando's avatar
Tancredi Orlando committed
575
```
Tancredi Orlando's avatar
Tancredi Orlando committed
576
577
>>> frutta & verdure
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
578
```
Tancredi Orlando's avatar
Tancredi Orlando committed
579

Tancredi Orlando's avatar
Tancredi Orlando committed
580
```
Tancredi Orlando's avatar
Tancredi Orlando committed
581
>>> frutta - verdure
Tancredi Orlando's avatar
Tancredi Orlando committed
582
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
583
```
Tancredi Orlando's avatar
Tancredi Orlando committed
584

Tancredi Orlando's avatar
Tancredi Orlando committed
585
```
Tancredi Orlando's avatar
Tancredi Orlando committed
586
>>> verdure - frutta
Tancredi Orlando's avatar
Tancredi Orlando committed
587
{'verze', 'coste', 'porri'}
Niccolò Izzo's avatar
Niccolò Izzo committed
588
```
edne's avatar
edne committed
589

edne's avatar
edne committed
590
----
Tancredi Orlando's avatar
Tancredi Orlando committed
591

edne's avatar
edne committed
592
## Dizionari (`dict`)
Tancredi Orlando's avatar
Tancredi Orlando committed
593

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

edne's avatar
edne committed
597
```python
edne's avatar
edne committed
598
d = {
Tancredi Orlando's avatar
Tancredi Orlando committed
599
    "chiave": "valore",
Tancredi Orlando's avatar
Tancredi Orlando committed
600
    "nome":"Tancredi",
Tancredi Orlando's avatar
Tancredi Orlando committed
601
602
    "cognome":"Orlando",
    ('immutable', 'types'): ['are', 'cool']
Tancredi Orlando's avatar
Tancredi Orlando committed
603
604
605
    }
```

Tancredi Orlando's avatar
Tancredi Orlando committed
606
607
Si accede ai campi come si accede agli elementi di una lista, usando la chiave
al posto dell'indice.
edne's avatar
edne committed
608
609
610
611
612
613

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

Tancredi Orlando's avatar
Tancredi Orlando committed
614
615
616
617
618
```
>>> print('these things ' + ' '.join(d[('immutable', 'types')])
these things are cool
```

edne's avatar
edne committed
619
---
Tancredi Orlando's avatar
Tancredi Orlando committed
620

Tancredi Orlando's avatar
Tancredi Orlando committed
621
# Controllo del flusso
edne's avatar
edne committed
622

Tancredi Orlando's avatar
Tancredi Orlando committed
623
624
----

edne's avatar
edne committed
625
## `if`
Tancredi Orlando's avatar
Tancredi Orlando committed
626

Tancredi Orlando's avatar
Tancredi Orlando committed
627
Se una condizione è vera esegue un blocco di codice.
edne's avatar
edne committed
628
629
630
631
632
633

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

Niccolò Izzo's avatar
Niccolò Izzo committed
634
## Blocchi
Tancredi Orlando's avatar
Tancredi Orlando committed
635
636
- 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
637

edne's avatar
edne committed
638
Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
639
640
Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come
prima.
edne's avatar
edne committed
641

Niccolò Izzo's avatar
Niccolò Izzo committed
642
----
edne's avatar
edne committed
643

edne's avatar
edne committed
644
## `else`
edne's avatar
edne committed
645

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

edne's avatar
edne committed
649
650
651
652
653
654
655
```python
if 3 > 2:
    print('Condizione vera')
else:
    print('Condizione falsa')
```

Tancredi Orlando's avatar
Tancredi Orlando committed
656
657
----

edne's avatar
edne committed
658
## `while`
Tancredi Orlando's avatar
Tancredi Orlando committed
659

Tancredi Orlando's avatar
Tancredi Orlando committed
660
661
662
- Valuta una espressione
- Se è vera esegue un blocco di codice
- Vai al primo punto
edne's avatar
edne committed
663

Tancredi Orlando's avatar
Tancredi Orlando committed
664
```
edne's avatar
edne committed
665
666
>>> x = 0
>>> while x < 3:
Tancredi Orlando's avatar
Tancredi Orlando committed
667
668
...     x = x + 1
...     print("ora x vale", x)
edne's avatar
edne committed
669
670
671
672
673
...
ora x vale 1
ora x vale 2
ora x vale 3
```
Tancredi Orlando's avatar
Tancredi Orlando committed
674

edne's avatar
edne committed
675
----
Tancredi Orlando's avatar
Tancredi Orlando committed
676

edne's avatar
edne committed
677
## `for`
edne's avatar
edne committed
678

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

Tancredi Orlando's avatar
Tancredi Orlando committed
681
682
683
684
```
>>> for i in [0, 1, 2, 3, 4]:
...     print(i)
0 1 2 3 4
edne's avatar
edne committed
685
686
```

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

Tancredi Orlando's avatar
Tancredi Orlando committed
690
691
```
>>> for i in range(0, 5):
Niccolò Izzo's avatar
Niccolò Izzo committed
692
...    print(i)
Tancredi Orlando's avatar
Tancredi Orlando committed
693
0 1 2 3 4
Niccolò Izzo's avatar
Niccolò Izzo committed
694
695
```

edne's avatar
edne committed
696
----
edne's avatar
edne committed
697

Tancredi Orlando's avatar
Tancredi Orlando committed
698
## `break` e `continue`
edne's avatar
edne committed
699

Tancredi Orlando's avatar
Tancredi Orlando committed
700
701
702
703
704
- 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
705

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

edne's avatar
edne committed
716
---
edne's avatar
edne committed
717

edne's avatar
edne committed
718
719
# Funzioni

edne's avatar
edne committed
720
----
edne's avatar
edne committed
721

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
722
- Sono porzioni di codice a cui è assegnato un nome
Tancredi Orlando's avatar
Tancredi Orlando committed
723
724
725
726
- È 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
727

Tancredi Orlando's avatar
Tancredi Orlando committed
728
729
730
731
```
>>> def say_hello():
...     print('Hello world!')
```
edne's avatar
edne committed
732

Tancredi Orlando's avatar
Tancredi Orlando committed
733
734
735
736
737
```
>>> say_hello()  # chiama la funzione
Hello world!
>>> say_hello()  # chiama la funzione nuovamente
Hello world!
edne's avatar
edne committed
738
739
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
740
741
- 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
742

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
743
----
edne's avatar
edne committed
744

Tancredi Orlando's avatar
Tancredi Orlando committed
745
## Parametri
edne's avatar
edne committed
746

Tancredi Orlando's avatar
Tancredi Orlando committed
747
- La funzione può essere "predisposta" per ricevere parametri
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
748
749
750
- 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
751

Tancredi Orlando's avatar
Tancredi Orlando committed
752
## Valore di ritorno
edne's avatar
edne committed
753

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
754
755
756
757
- 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
758

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
759
----
edne's avatar
edne committed
760

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
761
```
edne's avatar
edne committed
762
>>> def somma(a, b):
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
763
764
765
766
...     return a + b
```

```
edne's avatar
edne committed
767
768
>>> somma(1, 2)
3
edne's avatar
edne committed
769
770
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
771
772
773
774
775
776
777
```
>>> a, b = 3, 14
>>> c = somma(a, b)
>>> c
17
```

Tancredi Orlando's avatar
Tancredi Orlando committed
778
779
----

Tancredi Orlando's avatar
Tancredi Orlando committed
780
## Parametri di default
Tancredi Orlando's avatar
Tancredi Orlando committed
781

Tancredi Orlando's avatar
Tancredi Orlando committed
782
783
- Alcuni parametri possono essere opzionali
- Se non specificati assumono un valore di default
Tancredi Orlando's avatar
Tancredi Orlando committed
784

Tancredi Orlando's avatar
Tancredi Orlando committed
785
```
Tancredi Orlando's avatar
Tancredi Orlando committed
786
787
788
789
790
791
792
793
794
795
796
797
798
799
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
800

edne's avatar
edne committed
801
----
edne's avatar
edne committed
802

Tancredi Orlando's avatar
Tancredi Orlando committed
803
## Scoping
edne's avatar
edne committed
804

Tancredi Orlando's avatar
Tancredi Orlando committed
805
806
807
808
809
810
- Lo scoping modifica 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
edne's avatar
edne committed
811

edne's avatar
edne committed
812
----
edne's avatar
edne committed
813

Tancredi Orlando's avatar
Tancredi Orlando committed
814
815
816
817
818
```
>>> x = 'globale'
>>> def f():
...     x = 'locale'
```
edne's avatar
edne committed
819

Tancredi Orlando's avatar
Tancredi Orlando committed
820
821
822
823
824
```
>>> f()
>>> print(x)
globale
```
Niccolò Izzo's avatar
Niccolò Izzo committed
825

Tancredi Orlando's avatar
Tancredi Orlando committed
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
- 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
843
844
```

Tancredi Orlando's avatar
Tancredi Orlando committed
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
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.

----

### Evadere dallo scope

È tuttavia possibile accedere in scrittura a una variabile globale,
specificandolo esplicitamente con l'istruzione **`global`**.

```
>>> x = 'globale'
>>> def f():
...    global x
...    print(x)
...    x = 'variabile ' + x
...    print(x)
>>> f()
globale
variabile globale
```
edne's avatar
edne committed
877

edne's avatar
edne committed
878
----
edne's avatar
edne committed
879

edne's avatar
edne committed
880

edne's avatar
edne committed
881
882
883
## None

- Equivale al `NULL` di C o Java
Niccolò Izzo's avatar
Niccolò Izzo committed
884
- Valore restituito quando il `return` viene omesso
edne's avatar
edne committed
885

edne's avatar
edne committed
886
---
edne's avatar
Moduli    
edne committed
887
888
889

# Moduli

edne's avatar
edne committed
890
----
edne's avatar
Moduli    
edne committed
891
892
893

## Moduli

Niccolò Izzo's avatar
Niccolò Izzo committed
894
895
896
897
- Riutilizzare codice di altri programmi (o librerie)
- Suddividere un programma complesso in piccoli pezzi
- Sono file con estensione `.py`
- Un modulo può essere importato con la keyword `import`
edne's avatar
Moduli    
edne committed
898
899
900
901
902
903
904
905
 
 
```python
>>> import math
>>> math.sqrt(16)
4.0
```

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

## `from ... import`
edne's avatar
edne committed
909

edne's avatar
Moduli    
edne committed
910
Permette di importare solo alcune funzioni
edne's avatar
edne committed
911

edne's avatar
Moduli    
edne committed
912
```python
edne's avatar
edne committed
913
>>> from math import sqrt
edne's avatar
Moduli    
edne committed
914
915
916
917
>>> sqrt(16)
4.0
```

edne's avatar
edne committed
918
----
edne's avatar
Moduli    
edne committed
919
920
921
922
923
924
925
926
927
928
929
930
931

## La variabile `__name__`

- Contiene il nome del modulo

- Modulo importato o eseguito direttamente?

```python
if __name__ == '__main__':
	print('Programma eseguito direttamente')
else:
	print('Questo modulo è stato importato')
```
edne's avatar
edne committed
932

edne's avatar
edne committed
933
---
edne's avatar
edne committed
934

edne's avatar
edne committed
935
936
937
938
# Input e Output

----

edne's avatar
edne committed
939
## I/O
edne's avatar
edne committed
940

Niccolò Izzo's avatar
Niccolò Izzo committed
941
- A volte può essere utile interagire con l'utente
edne's avatar
edne committed
942
943
944
945
946
947
948
- Per esempio chiedere valori in ingresso e stampare risultati
- Useremo `input()` per ricevere dei valori e `print()` per stamparli.

```python
nome = input("Inserisci il tuo nome: ")
print("Il tuo nome è", nome)
```
edne's avatar
edne committed
949

edne's avatar
edne committed
950
951
----

edne's avatar
edne committed
952
953
954
955
956
957
958
959
960
961
962
963
## Formattazione dell'Output

- Per formattare l'output spesso `print()` da sola non è sufficiente.

- Possiamo usare i metodi della classe `str` e in particolare `str.format()`

```python
>>> s = 'This {food} is {adjective}.'.format(
... 	food='spam', adjective='horrible')
>>> print(s)
This spam is horrible
```
edne's avatar
edne committed
964

edne's avatar
edne committed
965
---
edne's avatar
edne committed
966

edne's avatar
edne committed
967
968
# Errori ed Eccezioni

edne's avatar
edne committed
969
----
edne's avatar
edne committed
970
971
972
973
974
975
976
977
978
979
980
981
982
983

## Errori di Sintassi

```python
>>> while return print('Hello?') # ??????
SyntaxError: invalid syntax
```

- Sono i più comuni da commettere per chi sta imparando Python :-)

- Accadono quando scriviamo una istruzione in maniera *sintatticamente* errata

- L'interprete Python non riesce a capirne il significato e quindi non può eseguirla

edne's avatar
edne committed
984
----
edne's avatar
edne committed
985
986

## Eccezioni
edne's avatar
edne committed
987

edne's avatar
edne committed
988
- Rappresentano il verificarsi di situazioni *eccezionali*
edne's avatar
edne committed
989

edne's avatar
edne committed
990
991
- Cosa succede se stiamo tentando di leggere un file che non esiste? O se
  cerchiamo di dividere per zero?
edne's avatar
edne committed
992

edne's avatar
edne committed
993
----
edne's avatar
edne committed
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005

## Gestire le Eccezioni

- Possiamo (e dovremmo) gestire le eccezioni racchiudendo le nostre istruzioni in un blocco `try/except`

```python
try:
	x = int(input('Inserisci un intero: '))
except ValueError:
	print('Oops! Non era un intero.')
```

edne's avatar
edne committed
1006
----
edne's avatar
edne committed
1007
1008
1009
1010
1011
1012
1013

## Sollevare Eccezioni

- In alcuni casi può essere utile sollevare delle eccezioni

- Per esempio quando una funzione non è in grado di gestire alcuni input

Niccolò Izzo's avatar
Niccolò Izzo committed
1014
1015
- Dovranno essere gestite (catturate) dal chiamante della funzione,
altrimenti l'utente vedrà un messaggio di errore
edne's avatar
edne committed
1016
1017
1018
1019
1020
1021
1022

```python
def mandaEmail(email, testo):
	if not '@' in email:
		raise ValueError("email non valida")
	# [..]
```
edne's avatar
edne committed
1023

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

# The End

edne's avatar
edne committed
1028
----
edne's avatar
edne committed
1029
1030
1031
1032
1033

# Thank you!

Queste slides sono sotto licenza Creative Commons<br>
Attribution-ShareAlike 3.0 Unported
Tancredi Orlando's avatar
Tancredi Orlando committed
1034

Niccolò Izzo's avatar
Niccolò Izzo committed
1035
## [poul.org](https://www.poul.org)