day_1.md 13.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
### Unpacking
edne's avatar
edne committed
394

Tancredi Orlando's avatar
Tancredi Orlando committed
395
Estrarre valori da un contenitore
edne's avatar
edne committed
396
397
398

```
>>> t = (1, 2)
Tancredi Orlando's avatar
Tancredi Orlando committed
399
```
Tancredi Orlando's avatar
Tancredi Orlando committed
400

Tancredi Orlando's avatar
Tancredi Orlando committed
401
```
edne's avatar
edne committed
402
403
404
>>> a, b = t
>>> b
2
Tancredi Orlando's avatar
Tancredi Orlando committed
405
```
edne's avatar
edne committed
406

Tancredi Orlando's avatar
Tancredi Orlando committed
407
```
edne's avatar
edne committed
408
>>> a, b = b, a
Tancredi Orlando's avatar
Tancredi Orlando committed
409
410
>>> a
2
Tancredi Orlando's avatar
Tancredi Orlando committed
411
```
Tancredi Orlando's avatar
Tancredi Orlando committed
412

Tancredi Orlando's avatar
Tancredi Orlando committed
413
```
Tancredi Orlando's avatar
Tancredi Orlando committed
414
415
>>> c, _ = t
>>> c
edne's avatar
edne committed
416
417
418
1
```

Tancredi Orlando's avatar
Tancredi Orlando committed
419
420
----

Tancredi Orlando's avatar
Tancredi Orlando committed
421
### L'operatore `in`
edne's avatar
edne committed
422

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

edne's avatar
edne committed
425
426
427
428
429
```
>>> lista = ['a', 'b', 'c']
>>> 'c' in lista
True
```
Tancredi Orlando's avatar
Tancredi Orlando committed
430

Niccolò Izzo's avatar
Niccolò Izzo committed
431
432
433
434
435
436
437
438
- È un'espressione booleana
- Si può usare con l'operatore `not`

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

edne's avatar
edne committed
440
441
----

Tancredi Orlando's avatar
Tancredi Orlando committed
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
## 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
468
469
## Riferimenti

Tancredi Orlando's avatar
Tancredi Orlando committed
470
471
- Quando assegniamo un oggetto ad una variabile, la variabile contiene solo un
  *riferimento* all'oggetto
edne's avatar
edne committed
472
473
- **Non** l'oggetto stesso.

Tancredi Orlando's avatar
Tancredi Orlando committed
474
```
edne's avatar
edne committed
475
>>> spesa_a = ['mela', 'mango']
Tancredi Orlando's avatar
Tancredi Orlando committed
476
```
Tancredi Orlando's avatar
Tancredi Orlando committed
477

Tancredi Orlando's avatar
Tancredi Orlando committed
478
```
edne's avatar
edne committed
479
480
>>> spesa_b = spesa_a
>>> spesa_b.append('carota')
Tancredi Orlando's avatar
Tancredi Orlando committed
481
482
483
>>> spesa_b
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
484

Tancredi Orlando's avatar
Tancredi Orlando committed
485
```
edne's avatar
edne committed
486
487
488
>>> spesa_a
['mela', 'mango', 'carota']
```
edne's avatar
edne committed
489
490
491

----

edne's avatar
edne committed
492
## Insiemi (`set`)
Tancredi Orlando's avatar
Tancredi Orlando committed
493

Niccolò Izzo's avatar
Niccolò Izzo committed
494
- Come gli insiemi matematici
Tancredi Orlando's avatar
Tancredi Orlando committed
495
- **Non sono ordinati**
Tancredi Orlando's avatar
Tancredi Orlando committed
496
497
- Non contengono elementi duplicati

Tancredi Orlando's avatar
Tancredi Orlando committed
498
499
```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
Niccolò Izzo's avatar
Niccolò Izzo committed
500
>>> frutta
edne's avatar
edne committed
501
{'mele', 'arance', 'pere'}
Tancredi Orlando's avatar
Tancredi Orlando committed
502
503
```

Tancredi Orlando's avatar
Tancredi Orlando committed
504
----
Niccolò Izzo's avatar
Niccolò Izzo committed
505

Tancredi Orlando's avatar
Tancredi Orlando committed
506
507
508
509
Supportano le operazioni insiemistiche

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

Tancredi Orlando's avatar
Tancredi Orlando committed
513
```
Tancredi Orlando's avatar
Tancredi Orlando committed
514
515
>>> frutta.union(verdure)
{'porri', 'verze', 'pere', 'zucchine', 'coste', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
516
```
Tancredi Orlando's avatar
Tancredi Orlando committed
517

Tancredi Orlando's avatar
Tancredi Orlando committed
518
```
Niccolò Izzo's avatar
Niccolò Izzo committed
519
520
>>> frutta.intersection(verdure)
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
521
```
Tancredi Orlando's avatar
Tancredi Orlando committed
522

Tancredi Orlando's avatar
Tancredi Orlando committed
523
```
Tancredi Orlando's avatar
Tancredi Orlando committed
524
525
>>> frutta.difference(verdure)
{'pere', 'mele'}
Tancredi Orlando's avatar
Tancredi Orlando committed
526
```
Tancredi Orlando's avatar
Tancredi Orlando committed
527

Tancredi Orlando's avatar
Tancredi Orlando committed
528
```
Tancredi Orlando's avatar
Tancredi Orlando committed
529
530
531
532
533
534
535
536
537
538
539
>>> 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
540
```
Tancredi Orlando's avatar
Tancredi Orlando committed
541

Tancredi Orlando's avatar
Tancredi Orlando committed
542
```
Tancredi Orlando's avatar
Tancredi Orlando committed
543
544
>>> frutta | verdure
{'coste', 'verze', 'mele', 'pere', 'porri', 'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
545
```
Tancredi Orlando's avatar
Tancredi Orlando committed
546

Tancredi Orlando's avatar
Tancredi Orlando committed
547
```
Tancredi Orlando's avatar
Tancredi Orlando committed
548
549
>>> frutta & verdure
{'zucchine'}
Tancredi Orlando's avatar
Tancredi Orlando committed
550
```
Tancredi Orlando's avatar
Tancredi Orlando committed
551

Tancredi Orlando's avatar
Tancredi Orlando committed
552
```
Tancredi Orlando's avatar
Tancredi Orlando committed
553
554
>>> frutta - verdure
{'mele', 'pere'}
Tancredi Orlando's avatar
Tancredi Orlando committed
555
```
Tancredi Orlando's avatar
Tancredi Orlando committed
556

Tancredi Orlando's avatar
Tancredi Orlando committed
557
```
Tancredi Orlando's avatar
Tancredi Orlando committed
558
559
>>> verdure - frutta
{'coste', 'verze', 'porri'}
Niccolò Izzo's avatar
Niccolò Izzo committed
560
```
edne's avatar
edne committed
561

edne's avatar
edne committed
562
----
Tancredi Orlando's avatar
Tancredi Orlando committed
563

edne's avatar
edne committed
564
## Dizionari (`dict`)
Tancredi Orlando's avatar
Tancredi Orlando committed
565

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

edne's avatar
edne committed
569
```python
edne's avatar
edne committed
570
d = {
Tancredi Orlando's avatar
Tancredi Orlando committed
571
    "chiave": "valore",
Tancredi Orlando's avatar
Tancredi Orlando committed
572
    "nome":"Tancredi",
Tancredi Orlando's avatar
Tancredi Orlando committed
573
574
    "cognome":"Orlando",
    ('immutable', 'types'): ['are', 'cool']
Tancredi Orlando's avatar
Tancredi Orlando committed
575
576
577
    }
```

Tancredi Orlando's avatar
Tancredi Orlando committed
578
579
Si accede ai campi come si accede agli elementi di una lista, usando la chiave
al posto dell'indice.
edne's avatar
edne committed
580
581
582
583
584
585

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

Tancredi Orlando's avatar
Tancredi Orlando committed
586
587
588
589
590
```
>>> print('these things ' + ' '.join(d[('immutable', 'types')])
these things are cool
```

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

Tancredi Orlando's avatar
Tancredi Orlando committed
593
# Controllo del flusso
edne's avatar
edne committed
594

Tancredi Orlando's avatar
Tancredi Orlando committed
595
596
----

edne's avatar
edne committed
597
## `if`
Tancredi Orlando's avatar
Tancredi Orlando committed
598

Tancredi Orlando's avatar
Tancredi Orlando committed
599
Se una condizione è vera esegue un blocco di codice.
edne's avatar
edne committed
600
601
602
603
604
605

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

Niccolò Izzo's avatar
Niccolò Izzo committed
606
## Blocchi
Tancredi Orlando's avatar
Tancredi Orlando committed
607
608
- 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
609

edne's avatar
edne committed
610
Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
611
612
Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come
prima.
edne's avatar
edne committed
613

Niccolò Izzo's avatar
Niccolò Izzo committed
614
----
edne's avatar
edne committed
615

edne's avatar
edne committed
616
## `else`
edne's avatar
edne committed
617

edne's avatar
edne committed
618
- Il secondo blocco viene eseguito solo se la condizione risulta falsa
Niccolò Izzo's avatar
Niccolò Izzo committed
619

edne's avatar
edne committed
620
621
622
623
624
625
626
```python
if 3 > 2:
    print('Condizione vera')
else:
    print('Condizione falsa')
```

Tancredi Orlando's avatar
Tancredi Orlando committed
627
628
----

edne's avatar
edne committed
629
## `while`
Tancredi Orlando's avatar
Tancredi Orlando committed
630

Niccolò Izzo's avatar
Niccolò Izzo committed
631
632
- Esegue più volte le stesse istruzioni
- Fintantoché una condizione rimane vera
edne's avatar
edne committed
633
634
635
636
637
638
639
640
641
642
643

```python
>>> x = 0
>>> while x < 3:
... 	x = x + 1
... 	print("ora x vale", x)
...
ora x vale 1
ora x vale 2
ora x vale 3
```
Tancredi Orlando's avatar
Tancredi Orlando committed
644

edne's avatar
edne committed
645
----
Tancredi Orlando's avatar
Tancredi Orlando committed
646

edne's avatar
edne committed
647
## `for`
edne's avatar
edne committed
648

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

edne's avatar
edne committed
651
652
```python
for i in [0, 1, 2, 3, 4]:
Niccolò Izzo's avatar
Niccolò Izzo committed
653
	print(i)
edne's avatar
edne committed
654
655
```

Niccolò Izzo's avatar
Niccolò Izzo committed
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
- Si può creare al volo una sequenza fornendo gli estremi

```python
>>> for i in range(0,4):
...    print(i)
... 
0
1
2
3
```

Notes:
Dire che il secondo estremo non è compreso e come mai è così.

edne's avatar
edne committed
671
----
edne's avatar
edne committed
672
673
674
675
676
677
678
679
680
681
682
683
684
685

## `break`, `continue`

* `break`: interrompe l'iterazione
* `continue`: salta all'iterazione successiva

```python
for i in [0, 1, 2, 3, 4, 5, 6, 7]:
	if i == 2:
		continue
	if i == 6:
		break
	print(i)
```
edne's avatar
edne committed
686

edne's avatar
edne committed
687
---
edne's avatar
edne committed
688

edne's avatar
edne committed
689
690
# Funzioni

edne's avatar
edne committed
691
----
edne's avatar
edne committed
692
693
694

## Funzioni

edne's avatar
edne committed
695
696
697
- Porzioni riusabili di un programma
- Il concetto più importante per costruire un programma
- Ci permettono di dare un nome a un blocco di istruzioni
Niccolò Izzo's avatar
Niccolò Izzo committed
698
- E di eseguirle quando vogliamo, "chiamando" la funzione
edne's avatar
edne committed
699
- Si definiscono con la keyword `def`
edne's avatar
edne committed
700

edne's avatar
edne committed
701
----
edne's avatar
edne committed
702
703
704
705
706
707

## Esempio

```python
def say_hello():
	print('hello world')
edne's avatar
edne committed
708
	
edne's avatar
edne committed
709

edne's avatar
edne committed
710
711
say_hello()  # chiama la funzione
say_hello()  # chiama la funzione di nuovo
edne's avatar
edne committed
712
713
```

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

## Parametri e Argomenti

Niccolò Izzo's avatar
Niccolò Izzo committed
718
719
- Le funzioni possono specificare dei "parametri"
- Se si chiama la funzione, bisogna assegnargli dei valori
edne's avatar
edne committed
720
721
- I valori che vengono passati durante la chiamata sono detti "argomenti"

edne's avatar
edne committed
722
723
724
----

## Lo statement `return`
edne's avatar
edne committed
725

edne's avatar
edne committed
726
727
728
729
730
731
732
733
Tramite il `return` la funzione ci dà un risultato

```python
>>> def somma(a, b):
... 	return a + b
...
>>> somma(1, 2)
3
edne's avatar
edne committed
734
735
```

edne's avatar
edne committed
736
737
738
739
Notes:
- è importante che venga visto il `return` il prima possibile
- spiegare comunque la differenza tra restituire un valore e fare una `print`

edne's avatar
edne committed
740
----
edne's avatar
edne committed
741
742
743
744
745
746

## Variabili locali

- Le variabili definite dentro una funzione sono **locali**
- Non sono correlate con variabili dello stesso nome, definite fuori

edne's avatar
edne committed
747
----
edne's avatar
edne committed
748

edne's avatar
edne committed
749
## Lo statement `global`
edne's avatar
edne committed
750
751

- Permette di definire una variabile globale all'intero di una funzione
Niccolò Izzo's avatar
Niccolò Izzo committed
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
- Unico modo per modificare una variabile definita fuori dalla funzione

```python
>>> x = 3
>>> def increment_x():
...     global x
...     x = x + 1
...
>>> increment_x()
>>> x
4
```

Notes:
Accennare alle virtù della programmazione priva di side effects.
edne's avatar
edne committed
767

edne's avatar
edne committed
768
----
edne's avatar
edne committed
769

edne's avatar
edne committed
770
771
772

### Argomenti di default

Niccolò Izzo's avatar
Niccolò Izzo committed
773
774
- Alcuni parametri possono essere resi opzionali
- Si fa assegnando ai parametri dei valori di default
edne's avatar
edne committed
775
776
777
- Se omettiamo l'argomento, la funzione userà quello di default


edne's avatar
edne committed
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
```python
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
794
795
----

edne's avatar
edne committed
796
797
798
## None

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

edne's avatar
edne committed
801
---
edne's avatar
Moduli    
edne committed
802
803
804

# Moduli

edne's avatar
edne committed
805
----
edne's avatar
Moduli    
edne committed
806
807
808

## Moduli

Niccolò Izzo's avatar
Niccolò Izzo committed
809
810
811
812
- 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
813
814
815
816
817
818
819
820
 
 
```python
>>> import math
>>> math.sqrt(16)
4.0
```

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

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

edne's avatar
Moduli    
edne committed
825
Permette di importare solo alcune funzioni
edne's avatar
edne committed
826

edne's avatar
Moduli    
edne committed
827
```python
Niccolò Izzo's avatar
Niccolò Izzo committed
828
>>> from math import s3qrt
edne's avatar
Moduli    
edne committed
829
830
831
832
>>> sqrt(16)
4.0
```

edne's avatar
edne committed
833
----
edne's avatar
Moduli    
edne committed
834
835
836
837
838
839
840
841
842
843
844
845
846

## 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
847

edne's avatar
edne committed
848
---
edne's avatar
edne committed
849

edne's avatar
edne committed
850
851
852
853
# Input e Output

----

edne's avatar
edne committed
854
## I/O
edne's avatar
edne committed
855

Niccolò Izzo's avatar
Niccolò Izzo committed
856
- A volte può essere utile interagire con l'utente
edne's avatar
edne committed
857
858
859
860
861
862
863
- 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
864

edne's avatar
edne committed
865
866
----

edne's avatar
edne committed
867
868
869
870
871
872
873
874
875
876
877
878
## 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
879

edne's avatar
edne committed
880
---
edne's avatar
edne committed
881

edne's avatar
edne committed
882
883
# Errori ed Eccezioni

edne's avatar
edne committed
884
----
edne's avatar
edne committed
885
886
887
888
889
890
891
892
893
894
895
896
897
898

## 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
899
----
edne's avatar
edne committed
900
901

## Eccezioni
edne's avatar
edne committed
902

edne's avatar
edne committed
903
- Rappresentano il verificarsi di situazioni *eccezionali*
edne's avatar
edne committed
904

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

edne's avatar
edne committed
908
----
edne's avatar
edne committed
909
910
911
912
913
914
915
916
917
918
919
920

## 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
921
----
edne's avatar
edne committed
922
923
924
925
926
927
928

## 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
929
930
- Dovranno essere gestite (catturate) dal chiamante della funzione,
altrimenti l'utente vedrà un messaggio di errore
edne's avatar
edne committed
931
932
933
934
935
936
937

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

edne's avatar
edne committed
939
---
edne's avatar
edne committed
940
941
942

# The End

edne's avatar
edne committed
943
----
edne's avatar
edne committed
944
945
946
947
948

# Thank you!

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

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