day_1.md 14.6 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
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
### 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']
```

```
>>> lista[3:5]
['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
572
>>> frutta | verdure
{'coste', 'verze', 'mele', 'pere', 'porri', 'zucchine'}
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
582
>>> frutta - verdure
{'mele', 'pere'}
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
587
>>> verdure - frutta
{'coste', 'verze', '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
722
723

## Funzioni

Tancredi Orlando's avatar
Tancredi Orlando committed
724
725
726
727
728
- È una porzione di codice a cui è assegnato un nome
- È 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
729

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

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

edne's avatar
edne committed
742
----
edne's avatar
edne committed
743
744
745

## Parametri e Argomenti

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

Tancredi Orlando's avatar
Tancredi Orlando committed
750

edne's avatar
edne committed
751
752
753
----

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

edne's avatar
edne committed
755
756
757
758
759
760
761
762
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
763
764
```

edne's avatar
edne committed
765
766
767
768
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
769
----
edne's avatar
edne committed
770
771
772
773
774
775

## 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
776
----
edne's avatar
edne committed
777

edne's avatar
edne committed
778
## Lo statement `global`
edne's avatar
edne committed
779
780

- Permette di definire una variabile globale all'intero di una funzione
Niccolò Izzo's avatar
Niccolò Izzo committed
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
- 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
796

edne's avatar
edne committed
797
----
edne's avatar
edne committed
798

edne's avatar
edne committed
799
800
801

### Argomenti di default

Niccolò Izzo's avatar
Niccolò Izzo committed
802
803
- Alcuni parametri possono essere resi opzionali
- Si fa assegnando ai parametri dei valori di default
edne's avatar
edne committed
804
805
806
- Se omettiamo l'argomento, la funzione userà quello di default


edne's avatar
edne committed
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
```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
823
824
----

edne's avatar
edne committed
825
826
827
## None

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

edne's avatar
edne committed
830
---
edne's avatar
Moduli    
edne committed
831
832
833

# Moduli

edne's avatar
edne committed
834
----
edne's avatar
Moduli    
edne committed
835
836
837

## Moduli

Niccolò Izzo's avatar
Niccolò Izzo committed
838
839
840
841
- 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
842
843
844
845
846
847
848
849
 
 
```python
>>> import math
>>> math.sqrt(16)
4.0
```

edne's avatar
edne committed
850
----
edne's avatar
Moduli    
edne committed
851
852

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

edne's avatar
Moduli    
edne committed
854
Permette di importare solo alcune funzioni
edne's avatar
edne committed
855

edne's avatar
Moduli    
edne committed
856
```python
Niccolò Izzo's avatar
Niccolò Izzo committed
857
>>> from math import s3qrt
edne's avatar
Moduli    
edne committed
858
859
860
861
>>> sqrt(16)
4.0
```

edne's avatar
edne committed
862
----
edne's avatar
Moduli    
edne committed
863
864
865
866
867
868
869
870
871
872
873
874
875

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

edne's avatar
edne committed
877
---
edne's avatar
edne committed
878

edne's avatar
edne committed
879
880
881
882
# Input e Output

----

edne's avatar
edne committed
883
## I/O
edne's avatar
edne committed
884

Niccolò Izzo's avatar
Niccolò Izzo committed
885
- A volte può essere utile interagire con l'utente
edne's avatar
edne committed
886
887
888
889
890
891
892
- 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
893

edne's avatar
edne committed
894
895
----

edne's avatar
edne committed
896
897
898
899
900
901
902
903
904
905
906
907
## 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
908

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

edne's avatar
edne committed
911
912
# Errori ed Eccezioni

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

## 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
928
----
edne's avatar
edne committed
929
930

## Eccezioni
edne's avatar
edne committed
931

edne's avatar
edne committed
932
- Rappresentano il verificarsi di situazioni *eccezionali*
edne's avatar
edne committed
933

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

edne's avatar
edne committed
937
----
edne's avatar
edne committed
938
939
940
941
942
943
944
945
946
947
948
949

## 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
950
----
edne's avatar
edne committed
951
952
953
954
955
956
957

## 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
958
959
- Dovranno essere gestite (catturate) dal chiamante della funzione,
altrimenti l'utente vedrà un messaggio di errore
edne's avatar
edne committed
960
961
962
963
964
965
966

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

edne's avatar
edne committed
968
---
edne's avatar
edne committed
969
970
971

# The End

edne's avatar
edne committed
972
----
edne's avatar
edne committed
973
974
975
976
977

# Thank you!

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

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