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

----

Potete ottenere questa presentazione recandovi all'indirizzo:

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

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

# Perché Python?

- Ottimo per i principianti
- Facile da usare
- Estremamente diffuso
- Moduli per qualunque cosa

----

## C

```c
#include <stdio.h>

int main() {
Niccolò Izzo's avatar
Niccolò Izzo committed
26
    printf("Hello, world!\n");
Tancredi Orlando's avatar
Tancredi Orlando committed
27
28
29
30
31
32
33
34
35
36
37
    return 0;
}
```

----

## Java

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

----

## Python

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

----

![import antigravity](https://imgs.xkcd.com/comics/python.png)

----

## Breve storia

- Nasce nel 1991 per mano di Guido van Rossum
- Prende il nome dai Monty Python
- È in continua evoluzione
- Convivono due versioni (2 e 3)
edne's avatar
edne committed
63
- Noi useremo Python 3
Tancredi Orlando's avatar
Tancredi Orlando committed
64
65
66
67
68
69
70
71
- Fatelo anche voi

----

## Interpretato vs. compilato

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

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
75
76
77
Python è compilato in quanto la sintassi Python è compilata in bytecode, ed
è interpretato in quanto il bytecode è eseguito da un altro programma, la VM
Python e non eseguito direttamente dal processore.
Tancredi Orlando's avatar
Tancredi Orlando committed
78

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

## Cosa serve

Tancredi Orlando's avatar
Tancredi Orlando committed
83
84
85
- Per scrivere il codice, un editor di testo:
  - Multipiattaforma: Atom
  - Windows: Notepad++
edne's avatar
edne committed
86
- In quanto linguaggio interpretato, l'interprete Python
Tancredi Orlando's avatar
Tancredi Orlando committed
87
88
89
90
91
  - Linux: generalmente preinstallato, altrimenti utilizzare il package manager
  - macOS: [Installer](https://www.python.org/ftp/python/3.6.1/python-3.6.1-macosx10.6.pkg)
  - Windows: [32bit](https://www.python.org/ftp/python/3.6.1/python-3.6.1.exe)
    o [64bit](https://www.python.org/ftp/python/3.6.1/python-3.6.1-amd64.exe)

edne's avatar
edne committed
92
93
---

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

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

## REPL

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

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

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

Notes:
Tancredi Orlando's avatar
Tancredi Orlando committed
114
115
116
Mostrare la differenza tra interprete (il software che converte le istruzioni
in bytecode e poi esegue quest'ultimo) e l'interfaccia REPL Python (il
software che si interfaccia con l'utente).
Tancredi Orlando's avatar
Tancredi Orlando committed
117
118
119
120
121

----

## Espressioni

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

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

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

----

edne's avatar
edne committed
139
140
## Commenti

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

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

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

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

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

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

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

----

## Variabili

Tancredi Orlando's avatar
Tancredi Orlando committed
167
```
Tancredi Orlando's avatar
Tancredi Orlando committed
168
>>> x = 6
Tancredi Orlando's avatar
Tancredi Orlando committed
169
>>> y = 2
Tancredi Orlando's avatar
Tancredi Orlando committed
170
171
>>> x
6
Tancredi Orlando's avatar
Tancredi Orlando committed
172
173
174
>>> y
2
```
edne's avatar
edne committed
175

Tancredi Orlando's avatar
Tancredi Orlando committed
176
177
178
179
180
181
```
>>> 2 * y
4
>>> x + y
8
```
edne's avatar
edne committed
182

Tancredi Orlando's avatar
Tancredi Orlando committed
183
184
185
186
```
>>> z = x + y
>>> z
8
Tancredi Orlando's avatar
Tancredi Orlando committed
187
188
```

edne's avatar
edne committed
189
---
Tancredi Orlando's avatar
Tancredi Orlando committed
190

edne's avatar
edne committed
191
192
193
194
195
# Tipi

----

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

edne's avatar
edne committed
197
```
Tancredi Orlando's avatar
Tancredi Orlando committed
198
199
>>> type(3)
<class 'int'>
Tancredi Orlando's avatar
Tancredi Orlando committed
200
```
Tancredi Orlando's avatar
Tancredi Orlando committed
201

Tancredi Orlando's avatar
Tancredi Orlando committed
202
```
Tancredi Orlando's avatar
Tancredi Orlando committed
203
204
205
206
207
208
>>> type(3.14)
<class 'float'>
```

----

edne's avatar
edne committed
209
## Interi (`int`)
edne's avatar
edne committed
210

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

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

----

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

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

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

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

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

----

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

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

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

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

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

----

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

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

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

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

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

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

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

----

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

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

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

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

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

----

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

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

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

----

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

Tancredi Orlando's avatar
Tancredi Orlando committed
337
338
339
- Collezione **ordinata** di elementi, anche di tipi diversi
- Si definiscono ponendo all'interno di parentesi quadre gli elementi
  intervallati da una virgola
Tancredi Orlando's avatar
Tancredi Orlando committed
340

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

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

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

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

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

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

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

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

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

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
393
394
395
396
397
398
399
400
401
402
403
404
### Slicing

- Permette di formare sottoinsiemi di elementi contigui
- Bisogna indicare un intervallo di indici, separando inizio e fine con
  due punti (`:`)
- L'elemento finale non è incluso

```
>>> lista = [0.0, 1, "due", 3.0, 4, 5, 'sei']
```

```
edne's avatar
edne committed
405
>>> lista[2:5]
Tancredi Orlando's avatar
Tancredi Orlando committed
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
['due', 3.0, 4]
```

- È possibile indicare tutti gli elementi dall'inizio o fino alla fine di una
  lista omettendone l'indice

```
>>> lista[:4]
[0.0, 1, 'due', 3.0]
>>> lista[4:]
[4, 5, 'sei']
```

----

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

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

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

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

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

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

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

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

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

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

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

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
## Tuple (`tuple`)

- Esattamente come le liste, ma **immutabili**
- Sono quindi anche **ordinate**
- Si definiscono con le parentesi tonde

```python
tupla = ('a', 1, 2, '3.0')
```

```
>>> tupla[1] = 1.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

```
>>> tupla.append('sei')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
```

----

edne's avatar
edne committed
496
497
## Riferimenti

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

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

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

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

----

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

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

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

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

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

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

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

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
556
```
Tancredi Orlando's avatar
Tancredi Orlando committed
557
558
559
560
561
562
563
564
565
566
567
>>> verdure.difference(frutta)
{'verze', 'coste', 'porri'}
```

----

La sintesi è anche espressività

```
>>> frutta = {"mele", "pere", "zucchine", "mele"}
>>> verdure = {"zucchine", "verze", "coste", "porri"}
Tancredi Orlando's avatar
Tancredi Orlando committed
568
```
Tancredi Orlando's avatar
Tancredi Orlando committed
569

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Niccolò Izzo's avatar
Niccolò Izzo committed
634
## Blocchi
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
635

Tancredi Orlando's avatar
Tancredi Orlando committed
636
637
- 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
638

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

edne's avatar
edne committed
717
---
edne's avatar
edne committed
718

edne's avatar
edne committed
719
720
# Funzioni

edne's avatar
edne committed
721
----
edne's avatar
edne committed
722

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

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

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

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
741
742
- Le funzioni possono ottenere dati in ingresso, e fornire dati in uscita
- Per tale capacità permettono la riusabilità del codice
edne's avatar
edne committed
743

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
748
- La funzione può essere "predisposta" per ricevere parametri
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
749
750
751
- I parametri sono i dati in ingresso di una funzione
- I parametri diventano variabili visibili all'interno della funzione per essere
  usati
Tancredi Orlando's avatar
Tancredi Orlando committed
752

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

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
755
756
757
758
- Il valore di ritorno è ciò che fornisce in uscita la funzione, il proprio
  risultato
- Lo si specifica inserendo l'istruzione `return` seguita dal valore di ritorno
- La funzione termina subito dopo l'istruzione return
edne's avatar
edne committed
759

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

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

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

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

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

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

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

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

edne's avatar
edne committed
802
----
edne's avatar
edne committed
803

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

Tancredi Orlando's avatar
Tancredi Orlando committed
806
807
808
809
810
811
- Lo scoping modifica la **visibilità** delle variabili
- Le variabili definite all'interno di uno scope sono accessbili solo al
  suo interno
- Gli scope sono definiti da funzioni, classi e moduli
- Le classi sono contenitori di funzioni e di variabili
- I moduli sono contenitori di classi, di funzioni e di variabili
edne's avatar
edne committed
812

edne's avatar
edne committed
813
----
edne's avatar
edne committed
814

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

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

Tancredi Orlando's avatar
Tancredi Orlando committed
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
- All'interno della funzione `f()` viene creata una seconda varibile di nome `x`
  accessibile solo all'interno della funzione
- La variabile `x` **all'interno della funzione** è chiamata **locale**
- La variabile `x` **al di fuori della funzione** è chiamata **globale**
- Sono due variabili **diverse**

----

Se all'interno della funzione non è stato usato il nome di una variabile
globale è possibile accedere ad essa in lettura.

```
>>> x = 'globale'
>>> def f():
...     print(x)
>>> f()
globale
Niccolò Izzo's avatar
Niccolò Izzo committed
844
845
```

Tancredi Orlando's avatar
Tancredi Orlando committed
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
Tuttavia non è possibile modificarla.

```
>>> x = 'globale'
>>> def f():
...    print(x)
...    x = 'variabile ' + x
>>> f()
UnboundLocalError: local variable 'x' referenced before assignment
```

L'interprete ci informa che stiamo chiamando una variabile `x` che non è stata
assegnata. Infatti dentro la funzione la variabile `x` non esiste.

----

### Evadere dallo scope

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

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

edne's avatar
edne committed
879
----
edne's avatar
edne committed
880

edne's avatar
edne committed
881
882
## None

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
- Equivale al `NULL` di C
- Una funzione ritorna `None` se priva di `return`
- Una variabile si può confrontare a None con l'istruzione di comparazione `is`

```
>>> def f():
...     print('funzione')
...     return None
```

```
>>> f()
funzione
>>> x = f()
>>> x
None
```

```
>>> if x is None:
...    print('esatto!')
esatto!
```
edne's avatar
edne committed
906

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

# Moduli

edne's avatar
edne committed
911
----
edne's avatar
Moduli    
edne committed
912

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
913
914
915
916
- I file contenenti codice Python hanno estensione `.py`
- Ogni file è un **modulo**
- È possibile importare variabili, funzioni e classi da altri moduli con
  l'istruzione `import`
edne's avatar
Moduli    
edne committed
917

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
918
919
920
921
922
923
924
925
926
927
928
929
930
- modulo.py
  ```
  default_lim = 3
  def conta(lim=default_lim):
      for x in range(lim):
          print(x)
  ```
- programma.py
  ```
  import modulo
  x = modulo.default_lim + 2
  modulo.conta(x)
  ```
edne's avatar
Moduli    
edne committed
931

edne's avatar
edne committed
932
----
edne's avatar
Moduli    
edne committed
933

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
934
935
936
937
- È possibile importare solo alcuni elementi da un modulo con la sintassi
  `from <modulo> import <oggetto>`
- Aiuta la leggibilità del codice
- Si omette il modulo di provenienza
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
938

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
- modulo.py
  ```
  default_lim = 3
  def conta(lim=default_lim):
      for x in range(lim):
          print(x)
  ```
- programma.py
  ```
  from modulo import default_lim, conta
  x = default_lim + 2
  conta(x)
  ```

----

Il codice posto nello scope del modulo è comunque eseguito, anche se sono
importati alcuni elementi con la sintassi `from ... import`.

- modulo.py
  ```
  a = 'variabile'
  def f():
      print('funzione')
  print('modulo')
Tancredi Orlando's avatar
Tancredi Orlando committed
964
  ```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
965
966
967
968
969
970
- dalla REPL
  ```
  >>> from modulo import f
  modulo
  >>> f()
  funzione
Tancredi Orlando's avatar
Tancredi Orlando committed
971
  ```
edne's avatar
Moduli    
edne committed
972

edne's avatar
edne committed
973
----
edne's avatar
Moduli    
edne committed
974

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
975
976
È possibile eseguire del codice solo se il modulo è eseguito direttamente
e non è stato importato (o il contrario)
edne's avatar
Moduli    
edne committed
977
978
979

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

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
985
986
987
988
- La variabile `__name__` contiene il nome del modulo corrente
- Se un modulo è eseguito direttamente la variabile `__name__` assume valore
`__main__`

edne's avatar
edne committed
989
---
edne's avatar
edne committed
990

edne's avatar
edne committed
991
992
993
994
# Input e Output

----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
995
996
997
- Purtroppo a volte è necessario interagire con l'utente
- È possibile ottenere un valore dall'utente
- È possibile accedere a un file presente sul disco
edne's avatar
edne committed
998

edne's avatar
edne committed
999
1000
----

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1001
## Formattazione dell'output
edne's avatar
edne committed
1002
1003

```
Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1004
1005
1006
1007
1008
>>> s = 'Corsi {} {}'
>>> s.format('Python', '2017')
'Corsi Python 2017'
>>> s.format('Linux', 'base')
'Corsi Linux base'
edne's avatar
edne committed
1009
1010
```

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1011
1012
1013
1014
1015
```
>>> s = 'Corsi {argomento} {tipo}'
>>> s.format(tipo='avanzati', argomento='antani')
'Corsi antani avanzati'
```
edne's avatar
edne committed
1016

edne's avatar
edne committed
1017
----
edne's avatar
edne committed
1018

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1019
## Input dall'utente
edne's avatar
edne committed
1020

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1021
1022
1023
1024
1025
1026
```
>>> a = input()
asd
>>> a
'asd'
```
edne's avatar
edne committed
1027

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1028
1029
1030
1031
1032
```
>>> nome = input("Inserisci il tuo nome: ")
Gattuso
>>> 'Il tuo nome è {}.'.format(nome)
'Il tuo nonme è Gattuso.'
edne's avatar
edne committed
1033
1034
```

edne's avatar
edne committed
1035
----
edne's avatar
edne committed
1036

Tancredi Orlando's avatar
Fixes.    
Tancredi Orlando committed
1037
## Accesso ai file
edne's avatar
edne committed
1038

edne's avatar
edne committed
1039
---
edne's avatar
edne committed
1040
1041
1042
1043
1044

# Thank you!

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

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