You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## Scomporre i programmi in funzioni per renderli più comprensibili.
24
22
25
-
- Gli esseri umani possono tenere nella memoria di lavoro solo pochi elementi alla
26
-
volta.
27
-
- Comprendere idee più grandi/più complicate comprendendo e combinando pezzi.
23
+
- Gli esseri umani possono tenere nella memoria di lavoro solo pochi elementi alla volta.
24
+
- Comprendiamo idee più grandi/più complesse combinando pezzi.
28
25
- Componenti di una macchina.
29
26
- Lemmi per la dimostrazione di teoremi.
30
-
- Le funzioni hanno lo stesso scopo nei programmi.
31
-
-*Incapsula* la complessità in modo da poterla trattare come un'unica "cosa".
32
-
-consente anche il *riutilizzo*.
27
+
- Le funzioni hanno lo stesso scopo nei programmi:
28
+
-*Incapsulare* a complessità in modo da poterla trattare come un’unica "cosa".
29
+
-Consentono anche il *riutilizzo*.
33
30
- Scrivere una volta, usare molte volte.
34
31
35
32
## Definire una funzione usando `def` con un nome, dei parametri e un blocco di codice.
36
33
37
34
- Iniziare la definizione di una nuova funzione con `def`.
38
-
-Seguito dal nome della funzione.
35
+
-Seguire con il nome della funzione.
39
36
- Deve rispettare le stesse regole dei nomi delle variabili.
40
-
-Allora*parametri* tra parentesi.
41
-
-parentesi vuote se la funzione non riceve input.
37
+
-Poi i*parametri* tra parentesi.
38
+
-Parentesi vuote se la funzione non riceve input.
42
39
- Ne parleremo in dettaglio tra poco.
43
40
- Poi i due punti.
44
-
-Poi un blocco di codice rientrato.
41
+
-nfine un blocco di codice rientrato.
45
42
46
43
```python
47
44
defprint_greeting():
@@ -50,11 +47,11 @@ def print_greeting():
50
47
print('Right?')
51
48
```
52
49
53
-
## Definire una funzione non la fa funzionare.
50
+
## Definire una funzione non la fa eseguire.
54
51
55
-
- Definire una funzione non la fa funzionare.
52
+
- Definire una funzione non la fa eseguire.
56
53
- Come assegnare un valore a una variabile.
57
-
-Deve chiamare la funzione per eseguire il codice che contiene.
54
+
-Si deve chiamare la funzione per eseguire il codice che contiene.
58
55
59
56
```python
60
57
print_greeting()
@@ -86,10 +83,7 @@ print_date(1871, 3, 19)
86
83
1871/3/19
87
84
```
88
85
89
-
Oppure, possiamo dare un nome agli argomenti quando chiamiamo la funzione, il che ci
90
-
permette di specificarli in qualsiasi ordine e aggiunge chiarezza al sito di chiamata;
91
-
altrimenti, mentre si legge il codice, si potrebbe dimenticare se il secondo argomento è
92
-
il mese o il giorno, ad esempio.
86
+
Oppure, possiamo dare un nome agli argomenti quando chiamiamo la funzione, il che ci permette di specificarli in qualsiasi ordine e aggiunge chiarezza al sito di chiamata; altrimenti, mentre si legge il codice, si potrebbe dimenticare se il secondo argomento è il mese o il giorno, ad esempio.
- Via [Twitter](https://twitter.com/minisciencegirl/status/693486088963272705): `()`
103
-
contiene gli ingredienti della funzione mentre il corpo contiene la ricetta.
96
+
- Via [Twitter](https://twitter.com/minisciencegirl/status/693486088963272705): `()` contiene gli ingredienti della funzione mentre il corpo contiene la ricetta.
104
97
105
98
## Le funzioni possono restituire un risultato al loro chiamante usando `return`.
106
99
107
100
- Usare `return ...` per restituire un valore al chiamante.
108
101
- Può verificarsi in qualsiasi punto della funzione.
109
-
- Ma le funzioni sono più facili da capire se si presenta`return`:
102
+
- Ma le funzioni sono più facili da capire se si usa`return`:
Una chiamata di funzione ha sempre bisogno di parentesi, altrimenti si ottiene
205
-
l'indirizzo di memoria dell'oggetto funzione. Quindi, se volessimo chiamare la funzione
206
-
denominata report e assegnarle il valore 22,5, potremmo chiamare la funzione nel modo
207
-
seguente
197
+
Una chiamata di funzione ha sempre bisogno delle parentesi, altrimenti si ottiene il riferimento all’oggetto funzione. Se volessimo chiamare la funzione report passando il valore 22,5, potremmo scrivere:
208
198
209
199
```python
210
200
print("calling")
@@ -234,8 +224,7 @@ pressure is 22.5
234
224
print(time_string)
235
225
```
236
226
237
-
2. Dopo aver risolto il problema di cui sopra, spiegare perché eseguire questo esempio
238
-
di codice:
227
+
2. Dopo aver risolto il problema di cui sopra, spiegate perché eseguire questo esempio:
239
228
240
229
```python
241
230
result = print_time(11, 37, 59)
@@ -249,24 +238,17 @@ dà questo risultato:
249
238
result of call is: None
250
239
```
251
240
252
-
3. Perché il risultato della chiamata è `None`?
241
+
3. Perché il risultato è `None`?
253
242
254
243
::::::::::::::: solution
255
244
256
245
## Soluzione
257
246
258
-
1. Il problema dell'esempio è che la funzione `print_time()` viene definita *dopo* che
259
-
la funzione è stata chiamata. Python non sa come risolvere il nome `print_time`,
260
-
poiché non è ancora stato definito, e solleverà un `NameError`, ad esempio
261
-
`NameError: name 'print_time' is not defined`
247
+
1. Il problema dell'esempio è che la funzione `print_time()` viene definita *dopo* che la funzione è stata chiamata. Python non sa come risolvere il nome `print_time`, poiché non è ancora stato definito, e solleverà un `NameError`, ad esempio NameError: name 'print_time' is not defined`
262
248
263
-
2. La prima riga di output `11:37:59` è stampata dalla prima riga di codice, `result =
264
-
print_time(11, 37, 59)` che lega il valore restituito dall'invocazione `print_time`
265
-
alla variabile `result`. La seconda riga proviene dalla seconda chiamata di stampa
266
-
per stampare il contenuto della variabile `result`.
249
+
2. La prima riga di output `11:37:59` è stampata dalla prima riga di codice, `result = print_time(11, 37, 59)` che lega il valore restituito dall'invocazione `print_time` alla variabile `result`. La seconda riga proviene dalla seconda chiamata di stampa per stampare il contenuto della variabile `result`.
267
250
268
-
3.`print_time()` non restituisce esplicitamente `return` un valore, quindi restituisce
269
-
automaticamente `None`.
251
+
3.`print_time()` non restituisce esplicitamente `return` un valore, quindi restituisce automaticamente `None`.
270
252
271
253
:::::::::::::::::::::::::
272
254
@@ -276,9 +258,7 @@ dà questo risultato:
276
258
277
259
## Incapsulamento
278
260
279
-
Compilate gli spazi vuoti per creare una funzione che prenda come argomento un singolo
280
-
nome di file, carichi i dati nel file denominato dall'argomento e restituisca il valore
281
-
minimo in quei dati.
261
+
Compilate gli spazi vuoti per creare una funzione che prenda come argomento un singolo nome di file, carichi i dati nel file indicato e restituisca il valore minimo in quei dati.
282
262
283
263
```python
284
264
import pandas as pd
@@ -308,9 +288,7 @@ def min_in_data(filename):
308
288
309
289
## Trovare il primo
310
290
311
-
Riempite gli spazi vuoti per creare una funzione che prenda come argomento un elenco di
312
-
numeri e restituisca il primo valore negativo dell'elenco. Cosa fa la funzione se
313
-
l'elenco è vuoto? E se l'elenco non contiene numeri negativi?
291
+
Riempite gli spazi vuoti per creare una funzione che prenda come argomento un elenco di numeri e restituisca il primo valore negativo dell’elenco. Cosa fa la funzione se l’elenco è vuoto? E se l’elenco non contiene numeri negativi?
2. Abbiamo visto esempi di utilizzo di *argomenti con nome* quando lavoravamo con la libreria pandas. Per esempio, quando si legge un set di dati usando `data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')`, l'ultimo
380
355
argomento `index_col` è un argomento con nome.
381
356
3. L'uso di argomenti con nome può rendere il codice più leggibile, poiché dalla
382
-
chiamata di funzione si può vedere quale nome hanno i diversi argomenti all'interno
383
-
della funzione. Inoltre, può ridurre le possibilità di passare gli argomenti
384
-
nell'ordine sbagliato, poiché utilizzando argomenti con nome l'ordine non ha
385
-
importanza.
357
+
chiamata di funzione si può vedere quale nome hanno i diversi argomenti all'interno della funzione. Inoltre, può ridurre le possibilità di passare gli argomenti nell'ordine sbagliato, poiché utilizzando argomenti con nome l'ordine non ha importanza.
Il codice seguente viene eseguito su una stampante di etichette per uova di gallina. Una
396
-
bilancia digitale comunicherà al computer la massa di un uovo di gallina (in grammi) e
397
-
il computer stamperà un'etichetta.
365
+
## Incapsulamento di un blocco If/Stampa
366
+
Il codice seguente viene eseguito su una stampante di etichette per uova di gallina. Una bilancia digitale comunica al computer la massa di un uovo (in grammi) e il computer stampa un’etichetta.
398
367
399
368
```python
400
369
import random
401
370
for i inrange(10):
402
371
403
-
# simulating the mass of a chicken egg
404
-
#the (random) mass will be 70 +/- 20 grams
372
+
# simulazione della massa di un uovo di gallina
373
+
#la massa (casuale) sarà di 70 ± 20 grammi
405
374
mass =70+20.0* (2.0* random.random() -1.0)
406
375
407
376
print(mass)
408
377
409
-
#egg sizing machinery prints a label
378
+
#il sistema di classificazione stampa un'etichetta
410
379
if mass >=85:
411
380
print("jumbo")
412
381
elif mass >=70:
@@ -426,8 +395,8 @@ Rivedendo il programma per utilizzare la funzione si otterrebbe questo:
426
395
import random
427
396
for i inrange(10):
428
397
429
-
# simulating the mass of a chicken egg
430
-
#the (random) mass will be 70 +/- 20 grams
398
+
# simulazione della massa di un uovo di gallina
399
+
#la massa (casuale) sarà di 70 ± 20 grammi
431
400
mass =70+20.0* (2.0* random.random() -1.0)
432
401
433
402
print(mass, get_egg_label(mass))
@@ -438,18 +407,15 @@ for i in range(10):
438
407
programma rivisto sopra. Si noti che il valore di ritorno della funzione
439
408
`get_egg_label()` sarà importante. L'esempio di output del programma precedente
440
409
sarebbe `71.23 large`.
441
-
2. Un uovo sporco potrebbe avere una massa superiore a 90 grammi e un uovo rovinato o
442
-
rotto probabilmente avrà una massa inferiore a 50 grammi. Modificare la funzione
443
-
`get_egg_label()` per tenere conto di queste condizioni di errore. Un esempio di
444
-
output potrebbe essere `25 too light, probably spoiled`.
410
+
2. Un uovo sporco potrebbe avere una massa superiore a 90 grammi e un uovo rovinato o rotto probabilmente avrà una massa inferiore a 50 grammi. Modificare la funzione `get_egg_label()` per tenere conto di queste condizioni di errore. Un esempio di output potrebbe essere `25 too light, probably spoiled`.
445
411
446
412
::::::::::::::: solution
447
413
448
414
## Soluzione
449
415
450
416
```python
451
417
defget_egg_label(mass):
452
-
#egg sizing machinery prints a label
418
+
#Il sistema di classificazione delle uova stampa un’etichetta.
453
419
egg_label ="Unlabelled"
454
420
if mass >=90:
455
421
egg_label ="warning: egg might be dirty"
@@ -503,10 +469,7 @@ japan = data_asia.loc['Japan']
503
469
return avg
504
470
```
505
471
506
-
3. Come generalizzereste questa funzione se non sapeste in anticipo quali anni specifici
507
-
sono presenti come colonne nei dati? Per esempio, se avessimo anche i dati degli anni
508
-
che terminano con 1 e 9 per ogni decennio? (Suggerimento: utilizzate le colonne per
509
-
filtrare quelle che corrispondono al decennio, invece di enumerarle nel codice)
472
+
3. Come generalizzereste questa funzione se non sapeste in anticipo quali anni specifici sono presenti come colonne nei dati? Per esempio, se avessimo anche i dati degli anni che terminano con 1 e 9 per ogni decennio? (Suggerimento: utilizzate le colonne per filtrare quelle che corrispondono al decennio, invece di enumerarle nel codice)
510
473
511
474
::::::::::::::: solution
512
475
@@ -531,8 +494,7 @@ japan = data_asia.loc['Japan']
531
494
return avg
532
495
```
533
496
534
-
3. Per ottenere la media degli anni in questione, è necessario eseguire un ciclo su di
535
-
essi:
497
+
3. Per ottenere la media degli anni in questione, è necessario eseguire un ciclo su di essi:
In matematica, un [sistema dinamico](https://en.wikipedia.org/wiki/Dynamical_system) è
570
-
un sistema in cui una funzione descrive la dipendenza temporale di un punto in uno
571
-
spazio geometrico. Un esempio canonico di sistema dinamico è la [mappa
572
-
logistica](https://en.wikipedia.org/wiki/Logistic_map), un modello di crescita che
573
-
calcola una nuova densità di popolazione (tra 0 e 1) in base alla densità attuale. Nel
574
-
modello, il tempo assume valori discreti 0, 1, 2, ...
531
+
In matematica, un [sistema dinamico](https://en.wikipedia.org/wiki/Dynamical_system) è un sistema in cui una funzione descrive la dipendenza temporale di un punto in uno spazio geometrico. Un esempio canonico di sistema dinamico è la [mappa logistica](https://en.wikipedia.org/wiki/Logistic_map), un modello di crescita che calcola una nuova densità di popolazione (tra 0 e 1) in base alla densità attuale. Nel modello, il tempo assume valori discreti 0, 1, 2, ...
575
532
576
533
1. Definire una funzione chiamata `logistic_map` che prende due input: `x`, che
577
-
rappresenta la popolazione attuale (al tempo `t`), e un parametro `r = 1`. Questa
578
-
funzione deve restituire un valore che rappresenta lo stato del sistema (popolazione)
579
-
al tempo `t + 1`, utilizzando la funzione di mappatura:
534
+
rappresenta la popolazione attuale (al tempo `t`), e un parametro `r = 1`. Questa funzione deve restituire un valore che rappresenta lo stato del sistema (popolazione) al tempo `t + 1`, utilizzando la funzione di mappatura:
580
535
581
536
`f(t+1) = r * f(t) * [1 - f(t)]`
582
537
583
-
2. Utilizzando un ciclo `for` o `while`, iterare la funzione `logistic_map` definita
584
-
nella parte 1, partendo da una popolazione iniziale di 0,5, per un periodo di tempo
585
-
`t_final = 10`. Memorizzate i risultati intermedi in una lista, in modo da
586
-
accumulare, al termine del ciclo, una sequenza di valori che rappresentano lo stato
587
-
della mappa logistica al tempo `t = [0,1,...,t_final]` (11 valori in totale).
588
-
Stampate questo elenco per vedere l'evoluzione della popolazione.
538
+
2. Utilizzando un ciclo `for` o `while`, iterare la funzione `logistic_map` definita nella parte 1, partendo da una popolazione iniziale di 0,5, per un periodo di tempo `t_final = 10`. Memorizzate i risultati intermedi in una lista, in modo da accumulare, al termine del ciclo, una sequenza di valori che rappresentano lo stato della mappa logistica al tempo `t = [0,1,...,t_final]` (11 valori in totale).
539
+
Stampate questo elenco per vedere l'evoluzione della popolazione.
589
540
590
-
3. Incapsulate la logica del vostro ciclo in una funzione chiamata `iterate` che prende
591
-
la popolazione iniziale come primo input, il parametro `t_final` come secondo input e
592
-
il parametro `r` come terzo input. La funzione deve restituire un elenco di valori
593
-
che rappresentano lo stato della mappa logistica al tempo `t = [0,1,...,t_final]`.
594
-
Eseguire la funzione per i periodi `t_final = 100` e `1000` e stampare alcuni dei
595
-
valori. La popolazione sta tendendo verso uno stato stazionario?
541
+
3. Incapsulate la logica del vostro ciclo in una funzione chiamata `iterate` che prende la popolazione iniziale come primo input, il parametro `t_final` come secondo input e il parametro `r` come terzo input. La funzione deve restituire un elenco di valori che rappresentano lo stato della mappa logistica al tempo `t = [0,1,...,t_final]`. Eseguire la funzione per i periodi `t_final = 100` e `1000` e stampare alcuni dei valori. La popolazione sta tendendo verso uno stato stazionario?
596
542
597
543
::::::::::::::: solution
598
544
@@ -647,25 +593,24 @@ La popolazione sembra avvicinarsi allo zero.
647
593
## Utilizzo di funzioni con condizionali in Pandas
648
594
649
595
Le funzioni contengono spesso dei condizionali. Ecco un breve esempio che indica in
650
-
quale quartile si trova l'argomento in base ai valori codificati a mano per i punti di
651
-
taglio del quartile.
596
+
quale quartile si trova l'argomento in base ai valori codificati a mano per i punti di taglio del quartile.
Questa funzione verrebbe tipicamente utilizzata all'interno di un ciclo `for`, ma Pandas
679
-
ha un modo diverso e più efficiente per fare la stessa cosa, ovvero *applicare* una
680
-
funzione a un dataframe o a una parte di esso. Ecco un esempio, utilizzando la
681
-
definizione precedente.
623
+
Questa funzione verrebbe tipicamente utilizzata all'interno di un ciclo `for`, ma Pandas ha un modo diverso e più efficiente per fare la stessa cosa, ovvero *applicare* una funzione a un dataframe o a una parte di esso. Ecco un esempio, utilizzando la definizione precedente.
C'è molto in questa seconda riga, quindi esaminiamola pezzo per pezzo. Sul lato destro
689
-
di `=` iniziamo con `data['lifeExp']`, che è la colonna del dataframe chiamata `data`
690
-
etichettata `lifExp`. Utilizziamo la `apply()` per fare ciò che dice, applicare la
691
-
`calculate_life_quartile` al valore di questa colonna per ogni riga del dataframe.
630
+
C'è molto in questa seconda riga, quindi esaminiamola pezzo per pezzo. Sul lato destro di `=` iniziamo con `data['lifeExp']`, che è la colonna del dataframe chiamata `data`etichettata `lifExp`. Utilizziamo la `apply()` per fare ciò che dice, applicare la `calculate_life_quartile` al valore di questa colonna per ogni riga del dataframe.
0 commit comments