





Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
IL DOCUMENTO CONTIENE INFORMAZIONI SUL FUNZIONAMENTO DEL PROGRAMMA PHYTON
Tipologia: Schemi e mappe concettuali
1 / 9
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!






Con le liste abbiamo il problema della condivisione di memoria; consideriamo due liste l1 e l2 e poniamo l2=l1, così facendo quando modifichiamo una delle due liste modifichiamo anche l’altra perché entrambe le liste sono allocate nella stessa area di memoria; si creerà un alias di memoria → che crea solo un altro nome per accedere alla stessa area di memoria. Consideriamo una lista: lista1=[1,3,6] consideriamo un'altra lista e la poniamo uguale a lista1: lista2=lista se effettuiamo una modifica su lista2 questa verrà apportata anche a lista1; perchè c’è condivisione di memoria, entrambe le liste occupano la stessa “porzione” di memoria lista2.append(8) print(lista1) #stamperà → [1,3,6,8] print(lista2) #stamperà → [1,3,6,8] se devo fare una copia di una lista devo usare il “servizio” copia: lista2 = copy.copy(lista1) Questo problema non si verifica se abbiamo a che fare con i numeri es: n1= n2=n print(n1) #stamperà → print(n2) #stamperà → n2+= print(n1) #stamperà → print(n2) #stamperà → Per importare una libreria: import “nome libreria” Posso usare tutte le funzioni presenti in quella libreria, per usarle: “nome libreria”.”nome funzione” VERSIONE RICORSIVA→ richiamo la stessa funzione ma con un input diverso Calcolo_Fattoriale def fattoriale_ric(n) : if n>=0: if n==0: return 1 → condizione d’uscita → è necessaria affinché la funzione possa interrompersi else: return n*fattoriale_ric(n-1) →richiama la funzione ma con un altro parametro else: return False
La funzione deve interrompersi prima o poi altrimenti le chiamate ricorsive non termineranno mai Le funzioni ricorsive non sono sempre efficienti Esecuzione programma: immaginiamo di voler calcolare il fattoriale di 3: il fattoriale di 3 è uguale al prodotto tra 3 e il fattoriale di 2, il fattoriale di 2 è uguale al prodotto tra 2 e il fattoriale di 1, il fattoriale di 1 è uguale al prodotto tra 1 e il fattoriale di 0. Una volta arrivati al calcolo del fattoriale di 0, il programma torna indietro ed esegue tutti i prodotti: 3!=32! 2!=21! 1!=10! 0!= torna indietro: (catene di ritorno) 1! = 0!1 = 1* 2! = 1!2 = (11)2= 3! = 2!3 = (112)*3= ITERAZIONE ripetizione di una serie di istruzioni usando un ciclo. CALCOLO NUMERO FIBONACCI (ricorsiva,iterativa,formula) La versione ricorsiva è molto lenta, già dovendo calcolare il 30° numero di fibonacci l’algoritmo impiega qualche secondo in più rispetto alla formula e alla versione iterativa; abbiamo poi osservato che per calcolare il 35° numero di Fibonacci l’algoritmo impiega qualche minuto prima di dare il risultato. Man mano che aumenta n, l’algoritmo impiegherà sempre più tempo. La versione ricorsiva è così lenta perchè da un punto di vista computazionale è inefficiente, in questo esempio la funzione dovrà chiamare se stessa 2^5 volte; aumentando n avremo 2^n chiamate; la funzione ha una crescita esponenziale. Come si può intuire una crescita esponenziale rende rapidamente inutilizzabile un programma richiedendo un tempo di esecuzione enormemente lungo per la sua terminazione indipendentemente dalla velocità della macchina fisica che lo esegue
def binarySearch(arr, left, right, key) : if right >= left : mid = left + (right - left) // 2
if arr[mid] == key : return mid
#metà destra elif arr[mid] < key : return binarySearch(arr, mid + 1, right, key)
#sinistra else: return binarySearch(arr, left, mid - 1, key) else : return - Questa funzione ha una complessità computazionale logaritmica. Si può scrivere sia la funzione ricorsiva che quella integrativa, in questo caso avranno lo stesso costo LIBRERIE Una libreria è una collezione di funzioni (funzioni che esegue calcoli, disegna grafici …); solitamente le librerie usano servizi di altre librerie; per importare una libreria, ed usare i servizi di quella libreria, digitiamo: import “nome librera” per importare solo alcune funzioni: from “nome libreria” import “nome funzione da importare” Python ci permette di scrivere dei commenti in modo particolare, per ricevere informazioni sulle funzioni della libreria
prende la libreria, e il nome della funzione del parametro
restituisce sono sempre commenti; se scrivo i commenti in questo modo python mi consente di usare un servizio che permette di generare l’help per questa libreria → se scrivo ciò python crea un “manuale” che descrive il funzionamento della funzione. Una volta scritta la mia libreria (quindi dopo aver scritto le funzioni), per utilizzarla basta aprire un nuovo file (questo deve essere contenuto nella stessa cartella dove è presente anche il file della libreria); e importare la libreria: import “nome libreria” COME SI INSTALLA UNA LIBRERIA:
bisogna aprire il prompt dei comandi (in Windows si chiama cmd) andare nella cartella dove ho installato python (lo visualizzo sul prompt) pip instal “nome libreria” MATPLOTLIB è una libreria che permette di realizzare grafici; ogni libreria ha la propria documentazione che ne spiega il funzionamento LISTA DI LISTA Una lista è un insieme di elementi accessibili tramite posizione, ogni elemento può essere, float, interi, stringhe… Ma gli elementi di una lista possono essere anche altre liste(lista di lista) , le liste di liste in python vengono usate per rappresentare le matrici MATRICI come si scrive una matrice: m=[[9,3,2],[6,8,4],[2,3,5]] per determinare il numero delle righe: len(m) indice prima riga: m[0] #stamperà →[9,3,2] indice ultima riga: len(m)-1 #stamperà → [2,3,5] numero di colonne: len(m[0]) primo elemento della matrice: m[0][0] # stamperà → 9 ultimo elemento della matrice: m[len(m)-1][len(m[0]-1)] # [len(m)-1] indica l’ultima riga; [len(m[0]-1)] indica l’ultima colonna per scorrere gli elementi di una matrice abbiamo bisogno di due cicli: uno scorre le righe, l’altro scorre le colonne TUPLES: le tuples sono liste non modificabili si indicano con le parentesi tonde e gli elementi sono separati da virgole es → t=(2,5,8,4,7) le tuple supportano: len(t) → per determinare il numero degli elementi print(t) → per stampare tutta la tupla max(t) → per determinare il valore massimo min(t) → per determinare il valore minimo in / not in→ per verificare se un elemento è presente o meno all’interno della tupla for i in range (0,len(t),1): print(t[i]) # per stampare tutti gli elementi della tupla Non essendo modificabili le tuple non ammettono comandi come append
s1.issuperset(s2) → restituisce True se s2 è un sottoinsieme di s s1.union(s2) → restituisce l’unione degli insiemi s1.intersection(s2) → restituisce l’intersezione degli insiemi s1.difference(s2) → restituisce la differenza tra gli insiemi (elementi di s1 non presenti in s2) s3 = s1.symmetric_difference(s2) → restituisce gli elementi dei due set senza quelli comuni a entrambi s1.update(s2) → aggiunge a s1 gli elementi di s s1.intersection_update(s2) → aggiorna s1 in modo che contenga solo gli elementi comuni a tutti gli insiemi s1.difference_update(s2) → rimuove da s1 tutti gli elementi di s s1.symmetric_difference_update(s2) → aggiorna s1 in modo che contenga solo gli elementi non comuni ai due insiemi clear → rimuove tutti gli elementi di un set DIZIONARI Si indicano con le parentesi graffe Gli elementi che costituiscono i dizionari si chiamano items → ogni item ha
d={‘a’: 2 , ‘b’: 3 , ‘c’: 4 ,} → chiavi valori Recuperare il valore di un item a partire dalla sua chiave valore=d[‘a’] #stamperà 2 Si possono usare i comandi: in / not in len(d) d[‘a’]=34 → sostituisco 34 a 2 d[‘x’]=56 → aggiungo ‘x’ : 56 al dizionario d.pop(‘x’,None) → se la chiave ‘x’ è presente rimuove l’item corrispondente, se la chiave non è presente stamperà “None” e non modificherà il dizionario Si può scorrere il dizionario per chiave: for chiave in d.keys( ): print(chiave) Si può scorrere anche per valore: for valore in d.values( ): print(valore) Scorrere il dizionario per items for item in d.items( ): key = item[0] value = item[1] print("item: ", item) print(key, value)
Scorrere il dizionario per item for k, v in d.items( ): print(k, v) d.clear( ) → rimuove tutti gli items di un dizionario PROGRAMMAZIONE ORIENTATA AGLI OGGETTI Insieme di oggetti, ogni oggetto ha delle proprietà (es: materiali, costi, proprietà termiche, proprietà meccaniche) e dei comportamenti, ogni oggetto ha associato una serie di lavorazioni. Bisogna prima definire gli oggetti e poi assegnare gli attributi. Con la programmazione orientata agli oggetti dobbiamo pensare ad un insieme di oggetti che interagiscono tra loro; ogni oggetto avendo il suo comportamento eseguirà determinati compiti; posso richiedere agli oggetti di svolgere determinati compiti e l’oggetto li eseguirà utilizzando dei metodi→(sono le funzioni fornite da quell’oggetto) La programmazione imperativa rimane valida perché permette di definire il comportamento degli oggetti e di come questi interagiscono tra loro. Però il focus è sull’oggetto (definire un insieme di oggetti considerando degli attributi, delle proprietà) Devo sempre distinguere la classe dalla specifica istanza; la classe è una definizione generale di come è fatta ad esempio una parete e poi abbiamo la specifica parete(altezza, colore, materiali…) io sto facendo un'istanza specifica della classe Le classi sono nuovi tipi di dati Gli oggetti interagiscono tra di loro per risolvere il problema; interagiscono tra di loro perché ogni oggetto ha le proprie ”funzioni” → METODI, i metodi mettono a disposizione degli altri oggetti; ogni oggetto può chiedere dei servizi ad altri oggetti invocando i suoi metodi Per definire una classe in python: class “nome classe”: quando definisco una classe il primo metodo che devo definire → permette di costruire le istanze della classe; questo metodo si chiama costruttore: metodo di inizializzazione def__init__(self, parametro1, parametro2…) con self ci riferiamo proprio all’oggetto che sto costruendo i vari parametri costituiscono gli attributi della classe nel metodo costruttore assegno i parametri che mi hanno passato agli attributi della classe self.parametro1 (parametro dell’istanza ) = parametro1 (parametro della classe) self.parametro2 = parametro STAMPA DELLE FUNZIONI bisogna creare un metodo questo è l’esempio della classe studente def scheda_personale(self): stringa_per_stampa = "Scheda studente\n Nome:"+self.nome+"\n Cognome:"+self.cognome+"\n Corso di Studi:"+self.corso_di_studi+"\n" return stringa_per_stampa