NOTA: si consiglia di eseguire una riga alla volta di questo notebook, come fatto a lezione, cercando di capire sia cosa fa ciascuna funzione, sia soprattutto cercando di capire gli eventuali messaggi di errore.

Numeri Interi


In [ ]:
x=1

In [ ]:
print(x)

In [ ]:
type(x)

In [ ]:
print(x, type(x))

In [ ]:
y=2
z=(x+y)**2 * 3
print("x =", x, ", y =", y, ", z =", z)

Numeri Reali (?)


In [ ]:
y=1.0

In [ ]:
print(y)

In [ ]:
type(x), type(y)

In [ ]:
type(x+y)

Type conversion o type cast

Sono usati per convertire un tipo in un altro, in maniera dinamica. Per convertire un oggetto in un dato tipo, basta usare il nome del tipo come se fosse una funzione. Esempi:


In [ ]:
a = "3.0"

In [ ]:
type(a)

In [ ]:
b = int(a)

In [ ]:
b = float(a)

In [ ]:
type(b)

In [ ]:
x = float(1)/3
y = 1/3
z = 1.0//3.0
print(x+y+z)

In [ ]:
2.4//2.5

ATTENZIONE: La divisione tra numeri interi non considera il resto


In [ ]:
x = 1.0/3
y = 1.0/3
z = 1/3
print(x+y+z)

NOTA: In Python 2.7 questa espressione viene valutata a 0.666666 in quanto z vienve valutata con una divisione tra interi


In [ ]:
1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 == 1.0

In [ ]:
1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10 + 1/10

ATTENZIONE: Ricordarsi di come vengono rappresentati i numeri al calcolatori con la rappresentazione in virgola mobile (floating points).

Numeri Complessi


In [ ]:
x = 1+3j
y = 4+2j
z = 2+1j
print(type(x))
print(x+y*z)

In [ ]:
print(z.real, z.imag, z.conjugate)

In [ ]:
z.conjugate()

In [ ]:
z.real = 3

Comandi utili nel workspace

Per controllare le variabili in memoria (nel workspace):


In [ ]:
who

Per rimuovere una variabile dal workspace:


In [ ]:
del x

In [ ]:
who

In [ ]:
print(x+y+z)

In [ ]:
help(complex)

Funzioni

Supponiamo di voler scrivere una funzione che calcola il doppio di un numero dato ovvero la funzione:

$f : \mathbb{C} \rightarrow \mathbb{C}$

con:

  • $f(x) = 2 x$

In python dobbiamo scrivere (ATTENZIONE AGLI SPAZI DEL TAB):


In [ ]:
# Notare l'identazione nella funzione seguente
def f(x):
    """Funzione che il doppio di x"""
    return x*2

In [ ]:
print(type(f))

In [ ]:
f(27)

In [ ]:
f(1.2)

In [ ]:
f(1+3j)

In [ ]:
f("Ciao")

In [ ]:
2*"domanda"

In [ ]:
help(f)

Vogliamo ora scrivere la funzione:

$$f : \mathbb{C} \times \mathbb{C} \rightarrow \mathbb{C}$$

con

$$f(x,y) = x^y$$

In python scriviamo:


In [ ]:
def Potenza(base, esponente):
    """
    Calcola la potenza (base)^(esponente).
    """
    
    return base**esponente

In [ ]:
Potenza(2, 3)

In [ ]:
def Potenza2(base, esponente=2):
    """
    Calcola la potenza (base)^(esponente).
    Se il secondo parametro non viene passato,
    calcola la potenza quadrata, ovvero (esponente=2).
    """
    
    return base**esponente

In [ ]:
print(Potenza2(14))
print(Potenza2(14,3))

In [ ]:
Potenza2(esponente=4, base=10)

Python supporta la possibilità di usare i nomi di variabili usati nella definizione di una funzione per passare gli argomenti (chiamati keyword arguments). Questo si differenza dalla tipica notazione posizionale di molti linguaggi di programmazione, tipo il C, e permette di rendere il codice più leggibile e di evitare ambiguità nel passare gli argomenti ad una funzione. Si noti infine che nella definizione della funzione Potenza2 è stato definito un parametro di default (default parameter values) per definire il valore dell'esponente.

Liste


In [ ]:
As = [5,3,2,8,7,13]
print(As)
print(type(As))

In [ ]:
# help(list)

IMPORTANTE: Abituarsi ad usare il tasto tab per avere il completamento automatico


In [ ]:
# Aggiungere un elemento ad una lista
As.append(27)
print(As)

In [ ]:
As.remove(7)
print(As)

In [ ]:
As.insert(4, 12)
print(As)

In [ ]:
# Invertire l'ordine di una lista
As.reverse()
print(As)

In [ ]:
# Ordinamento come funzione
Bs = sorted(As)
print(As, Bs)

In [ ]:
# Ordinamento "IN_PLACE"
As.sort()
print(As)

COMMENTO: Ricordarsi la differenza che alcune funzioni operano IN PLACE


In [ ]:
print(As)
for x in As:
    print(x)
# Equivalente in ANSI-C    
# for (int i=0; i<n; i++)
#    printf("%f\n", As[i]);

In [ ]:
# Iterare gli elementi di una lista (esempio di commento in python)
for n in As:
    print("x=", str(n)," \t -> f(x^3) =",str(Potenza(n,3)))

In [ ]:
list(map(lambda x: Potenza(x,3), As))

In [ ]:
# Iterare una lista usando una variabile 
# per l'indice dell'elemento nella lista
for i,n in enumerate(As):
    print("indice:", i, " -> As["+str(i)+"] = " + str(n))

In [ ]:
# Iterare una lista usando una variabile 
# per l'indice dell'elemento nella lista
for i,n in enumerate(reversed(As)):
    print("indice:", i, " -> As["+str(i)+"] = " + str(n))

Operazioni di Slicing

Per ottenere una sotto lista, si può usare un espressione di Slicing. Per esempio, l'espressione Lista[start:end], restituisce la sottolista che inizia in posizione "start" e finisce in posizione "end". Esempio:


In [ ]:
As

In [ ]:
As[3:5]

In [ ]:
As[-1]

In [ ]:
head, tail = As[0], As[1:]

In [ ]:
print(head, tail)

In [ ]: