day_1.md 13.7 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
86
- Per scrivere il codice, un editor di testo:
  - Multipiattaforma: Atom
  - Windows: Notepad++
- In quanto linguaggio compilato, 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
308
309
310
311
312
- È necessario che il valore di solo un membro dell'espressione sia falso per
  rendere tutta l'espressione falsa. Tutti gli altri membri perdono di
  significato.
- 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
501
>>> frutta
{'mele', 2, '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
566

- Associano una chiave ad un valore
Tancredi Orlando's avatar
Tancredi Orlando committed
567
- Le chiavi devono essere immutabili (stringhe, tuple)
edne's avatar
edne committed
568
- I valori possono essere cambiati
Tancredi Orlando's avatar
Tancredi Orlando committed
569

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

edne's avatar
edne committed
579
580
581
582
583
584
585
- Si accede ai campi usando le chiavi

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

edne's avatar
edne committed
593
# Strutture di controllo
Tancredi Orlando's avatar
Tancredi Orlando committed
594

edne's avatar
edne committed
595
596
Notes:
- parlare di musica
edne's avatar
edne committed
597

Tancredi Orlando's avatar
Tancredi Orlando committed
598
599
----

edne's avatar
edne committed
600
## `if`
Tancredi Orlando's avatar
Tancredi Orlando committed
601

Niccolò Izzo's avatar
Niccolò Izzo committed
602
- Se una condizione è vera esegue un blocco di codice
edne's avatar
edne committed
603
604
605
606
607
608

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

Niccolò Izzo's avatar
Niccolò Izzo committed
609
610
611
612
613
## Blocchi
- Si allineano con quattro spazi
- Funzionano anche 2 o 8 spazi, o i TAB
- Per favore usate i quattro spazi

edne's avatar
edne committed
614
615
616
617
Notes:
- Dire perché qua stiamo usando `print` e non scrivendo il valore e basta come
  prima

Niccolò Izzo's avatar
Niccolò Izzo committed
618
----
edne's avatar
edne committed
619

edne's avatar
edne committed
620
## `else`
edne's avatar
edne committed
621

Niccolò Izzo's avatar
Niccolò Izzo committed
622
623
- Il blocco viene eseguito solo se il più vicino if risulta falso

edne's avatar
edne committed
624
625
626
627
628
629
630
```python
if 3 > 2:
    print('Condizione vera')
else:
    print('Condizione falsa')
```

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

edne's avatar
edne committed
633
## `while`
Tancredi Orlando's avatar
Tancredi Orlando committed
634

Niccolò Izzo's avatar
Niccolò Izzo committed
635
636
- Esegue più volte le stesse istruzioni
- Fintantoché una condizione rimane vera
edne's avatar
edne committed
637
638
639
640
641
642
643
644
645
646
647

```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
648

edne's avatar
edne committed
649
----
Tancredi Orlando's avatar
Tancredi Orlando committed
650

edne's avatar
edne committed
651
## `for`
edne's avatar
edne committed
652

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

edne's avatar
edne committed
655
656
```python
for i in [0, 1, 2, 3, 4]:
Niccolò Izzo's avatar
Niccolò Izzo committed
657
	print(i)
edne's avatar
edne committed
658
659
```

Niccolò Izzo's avatar
Niccolò Izzo committed
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
- 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
675
----
edne's avatar
edne committed
676
677
678
679
680
681
682
683
684
685
686
687
688
689

## `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
690

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

edne's avatar
edne committed
693
694
# Funzioni

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

## Funzioni

edne's avatar
edne committed
699
700
701
- 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
702
- E di eseguirle quando vogliamo, "chiamando" la funzione
edne's avatar
edne committed
703
- Si definiscono con la keyword `def`
edne's avatar
edne committed
704

edne's avatar
edne committed
705
----
edne's avatar
edne committed
706
707
708
709
710
711

## Esempio

```python
def say_hello():
	print('hello world')
edne's avatar
edne committed
712
	
edne's avatar
edne committed
713

edne's avatar
edne committed
714
715
say_hello()  # chiama la funzione
say_hello()  # chiama la funzione di nuovo
edne's avatar
edne committed
716
717
```

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

## Parametri e Argomenti

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

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

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

edne's avatar
edne committed
730
731
732
733
734
735
736
737
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
738
739
```

edne's avatar
edne committed
740
741
742
743
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
744
----
edne's avatar
edne committed
745
746
747
748
749
750

## 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
751
----
edne's avatar
edne committed
752

edne's avatar
edne committed
753
## Lo statement `global`
edne's avatar
edne committed
754
755

- Permette di definire una variabile globale all'intero di una funzione
Niccolò Izzo's avatar
Niccolò Izzo committed
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
- 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
771

edne's avatar
edne committed
772
----
edne's avatar
edne committed
773

edne's avatar
edne committed
774
775
776

### Argomenti di default

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


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

edne's avatar
edne committed
800
801
802
## None

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

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

# Moduli

edne's avatar
edne committed
809
----
edne's avatar
Moduli    
edne committed
810
811
812

## Moduli

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

edne's avatar
edne committed
825
----
edne's avatar
Moduli    
edne committed
826
827

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

edne's avatar
Moduli    
edne committed
829
Permette di importare solo alcune funzioni
edne's avatar
edne committed
830

edne's avatar
Moduli    
edne committed
831
```python
Niccolò Izzo's avatar
Niccolò Izzo committed
832
>>> from math import s3qrt
edne's avatar
Moduli    
edne committed
833
834
835
836
>>> sqrt(16)
4.0
```

edne's avatar
edne committed
837
----
edne's avatar
Moduli    
edne committed
838
839
840
841
842
843
844
845
846
847
848
849
850

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

edne's avatar
edne committed
852
---
edne's avatar
edne committed
853

edne's avatar
edne committed
854
855
856
857
# Input e Output

----

edne's avatar
edne committed
858
## I/O
edne's avatar
edne committed
859

Niccolò Izzo's avatar
Niccolò Izzo committed
860
- A volte può essere utile interagire con l'utente
edne's avatar
edne committed
861
862
863
864
865
866
867
- 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
868

edne's avatar
edne committed
869
870
----

edne's avatar
edne committed
871
872
873
874
875
876
877
878
879
880
881
882
## 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
883

edne's avatar
edne committed
884
---
edne's avatar
edne committed
885

edne's avatar
edne committed
886
887
# Errori ed Eccezioni

edne's avatar
edne committed
888
----
edne's avatar
edne committed
889
890
891
892
893
894
895
896
897
898
899
900
901
902

## 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
903
----
edne's avatar
edne committed
904
905

## Eccezioni
edne's avatar
edne committed
906

edne's avatar
edne committed
907
- Rappresentano il verificarsi di situazioni *eccezionali*
edne's avatar
edne committed
908

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

edne's avatar
edne committed
912
----
edne's avatar
edne committed
913
914
915
916
917
918
919
920
921
922
923
924

## 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
925
----
edne's avatar
edne committed
926
927
928
929
930
931
932

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

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

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

# The End

edne's avatar
edne committed
947
----
edne's avatar
edne committed
948
949
950
951
952

# Thank you!

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

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