Laboratorio di Python -...
-
Upload
nguyenliem -
Category
Documents
-
view
225 -
download
0
Transcript of Laboratorio di Python -...
Esercizio 1 per casa
Scrivere una funzione che verifica se una lista e ordinata in modocrescente (≤) (supponiamo che la lista contenga oggetti ordinabili)
1 def ordinataCrescente(L):
2 i f l e n (L)==0:
3 r e t u r n True
4 f o r i i n range (1, l e n (L)):
5 i f L[i]<L[i-1]:
6 r e t u r n False
7 r e t u r n True
Esercizio 1 per casa
Scrivere una funzione che verifica se una lista e ordinata in modocrescente (≤) (supponiamo che la lista contenga oggetti ordinabili)
1 def ordinataCrescente(L):
2 i f l e n (L)==0:
3 r e t u r n True
4 f o r i i n range (1, l e n (L)):
5 i f L[i]<L[i-1]:
6 r e t u r n False
7 r e t u r n True
Esercizio 2 per casa
Scrivere una funzione che presi come parametri due liste ordinate inmodo crescente (verificarlo usando la funzione dell’esercizio precedente)ne crei una terza, anch’essa ordinata, dall’unione delle due.
Esercizio 2 per casa I
1 import Es1L08 as ol
2
3 def unisciOrdinate(L1, L2):
4 i f (not ol.ordinataCrescente(L1)) or (not ol
.ordinataCrescente(L2)):
5 p r i n t ("Le liste devono essere ordinate
in modo crescente")
6 r e t u r n None
7 LR = []
8 i = 0
9 j = 0
10 w h i l e i< l e n (L1) and j< l e n (L2):
11 i f L1[i]<=L2[j]:
12 LR.append(L1[i])
13 i+=1
14 e l s e :
15 LR.append(L2[j])
16 j+=1
Esercizio 2 per casa II
17
18 i f i< l e n (L1):
19 LR = LR + L1[i:]
20 e l s e :
21 LR = LR + L2[j:]
22
23 r e t u r n LR
Esercizio 3 per casa
Scrivere una funzione ripetis(s) che data una lista di numeri naturalis, restituisce una nuova lista in cui compaiono gli stessi elementi di s enello stesso ordine, ma ciascun s[i] e ripetuto s[i] volte. (Esempio: da[3,0,2] si deve ottenere [3,3,3,2,2].)
1 def ripetis(s):
2 res = []
3 f o r e i n s:
4 res += [e]*e
5 r e t u r n res
1 #a l t e r n a t i v a2 def ripetis2(s):
3 res = []
4 f o r e i n s:
5 f o r i i n range (e):6 res.append(e)
7 r e t u r n res
Esercizio 3 per casa
Scrivere una funzione ripetis(s) che data una lista di numeri naturalis, restituisce una nuova lista in cui compaiono gli stessi elementi di s enello stesso ordine, ma ciascun s[i] e ripetuto s[i] volte. (Esempio: da[3,0,2] si deve ottenere [3,3,3,2,2].)
1 def ripetis(s):
2 res = []
3 f o r e i n s:
4 res += [e]*e
5 r e t u r n res
1 #a l t e r n a t i v a2 def ripetis2(s):
3 res = []
4 f o r e i n s:
5 f o r i i n range (e):6 res.append(e)
7 r e t u r n res
Esercizio 4 per casa
Scrivere una funzione analoga analoga alla precedente, ma che modificala lista s.
1 def ripetisposto(s):
2 i = 0
3 w h i l e i< l e n (s):
4 e = s[i]
5 d e l s[i]
6 s[i:i] = [e]*e #i n s e r i m e n t o s o t t o l i s t a7 i = i+e
Esercizio 4 per casa
Scrivere una funzione analoga analoga alla precedente, ma che modificala lista s.
1 def ripetisposto(s):
2 i = 0
3 w h i l e i< l e n (s):
4 e = s[i]
5 d e l s[i]
6 s[i:i] = [e]*e #i n s e r i m e n t o s o t t o l i s t a7 i = i+e
Matrici come liste di listeCome possiamo rappresentare un matrice Ar×c in Python? Per esempio,la matrice A3×2:
A =
0 13 25 6
puo essere rappresentata come una lista di liste.A = [[0,1],[3,2],[5,6]]
Notiamo che:
I la notazione e coerente: quanto vale A[1][1]? (Nb: ricordate, inInformatica si parte da 0...)
I len(A) = 3, len(A[0]) = 2
Semplificazione: I vettori (matrici unidimensionali) sono vettori riga evengono rappresentati come una lista che ha come primo elemento unalista. Dunque:
I [1, 2, 3] e una lista di numeri, ma non una matrice (e dunqueneanche un vettore riga)
I [[1, 2, 3]] e un vettore riga, cioe una matrice
I [[1], [2], [3]] e un vettore colonna, trasposto del precedente.
Semplificazioni e suggerimenti
I In tutti gli esercizi seguenti – se non diversamente specificato –supporremo per brevita che l’utente inserisca matrici e vettori ”benformati” (dunque con la sintassi espressa in precedenza, tutte lerighe della stessa lunghezza, elementi tutti numerici...)
I Nel codice allegato alla lezione verranno fornite anche le funzioninecessarie a controllare che l’input rappresenti matrici e vettori ”benformati”
I Gli esercizi seguenti sono tutte funzioni ausiliarie necessarie percalcolare il prodotto tra due matrici
I Consiglio: svolgere tutti gli esercizi nello stesso file chiamatomatrici.py
Esercizio
Scrivere una funzione che stampa una matrice presa come parametroEsempio se A = [[10000,12],[3,2],[5,6]] stampa esattamente:
10000 12
3 2
5 6
Suggerimento: usare print(e, end='\t')
Esercizio
1 def stampaMatrice(M):
2 f o r riga i n M:
3 f o r e i n riga:
4 p r i n t (e, end='\t')5 p r i n t () #a capo dopo o g n i r i g a
O con indici espliciti:
1 def stampaMatrice(M):
2 f o r i i n range ( l e n (M)):
3 f o r j i n range ( l e n (M[i]):
4 p r i n t (M[i][j], end='\t')5 p r i n t () #a capo dopo o g n i r i g a
Esercizio
Scrivere una funzione che, presi come parametri due liste (non vettoririga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola erestituisce il prodotto scalare, oppure None.
1 def molt_liste(U,V):
2 i f l e n (U)== l e n (V):
3 pr_sc = 0
4 f o r i i n range ( l e n (V)):
5 pr_sc = pr_sc + (U[i]*V[i])
6 r e t u r n pr_sc
7 e l s e :
8 r e t u r n None
Esercizio
Scrivere una funzione che, presi come parametri due liste (non vettoririga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola erestituisce il prodotto scalare, oppure None.
1 def molt_liste(U,V):
2 i f l e n (U)== l e n (V):
3 pr_sc = 0
4 f o r i i n range ( l e n (V)):
5 pr_sc = pr_sc + (U[i]*V[i])
6 r e t u r n pr_sc
7 e l s e :
8 r e t u r n None
Un’altra possibile soluzione in stile Python
1 def molt_liste_2(U,V):
2 i f l e n (U)== l e n (V):
3 pr_sc = 0
4 f o r eu , ev i n z i p (U, V): #l o p o s s o f a r ep e r c h e ' hanno l a s t e s s a l e n
5 pr_sc = pr_sc + eu*ev
6 r e t u r n pr_sc
7 e l s e :
8 r e t u r n None
Esercizi da una riga
Scrivere tre funzioni:
I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue righe
I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue colonne
I Una funzione che verifica se due matrici prese come parametripossono essere moltiplicate tra loro
1 def righe(M):
2 r e t u r n l e n (M)
3
4 def colonne(M):
5 r e t u r n l e n (M[0])
6
7 def sono_matr_molt(M,N):
8 r e t u r n colonne(M) == righe(N)
Esercizi da una riga
Scrivere tre funzioni:
I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue righe
I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue colonne
I Una funzione che verifica se due matrici prese come parametripossono essere moltiplicate tra loro
1 def righe(M):
2 r e t u r n l e n (M)
3
4 def colonne(M):
5 r e t u r n l e n (M[0])
6
7 def sono_matr_molt(M,N):
8 r e t u r n colonne(M) == righe(N)
Esercizio
Scrivere una funzione che calcola e restituisce la trasposta di una matricepresa come parametro.
Soluzione
1 def trasposta(M):
2 MT = []
3 r = righe(M)
4 i f r == 0: #v u o t a5 r e t u r n MT
6 e l s e :
7 c = colonne(M)
8 f o r i i n range (c): #c i c l o s u l l e c o l o n n e9 col = [] #i−ma c o l o n n a
10 f o r j i n range (r): #c i c l o s u l l er i g h e
11 col.append(M[j][i])
12 #o r a i n c o l ho l a i−ma c o l o n n a , c h ed i v e n t a l ' i−ma r i g a
13 MT.append(col)
14 r e t u r n MT
Esercizio
Scrivere una funzione che restituisce la matrice prodotto tra due matriciprese come parametri (se non sono moltiplicabili, stampa un messaggio dierrore e restituisce None).
Suggerimento: usare la matrice trasposta per fare il prodotto scalare trale righe di A e le righe della trasposta di B.
Soluzione
1 def molt_mat(A,B):
2 i f sono_matr_molt(A,B): # s e s o n o m o l t .3 AB = [] #p r o d o t t o4 BT = trasposta(B) #t r a s p o s t a d i B5 f o r i i n range (righe(A)): #r i g . d i A ( e
AB)6 riga = [] #i−ma r i g a d i AB7 #j s c o r r e r i g h e d i BT (= c o l d i B e AB
)8 f o r j i n range (righe(BT)):9 ij = molt_liste(A[i],BT[j])
10 riga.append(ij) #e l e m e n t o i nr i g a
11 AB.append(riga) #r i g a i n r i s u l t a t o12 r e t u r n AB
13 e l s e :
14 p r i n t ("Matrici non moltiplicabili")
15 r e t u r n None
Comunicazioni di servizio
Il prossimo laboratorio (Lab10 - Venerdı 13 aprile) avra come argomentola ricorsione.
Ripassare gli appunti presi e gli esercizi svolti a lezione e fare domande.
Esercizi per casa (per il 13/04/2018 ore 8:59)(Mail: Lab09-..........)
Anche usando le funzioni viste a lezione:
1. Scrivere una funzione che determina se il suo parametro e unamatrice quadrata
2. Scrivere una funzione che prende come parametri una matrice e unnumero (verificare che lo sia) e restituisce una nuova matrice checostituisce il prodotto della matrice per quel numero. Non modificala matrice originale.
3. Scrivere una funzione che prende come parametri (tralasciare leverifiche)
I una matrice non vuota di interiI un intero n
e restituire la coppia (i,j) che identifica la posizione del primoelemento (leggendo la matrice per righe) che, sommato a tutti i suoiprecedenti, dia come risultato un valore > n.Se tale elemento non esiste, perche la somma di tutti gli elementi eminore di n, restituire la coppia (+∞,+∞)(Suggerimento: Usare float('inf') o math.inf)Non modificare la matrice ne usare altre liste. Usare il ciclo whilema non il ciclo for.