Sequenze 1: introduzione¶

Riferimenti: SoftPython - sequenze 1

  • visualizza al meglio in
  • versione stampabile: clicca qua
  • per navigare nelle slide: premere Esc


Summer School Data Science 2023 - Modulo 1 informatica: Moodle

Docente: David Leoni david.leoni@unitn.it

Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it

Iterabili e iteratori¶

In [2]:
sequenza = ['a','r','p','a']

iteratore = iter(sequenza)
In [3]:
iteratore
Out[3]:
<list_iterator at 0x7f60e2d08490>
  • 'macchina' ferma
  • guarda ad una specifica posizione all'interno della sequenza

next¶

Per attivare:

In [4]:
next(iteratore)
Out[4]:
'a'
In [5]:
next(iteratore)
Out[5]:
'r'
In [6]:
next(iteratore)
Out[6]:
'p'
In [7]:
next(iteratore)
Out[7]:
'a'

next - esagerare¶

next(iteratore)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
/tmp/ipykernel_12808/2464660659.py in <module>
----> 1 next(iteratore)

StopIteration:

Materializzare una sequenza¶

sequenze materializzate

  • stringhe, liste, etc

sequenze non materializzate

  • range
In [8]:
range(100)
Out[8]:
range(0, 100)

Come materializzare?

In [9]:
list(range(10))
Out[9]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Quando materializzare?¶

DOMANDA: Occupa più memoria l’oggetto a o l’oggetto b ?

In [10]:
a = range(10)
b = range(10000000)

DOMANDA: Occupa più memoria l’oggetto a o l’oggetto b ?

In [11]:
a = list(range(10))
b = list(range(10000000))

Non consumerai due volte¶

In [12]:
r = range(4)
iteratore = iter(r)

for elemento in iteratore:
    print(elemento)
0
1
2
3
In [13]:
for elemento in iteratore:
    print(elemento)         # stampa qualcosa?

Non consumerai due volte..¶

..neanche implicitamente!

In [14]:
r = range(4)
iteratore = iter(r)

prima     = list(iteratore)
seconda   = list(iteratore)
In [15]:
prima
Out[15]:
[0, 1, 2, 3]
In [16]:
seconda
Out[16]:
[]

reversed¶

In [17]:
sequenza = ['g','i','a','r','a']
In [18]:
iteratore = reversed(sequenza)  # qua NON serve iter! 
In [19]:
iteratore  # E' GIA' UN ITERATORE!
Out[19]:
<list_reverseiterator at 0x7f60e2d15f90>

Scorriamo con il for

In [20]:
for elemento in reversed(sequenza):
    print(elemento)
a
r
a
i
g

reversed - materializziamo¶

Solo se proprio necessario:

In [21]:
list(iteratore)
Out[21]:
['a', 'r', 'a', 'i', 'g']

sorted¶

  • Produce una NUOVA lista già materializzata!
  • funzione sorted(sequenza) $\neq$ metodo lista.sort()
In [22]:
 
Out[22]:
Python Tutor visualization

zip¶

Crea una sequenza di tuple da due sequenze di partenza

In [23]:
maschi = ["Topolino", "Paperino", "Paperone"]

femmine = ["Minnie", "Paperina", "Brigitta"]

zip(maschi, femmine)
Out[23]:
<zip at 0x7f60e2d13e10>
In [24]:
for coppia in zip(maschi, femmine):
    print(coppia)     
('Topolino', 'Minnie')
('Paperino', 'Paperina')
('Paperone', 'Brigitta')

Materializziamo:

In [25]:
list(zip(maschi, femmine))
Out[25]:
[('Topolino', 'Minnie'), ('Paperino', 'Paperina'), ('Paperone', 'Brigitta')]

List comprehensions¶

Abbiamo questa sequenza:

In [26]:
personaggi = ["Topolino", "Paperino", "Paperone"]

Vogliamo creare una NUOVA lista tutta in maiuscolo. Prova con questa sintassi:

[ESPRESSIONE_TRASFORMAZIONE for VARIABILE in SEQUENZA]

ESPRESSIONE_TRASFORMAZIONE deve generare un valore

  • dovrebbe usare VARIABILE al suo interno
In [27]:
[nome.upper() for nome in personaggi]
Out[27]:
['TOPOLINO', 'PAPERINO', 'PAPERONE']
In [28]:
personaggi  # l'originale è preservato
Out[28]:
['Topolino', 'Paperino', 'Paperone']

Filtrare list comprehensions¶

Abbiamo questa verdura:

In [29]:
carote =  [8,4,3,6,2,7]

Vogliamo vendere le carote di almeno 5 cm creando una NUOVA lista.

Come facciamo con questa sintassi?

[ESPRESSIONE for ELEMENTO in SEQUENZA if CONDIZIONE]
In [30]:
vendere = [ m for m in carote if m >= 5 ]

print(vendere)
[8, 6, 7]
In [31]:
print(carote)  # originale inalterato
[8, 4, 3, 6, 2, 7]
In [32]: