Intro Python
Intro Python
Salvatore Cuomo
StackOverflow (1)
• Un interessante articolo qui
– https://stackoverflow.blog/2017/09/06/incredible-growth-python/
2
StackOverflow (2)
• Trends
– https://stackoverflow.blog/2017/09/06/incredible-growth-python/
3
Python alcune fonti
• Libri:
– Thinking Python: Allen Downey (O’Reilly 2012)
– Programmazione in Python: K. Lambert (Apogeo 2013)
– Programmare con Python. Guida completa: Marco Buttu, 2014)
– Python Cookbook: Martelli, Ascher (O’Reilly ’02)
AVANZATO
– Introduction to Machine Learning with Python: A Guide for Data
Scientists, by Sarah Guido and Andreas C. Muller (O’Reilly
2016)
• Materiale on line
– https://www.python.it/doc/libri/
– Beginner's Tutorial (
http://www.freenetpages.co.uk/hp/alan.gauld/italian/)
– Best tutorial (https://learnpythonthehardway.org/book/)
4
Genesi di Python
• Piccola genesi del linguaggio
– Creato da Guido van Rossum nel 1989 al Centrum
Wiskunde & Informatica (CWI) Olanda
– Riscrittura del codice e ampliamento del linguagaggio
Python 2.0 nel 2000
– Ultima version nel 2008, venne introdotto Python 3.0
• un linguaggio general-purpose
– Non crea molti “limiti” al programmatore in termini di
sviluppo di codici e di architettura
– Ha molto codice e librerie disponibili
10
Semplice Programma
15
Costrutto IF-ELSE (2)
• La sintassi è la seguente:
if <espressione>:
<sequenza_comandi>
else:
<sequenza_comandi>
16
Costrutto IF-ELSE (3)
17
Costrutto IF-ELSE maggiori alternative
• Esempi
18
Costrutti Iterativi
19
Costrutto FOR (1)
• La sintassi è la seguente:
>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)
[-32, -31, -30, -29, -28, -27, -26, -25,
-24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20]
>>> range(21,5)
[]
21
Uso del FOR con Range
• Esempio 1
demolist = ['life',42, 'the universe',
6,'and',7,'everything']
for item in demolist:
print "The Current item is:",
print item
• Esempio 2
list = [2,4,6,8]
sum = 0
for num in list:
sum = sum + num
print "The sum is: ",sum
22
Il ciclo WHILE
• La sintassi è la seguente:
while <espressione>:
<sequenza_comandi>
a = 0
while a < 10:
a = a + 1
print a
23
Fibonacci.py
# Sequenza di Fibinacci.
a = 0
b = 1
count = 0
max_count = 20
while count < max_count:
count = count + 1
# Memorizzazione dei precedenti
old_a = a
old_b = b
a = old_b
b = old_a + old_b
# La virgola alla fine di un istruzione print
# prosegue la stampa sulla stessa linea.
print old_a,
print 24
Il ciclo REPEAT UNTIL
• La sintassi è la seguente:
while True:
<istruzioni>
if cond:
break
25
Esercizio di Riepilogo
26
Esercizio di Riepilogo
• leggere 10 numeri e per ogni numero inserito stamparne il doppio; se
l’utente inserisce il numero 0 il programma termina prima
>>> a=range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
28
Vettori e Matrici in Python (2)
• L’indicizzazione avviene a partire da 0 ovvero il
primo elemento di un vettore a è sempre a[0] (come
nel linguaggio C)
>>> a=range(0,10,2)
>>> a
[0, 2, 4, 6, 8]
>>> a[0]
0
>>> Squadre = ["Napoli", "Inter", "Milan", "Roma"]
>>> Numeri=[ 1 ,2 ]
>>> print Squadre, Numeri
['Napoli', 'Inter', 'Milan', 'Roma'] [1, 2]
>>> 'Juve' in Squadre
False
>>> 'Napoli' in Squadre
True 29
Vettori e Matrici in Python (3)
• Le matrici sono definite come liste annidate
30
Operazioni di Algebra lineare (1)
• Somma di vettori
>>> x=[1,2,3]
>>> y=[4,5,6]
>>> x+y
[1, 2, 3, 4, 5, 6]
>>> [0] * 4
[0, 0, 0, 0]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
31
Operazioni di Algebra lineare (2)
• Per lavorare con Matrici e vettori bisogna imprortate i
moduli numerici dalla libreria NumPy attraverso il
comando
from numpy import *
• Siamo pronti adesso per lavorare con vettori
>>>x=array([1,2,3])
>>>y=array([4,5,6])
>>>x+y
array([5, 7, 9])
>>>2*x
array([2, 4, 6])
>>>x*y #prodotto membro a membro
array([ 4, 10, 18])
32
Operazioni di Algebra lineare (3)
• Siamo pronti adesso per lavorare con vettori
>>>x=array([1,2,3])
>>>y=array([4,5,6])
>>print dot(x,y)
32
>>>x.size
3
>>>y/x #divisino membro a membro
array([4, 2, 2])
>>>#generare un vettore casuale
>>>import random
>>> x=array([random.randint(1,100) for i in
range(10)])
>>> x
33
array([47, 37, 100, 33, 26, 23, 38, 10, 95, 65])
Operazioni di Algebra lineare (4)
• Siamo pronti adesso per lavorare con matrici
35
Operazioni di Algebra lineare (5)
• Siamo pronti adesso per lavorare con matrici
>>> x=ones((3,1))
>>> x
array([[ 1.],
[ 1.],
[ 1.]])
>>> c=dot(a,x) #prodotto matrice vettore
>>> c
array([[ 3.],
[ 3.],
[ 3.]])
>>> y=[1,2,3]
>>> z=diag(y)
array([[1, 0, 0],
[0, 2, 0],
36
[0, 0, 3]])
Utility per l’Algebra lineare in Python (1)
• Costruzione di un vettore:
– a = array([0, 1, 2, 3])
• Costruzione di una matrice 3x3:
– a = array([0, 1, 2], [3, 4, 5], [6, 7, 8])
• Vettore dei numeri da 0 a 10:
– a = arange(10)
• Vettore dei numeri da 10 a 100 a passi di 0.5:
– a = arange(10, 100, 0.5)
• Vettore di 100 numeri da 0 a pi greco:
– a = linspace(0, pi, 100)
• Matrice 3x4 di valori 0:
– a = zeros( (3, 4) )
• Matrice 3x4 di valori 1:
– a = ones( (3, 4) )
37
Utility per l’Algebra lineare in Python (2)
• Matrice di valori 0 con valori specifici sulla diagonale:
– a = diag([1, 2, 3, 4, 5])
• Matrice di valori 0 con valori specifici sulla terza
diagonale:
– a = diag([1, 2, 3, 4, 5], 3)
• Rango della matrice:
– a.ndim
• Dimensioni della matrice:
– a.shape (restituisce a.ndim valori)
• Numero di elementi nella matrice:
– a.size (equivale al prodotto di tutti i risultati di a.shape)
• Tipo degli elementi nella matrice:
– a.dtype
• Dimensione in byte di un elemento della matrice:
38
– a.itemsize
Utility per l’Algebra lineare in Python (3)
• Somma membro a membro:
– x = a + b, a += b
• Differenza membro a membro:
– x = a - b, a -= b
• Prodotto membro a membro:
– x = a * b, a *= b
• Prodotto matriciale:
– x = dot(a, b)
• Divisione membro a membro:
– x = a / b, a /= b
39
Esempi (1)
>>> import numpy as np
>>> a = np.arange(6).reshape((3, 2))
>>> a
array([[0, 1],
[2, 3],
[4, 5]])
>>> x = np.arange(4).reshape((2,2))
>>> x
array([[0, 1],
[2, 3]])
>>> np.transpose(x)
array([[0, 2],
[1, 3]])
40
Esempi (2)
>>> a
array([[ 0.18626021, 0.34556073, 0.39676747],
[ 0.53881673, 0.41919451, 0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595
>>> B = np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([ 1. , 2.71828183, 7.3890561 ])
>>> np.sqrt(B)
array([ 0. , 1. , 1.41421356]) 41
Funzioni in Python (1)
• Molte funzioni (che abbiamo già utilizzato)
appartengono a librerie e possono essere richiamate
attraverso l’istanza
from <nome_libreria> import <funzioni>
46
Cosa avvine in memoria?
• Ecco cosa avviene realmente in memoria
def ref_demo(x):
print "x=",x," id=",id(x)
x=42
print "x=",x," id=",id(x)
>> x = 9
>>> id(x)
41902552
>>> ref_demo(x)
x= 9 id= 41902552
x= 42 id= 41903752
>>> id(x)
41902552
47
Variabili Globali e Locali
• In python le variabili locali definite in funzioni non
vengono viste globalmente
total = 0; # Questa è una varibile globale
def sum( x, y ):
# funzione che fa la somma
total = x + y; # total è locale
print ”dentro la funzione : ", total
return total;
# richiamiamo sum
sum( 10, 20 );
print “Stampa di total fuori la funzione :”, total
• In esecuzione:
dentro la funzione : 30
Stampa di total fuori la funzione : 0 48
Variabili Globali e Locali
• In python le variabili locali definite in funzioni non
vengono viste globalmente
total = 0; # Questa è una varibile globale
def sum( x, y ):
# funzione che fa la somma
total = x + y; # total è locale
print ”dentro la funzione : ", total
return total;
# richiamiamo sum
sum( 10, 20 );
print “Stampa di total fuori la funzione :”, total
• In esecuzione:
dentro la funzione : 30
Stampa di total fuori la funzione : 0 49
Uso della ricorsione
• In python è possibile fare uso della ricorsine.
n=input(“dammi il numero degli elementi della succ”)
def fib(n): #successione di fibinacci
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
# fibonacci
print fib(n)
52
Ricorsione e complessità computazionale(3)
• Prendiamo i tempi scrivendo un file
fibonacci_runit.py
from timeit import Timer
for i in range(1,41):
s = "fib(" + str(i) + ")"
t1 = Timer(s,"from fibonacci import fib")
time1 = t1.timeit(3)
s = "fibi(" + str(i) + ")"
t2 = Timer(s,"from fibonacci import fibi")
time2 = t2.timeit(3)
print("n=%2d, fib: %8.6f, fibi: %7.6f,
percent: %10.2f" % (i, time1, time2, time1/time2)) 53
Ricorsione e complessità computazionale(4)
• Vediamo cosa succede con l’algoritmo 3
fibonacci_runit1.py
from timeit import Timer
from fibonacci import fib
for i in range(1,41):
s = "fibm(" + str(i) + ")"
t1 = Timer(s,"from fibonacci import fibm")
time1 = t1.timeit(3)
s = "fibi(" + str(i) + ")"
t2 = Timer(s,"from fibonacci import fibi")
time2 = t2.timeit(3)
print("n=%2d, fib: %8.6f, fibi: %7.6f, 54
percent: %10.2f" % (i, time1, time2, time1/time2))
Ricorsione e complessità computazionale(5)
https://www.python-course.eu/python3_recursive_functions.php
55
Esercizio (1)
• Soluzione di un equazione di secondo grado e
grafico.
import math
import numpy as np
import matplotlib.pyplot as plt
print "Programma per il calcolo delle equazioni di
secondo grado\n"
#LETTURA DEI COEFFICIENTI a, b E c
a = input("Inserisci il coefficiente a: ")
a = float(a)
b = input("Inserisci il coefficiente b: ")
b = float(b)
c = input("Inserisci il coefficiente c: ")
c = float(c)
#CALCOLO DEL DISCRIMINANTE delta
delta=math.pow(b,2)-4*a*c; 56
print "Il discriminante dell'equazione e: ", delta
Esercizio (2)
#SE IL DISCRIMINANTE delta E' MINORE DI 0
if delta < 0:
print "L'equazione non ha soluzioni!";
#ALTRIMENTI (SE IL DISCRIMINANTE delta E' MAGGIORE O
UGUALE A 0...)
else:
if a == 0:
x1 = -c/b
print "L'equazione e' di primo grado"
#STAMPA IL VALORE DELLA SOLUZIONE x1
print "x = ", x1
else:
#CALCOLA LA PRIMA SOLUZIONE x1
x1 = (-b+math.sqrt(delta))/(2*a)
57
Esercizio (3)
if delta == 0:
print "L'equazione ha due soluzioni
x1 ed x2 coincidenti (x1=x2)"
#STAMPA IL VALORE DELLA PRIMA
SOLUZIONE x1
print "x1 = x2 = ", x1
#ALTRIMENTI (SE IL DISCRIMINANTE delta E'
MAGGIORE DI 0...)
else:
#CALCOLA ANCHE LA SECONDA SOLUZIONE x1
x2 = (-b-math.sqrt(delta))/(2*a)
print "L'equazione ha due diverse
soluzioni x1 ed x2"
#STAMPA IL VALORE DELLA PRIMA
58
Esercizio (4)
#STAMPA IL VALORE DELLA PRIMA SOLUZIONE x1
print "x1 = ", x1
#STAMPA IL VALORE DELLA SECONDA SOLUZIONE x2
print "x2 = ", x2
59
Esercizio (5)
print "Ecco i valori assunti dalla parabola y
(l'equazione di secondo grado) per x che varia tra [-10,
10]";
N = 10
X=np.zeros(N*2+1)
Y=np.zeros(N*2+1)
for i in range(-N, N+1):
X[i+N]=i
Y[i+N]=a*math.pow(X[i+N],2)+b*X[i+N]+c
print "x[", i, "] = ", X[i+N], "y = [", i,
"] = ", Y[i+N]
plt.plot(X,Y)
plt.ylabel('Asse y')
plt.xlabel('Asse x')
plt.show()
60
Esercizio DFT (1)
import numpy as np
import time
def DFT_slow(x):
"""Compute the discrete Fourier Transform of the 1D
array x"""
x = np.asarray(x, dtype=float)
N = x.shape[0]
n = np.arange(N)
k = n.reshape((N, 1))
W = np.exp(-2j * np.pi * k * n / N)
#print " Matrice di Fourier \n"
#print W, "\n" 61
return np.dot(W, x)
Esercizio DFT(2)
print x,
print " \n Trasformata di Fourier di x con la DFT \n"
start = time.time()
x1=DFT_slow(x)
end = time.time()
print (end - start), "\n"
print x1,
print " \n Trasformata di Fourier di x con la FFT \n"
start1 = time.time()
x2=np.fft.fft(x)
end1 = time.time()
print (end1 - start1), "\n"
print x2,
62