Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Guida alla Sintassi delle Funzioni in Python: Librerie, Stringhe e Liste, Appunti di Informatica gestionale

Una panoramica sulla sintassi delle funzioni in python, coprendo librerie predefinite, standard e addizionali. Esplora l'importazione di moduli, operazioni matematiche, funzioni del modulo math, conversione da virgola mobile a intero, stringhe, sequenze di escape e cicli. Approfondisce l'uso di liste, tabelle, insiemi e la definizione di funzioni, inclusi l'ambito di visibilità delle variabili e le tecniche di collaudo. Un'utile guida per comprendere e applicare le funzioni in python.

Tipologia: Appunti

2023/2024

Caricato il 19/06/2025

lorenzo-neri-10
lorenzo-neri-10 🇮🇹

3 documenti

1 / 30

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
APPUNTI
Informatica
(Programmazione)
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Anteprima parziale del testo

Scarica Guida alla Sintassi delle Funzioni in Python: Librerie, Stringhe e Liste e più Appunti in PDF di Informatica gestionale solo su Docsity!

APPUNTI

Informatica

(Programmazione)

Processo di programmazione La programmazione L’informatica è la scienza che si occupa dello studio della rappresentazione e manipolazione dell’informazione, in particolare di quella digitale, in cui tutto diventa “bit”, ovvero una cifra binaria, ovvero uno dei due simboli del sistema numerico binario: 0, 1.

Calcolatori elettronici

Un calcolatore elettronico è composto da due parti: hardware e software. Hardware Comprende gli elementi fisici di un sistema di elaborazione e comprende:

  • CPU (central processing unit): controlla l’esecuzione del programma e l’elaborazione di dati;
  • Dispositivi di memoria : memoria interna (RAM) e la memoria secondaria (HDD, flash disk);
  • Dispositivi di ingresso ( input ): mouse, tastiera, stampante ecc.
  • Dispositivi di uscita ( output ): monitor, casse audio ecc. Software Sequenza di istruzioni e decisioni, implementata in qualche linguaggio e tradotta in una forma che possa essere eseguita nel computer, serve per gestire i dati utilizzati dalle varie istruzioni. Le istruzioni più semplici vengono raggruppate per eseguire compiti più complessi. Un programma consiste in un numero elevato di istruzioni primitive e indica al computer la sequenza di passi necessaria a completare un determinato compito. La programmazione si occupa quindi di progettare, implementare e verificare i programmi. Come si esegue un programma? Le istruzioni di un programma sono memorizzate in formato digitale nella memoria, dove la CPU riesce a leggerlo (legge anche gli input dell’utente) e ad eseguire un’istruzione per volta. Cosa vuol dire programmare? Programmare consiste nello scrivere un “documento” (file sorgente) che descrive la soluzione al problema considerato. Non esiste una sola soluzione, ma l’obiettivo è di trovare quella più efficiente. Come si programma? Programmare è un’attività creativa ma complessa, che richiede la sequenza di determinate fasi: 𝑃𝑟𝑜𝑏𝑙𝑒𝑚𝑎 ⟶ 𝑆𝑜𝑙𝑢𝑧𝑖𝑜𝑛𝑒 𝑖𝑛𝑓𝑜𝑟𝑚𝑎𝑙𝑒 ⟶ 𝑆𝑜𝑙𝑢𝑧𝑖𝑜𝑛𝑒 𝑓𝑜𝑟𝑚𝑎𝑙𝑒 ⟶ 𝑃𝑟𝑜𝑔𝑟𝑎𝑚𝑚𝑎

Introduzione a Python

Python è un linguaggio progettato da Guido van Rossum per avere un linguaggio che permettesse di creare rapidamente i programmi e modificarli in modo semplice, con una sintassi più pulita degli altri linguaggi come Java, C, C++. I programmi Python sono eseguiti dall’interprete Python. Si può creare un programma:

  • Usando un sistema integrato di sviluppo (IDE, Integrated Development Environment) es. Pycharm;
  • Usando un semplice editor di testi es. Blocco note, Notepad++, Atom, vi, gedit ecc.

Dal sorgente all’esecuzione del programma

Il compilatore legge il programma e genera le istruzioni binarie, byte code, semplici istruzioni per la Macchina Virtuale Python, un programma che si comporta come la CPU del computer (esegue istruzioni in software). Ogni libreria necessaria (es. la grafica) viene automaticamente trovata ed inclusa dalla macchina virtuale.

Sintassi per le funzioni Python

Per usare una funzione in Python occorre specificare il nome della funzione che vogliamo usare, tutti i valori (argomenti, parametri) racchiusi tra parentesi tonde di cui la funzione ha bisogno per svolgere il proprio compito. Se ci sono più argomenti, separarli con le virgole e lo spazio. Stringhe : sequenza di caratteri racchiusa tra apici (‘ciao’) o virgolette (“ciao”)

Variabili

Una variabile è una zona di memoria dotata di un nome in un programma che fa riferimento ad un valore specifico e si definisce dicendo all’interprete il nome scelto e il valore iniziale, assegnato tramite l’istruzione di assegnazione (=), che non rappresenta un confronto (==). È importante che una variabile, prima di essere utilizzata, debba essere definita sopra la linea di codice dove la si usa per la prima volta, altrimenti il sistema darà errore. Il nome scelto può apparire sia a sinistra e sia a destra del segno =, e avrà come valore, l’ultimo assegnato. Esempio: lattine = 4 #attualmente le lattine sono 4 lattine = lattine + 2 #da questa riga in poi le lattine saranno 6 Abbiamo visto tre diversi tipi di dato, associato al valore, non alla variabile, infatti:

  • a = 7 (numero intero #int)
  • b = 8.88 (numero con parte frazionaria #float, anche 8.0)
  • “Bob” (sequenza di caratteri #str) ATTENZIONE: non possono essere sommati un valore #int o #float e un valore #str. Numero Tipo Commento 1E6 float (^) Numero in notazione esponenziale: 1 × 106 2.96E- 2 float Numero in notazione esponenziale: 2. 96 × 10 −^2 100,000 \ Errore : non usare la virgola o il punto per le migliaia 3 1/2 \ Errore : non usare frazioni, ma solo notazione decimale (scrivere 3.5) Per assegnare i nomi alle variabili bisogna seguire delle semplici regole:
  1. Iniziare con una lettera o con il carattere underscore (_);
  2. Non si possono usare altri simboli, come ?, %, né gli spazi;
  3. Separare le parole secondo la convenzione ‘camelCase’ oppure con un underscore (_);
  4. Non utilizzare le parole “riservate” di Python (vedere Appendice C, pag. A6, A7).

Costanti

Le costanti sono variabili che non andrebbero modificate. Per convenzione, si indicano con caratteri maiuscoli (es. PIGRECO), Python permette comunque di modificarle e sono molto utili perché piuttosto che inserire in un’operazione un numero, mettendo la costante, si riconosce subito il motivo del calcolo.

Aritmetica

Python supporta tutte le operazioni aritmetiche elementari. Si possono utilizzare le parentesi per scrivere le espressioni e la precedenza delle operazioni è simile a quella algebrica. Inoltre, se viene diviso un #int e un #float, il risultato sarà un #float. Se si dividono due #int, il risultato sarà un #float. Con la divisione intera viene ignorata la parte frazionaria, dando solo quella intera arrotondata per difetto. Se si è interessati al resto, si utilizza %, talvolta detto modulo. Consigli per utilizzare la divisione intera e il resto Espressione (n = 1729) Valore Commento n % 10 9 Per qualsiasi numero intero positivo n, n % 10 è l’ultima cifra di n n // 10 172 Questo è n senza la sua ultima cifra n % 100 29 Le ultime due cifre di n n % 2 1 Se vale 0, n è pari, se vale 1 n è dispari

  • n // 10 - 173 Il più grande numero intero che sia ≤ 172. 9 Funzioni matematiche predefinite Funzione Restituisce abs(x) Valore assoluto di x round(x) Valore di x arrotondato per difetto se la parte intera è ≤ 5 , per eccesso se è > 5 round(x, n) Valore che abbia n cifre decimali e arrotonda per difetto se la prima cifra di posizione n+1 è < 5 , per eccesso se è ≥ 5 max(𝑥 1 , 𝑥 2 , … , 𝑥𝑛) Valore maggiore tra i presenti min(𝑥 1 , 𝑥 2 , … , 𝑥𝑛) Valore minore tra i presenti

Librerie di Python

Una libreria è una raccolta di un codice (funzioni, costanti, tipi di dato), scritto e compilato da terzi. Distinguiamo diverse tipologie di librerie:

  • Libreria predefinita : sempre disponibile ⟶
  • Libreria standard : fa parte di ogni installazione Python, organizzata in moduli, ogni modulo contiene più funzioni, che prima di essere utilizzate, deve essere importato il modulo;
  • Libreria addizionali : non fanno parte di Python, devono essere installate nel progetto (usando l’IDE o la linea di comando) e dopo essere state installate, possono essere importate ed è possibile usare le funzioni. Come importare i moduli? Ci sono tre modi: from “modulo” import “funz1, funz2 ecc.” Si importa una lista di funzioni dal modulo from “modulo” import * Si importano tutte le funzioni dal modulo import “modulo” Si importa il modulo che dà accesso a tutte le funzioni Quando si usa il terzo metodo, bisogna aggiunge il nome del modulo e un punto prima della funzione: import “modulo” y = modulo.funzione(x) Operazione Simbolo Addizione + Sottrazione - Moltiplicazione * Divisione / Divisione intera // Resto (modulo) % Potenza **

Se volessimo estrarre una porzione di una stringa , allora utilizzeremo la funzione nome[x : y], dove x è incluso e y è escluso, quindi prenderà i caratteri dall’indice x fino a y-1. Analizziamo adesso casi particolari: nome[ : 6] Prenderà la porzione dal carattere 0, cioè dal primo, al carattere 5 nome[6 : ] Prenderà la porzione dal carattere 6 al carattere len(nome) – 1, cioè all’ultimo nome[ : ] Prenderà tutti i caratteri, dal primo all’ultimo Nelle porzioni è possibile indicare un terzo argomento, con struttura: stringa[ start : stop : step] Es. nome[2 : 8 : 2] significa che restituisce i valori da 2 a 8 ogni 2, quindi i caratteri 2, 4, 6. nome[ : : 2] Restituisce tutti i caratteri di indice pari nome[1 : : 2] Restituisce tutti i caratteri di indice dispari Se lo step è negativo, allora utilizzo un intero negativo, ovviamente col primo termine più grande del secondo. Es. nome[9 : 3 : - 1], oppure per avere tutta la stringa in ordine inverso nome[ : : - 1].

Caratteri

I caratteri sono memorizzato come valori interi e Python utilizza i caratteri Unicode. Questi caratteri sono racchiusi del subset ASCII nella tabella Unicode, che contiene oltre 100,000 caratteri. Possiamo passare dal carattere al valore unicode e viceversa:

  • ord(c): passare dal carattere al codice ASCII
  • chr(i): passare dal codice ASCII al carattere

Funzioni vs metodi

Python è un linguaggio orientato agli oggetti ( object-oriented ), quindi tutti i valori sono oggetti. Ogni oggetto può avere metodi, cioè funzioni che possono essere chiamate su quegli oggetti specifici, usando la sintassi object.method(). Esempi: name = “Giacomo” uppercaseName = name.upper() #portando tutti i caratteri maiuscoli lowercaseName = name.lower() #portando tutti i caratteri minuscoli Mentre le funzioni sono generali e possono accettare argomenti di diverso tipo, i metodi sono specifici per diversi tipi di oggetti. Le funzioni sono chiamate direttamente, con un elenco di parametri, mentre i metodi sono chiamati con la notazione del punto. Entrambi restituiscono un risultato che può essere salvato in una variabile. Esempio: se volessi applicare una funzione o un metodo alla variabile a, bisogna scrivere:

  • print(a) funzione
  • a.upper() metodo

Sequenze di escape

Come visualizzare le virgolette? print(“Ha detto \”ciao\””) Come visualizzare il backslash ( \ )? print(“C:\Temp\Secret.txt”) Caratteri speciali nelle stringe, come andare a capo: print(“\n\n**”)

Input

È possibile leggere una stringa dalla console con la funzione input(“…”). Se serve un input numerico, si deve convertire la stringa in un number, o facendo due righe di codice inserendo prima la stringa e poi la conversione della variabile da stringa a numero con int() o float() oppure in una singola riga combinando int(input(“…”)) oppure float(input(“…”)).

Output Formattato

Talvolta è opportuno inserire dei valori numerici in stringhe di testo in modo da ottenere un output più chiaro e ordinato da visualizzare. Per fare ciò possiamo utilizzare varie metodologie, vediamo le applicazioni.

F-strings Strings precedute da una f o una F, in cui possiamo inserire delle variabili dentro {}. Mentre le classiche stringhe hanno normalmente un valore costante, le f- strings sono praticamente espressioni valutate al momento dell’esecuzione. All’interno delle {} posso inserire:

  • variabili : definite nelle linee di codice precedenti. Es. print(f “il risultato è {a}”)
  • espressioni aritmetiche : contenenti due o più variabili. Es. print(f “il risultato è {a + b}
  • variabile= : aggiungendo il simbolo = darà variabile = valore. Es. print(f “il risultato è {a=}”) è possibile modificare il formato in cui vengono stampati i valori, utilizzando degli specificatori di formato, che vengono inclusi all’interno delle {} e separati dai :. Se volessi stampare un float solo con le prime due cifre decimali scriverò print(f “il numero è {a:.2f}). Vediamo altri esempi:
  • Ampiezza (intero) = {datoInt:20} dove datoInt è una variabile e 20 è il numero di caratteri
  • Precisione = {a:8.2} stamperà 8 caratteri e il numero a con 2 cifre decimali
  • Conversione intero decimale {a:20d}, conversione intero esadecimale (base 16) {a:20x}, conversione float notazione fissa {a:8.2f}, conversione float notazione esponenziale {a:8.2e}.
  • Allineamento a sinistra <, allineamento a destra >, allineamento al centro ^. Es. {a:^20}

Istruzione if

In un programma è spesso necessario prendere delle decisioni in base al valore di ingresso o di variabili interne. Questa istruzione deve essere eseguita con la sintassi: if : <conseguenza 1> else: Tradotto: se è vera condizione, esegui conseguenza1, altrimenti esegui conseguenza2. È importante specificare che le conseguenze sono “ indentate ” con degli spazi e che else è facoltativo. Per l’indentazione non ci sono regole, basta che ci sia almeno uno spazio (su Python obbligatoriamente, altrimenti il compilatore genererà un errore di indentazione), di solito si utilizza TAB, mai mischiare TAB e spazi, altrimenti il compilatore si confonde. Compound Statement Alcuni costrutti Python sono compound statement ( istruzioni composte ) proprio come l’if, con lo schema: Si sviluppano su più di una riga di codice e consistono di un header e di un blocco istruzioni. Richiedono ( : ) dopo l’header. Il blocco istruzioni è un insieme di una o più istruzioni, tutte con la stessa indentazione. Il blocco di istruzioni inizia sulla riga dopo l’header e termina alla prima istruzione MENO indentata. I blocchi di istruzioni sono indentati anche per fornire all’utente un aiuto visivo nel capire la logica e il flusso del programma. Un classico errore è quello di duplicare il codice nelle diramazioni, ad esempio:

Variabili e operatori Booleani

Illuminismo: Boole cercò di razionalizzare ogni cosa della quotidianità con linguaggio logico-matematico, basato esclusivamente su enunciati che potevano essere veri o falsi. In Python, il tipo di dato bool può avere solo due valori: True / False (infatti if è un valore Booleano) ed è spesso utilizzata come flag (indicatore). Operatori Booleani principali: and, or, not, usati per combinare diverse condizioni Booleane:

  • And : entrambe le condizioni devono essere VERE affinché il risultato sia VERO;
  • Or : almeno una delle condizioni deve essere VERA affinché il risultato sia VERO;
  • Not : invertire una variabile booleana o il risultato di un confronto (nega la variabile). Proprietà: (simile a quanto affrontato in Analisi Matematica 1)
  • Commutativa: A and B = B and A / A or B = B or A
  • Associativa: A and B and C = (A and B) and C = A and (B and C) / A or B or C = (A or B) or C = A or (B or C)
  • Distributiva: A and (B or C) = A and B or A and C / A or (B and C) = (A or B) and (A or C)
  • Leggi di De Morgan: not (A and B) = not (A) or not (B) / not (A or B) = not (A) and not (B).

Analisi di stringhe

Se volessi sapere se una stringa contiene al suo interno una certa sottostringa, possiamo utilizzare l’op in. name = “John Wayne” “Way” in name Ritorna VERO perché la sottostringa “Way” appare all’interno della variabile stringa name. Operazioni per analizzare sottostringhe Operazione Descrizione sottostringa in s True se la stringa s contiene sottostringa, altrimenti False s.count (sottostringa) Restituisce il numero di ricorrenze non sovrapposte di sottostringa in s s.endwith(sottostringa) True se la stringa s finisce con sottostringa, altrimenti False s.find(sottostinga) Valore più basso in cui ricorre sottostringa in s, altrimenti restituisce - 1 s.startwith(sottostringa) True se la stringa s inizia con sottostringa, altrimenti False Metodi per testare le caratteristiche di una stringa Metodo Descrizione s.isalnum() True se la stringa s contiene almeno un carattere e solo lettere o cifre, else: False s.isalpha() True se la stringa s contiene almeno un carattere e solo lettere, else: False s.isdigit() True se la stringa s contiene almeno un carattere e solo cifre, else: False s.islower() True se la stringa s contiene almeno una lettera e tutte le lettere sono minuscole, else: False s.isspace() True se la stringa s contiene almeno un carattere e ha solo spazi (tab, newline), else: False s.isupper() True se la stringa s contiene almeno una lettera e tutte le lettere sono maiuscole, else: False

Validazione degli input

Il confronto, l’analisi di stringhe è utile a circoscrivere il campo di esistenza dei valori di input. Non bisogna mai fidarsi dell’input dell’utente, ovvero non assumere mai che quello che viene dato in input sia corretto o accettabile; quindi, è spesso necessario porre dei limiti, inserendo delle condizioni in cui il programma metta in output informazioni del tipo “Valore non accettabile” oppure “Riprova” ecc.

Cicli

Ciclo while

I cicli sono utilizzati per ripetere diverse volte lo stesso blocco di istruzioni con valori diversi dalle variabili, fino a che una condizione di ingresso non diventa falsa, caso in cui si esce dal ciclo e si procede con le iterazioni successive. A fianco possiamo osservare un ciclo while in flowchart, in cui possiamo vederne gli elementi. Distinguiamo diversi tipi di cicli:

  • Controllato da un contatore : un ciclo while controllato da un contatore, usato se a noi interessa che il ciclo si ripeta un n numero di volte. Dichiarando il contatore = 1, se scriviamo while contatore <= 1 0 : contatore = contatore + 1, il ciclo si ripeterà 10 volte.
  • Ciclo ad evento : nel caso in cui il ciclo si ripete fin quando un valore o una condizione non si verifica, come ad esempio fin quando una variabile dichiarata inizialmente non raggiunge un determinato valore. Errori comuni:
  • porre condizioni irraggiungibili (ciclo infinito),
  • porre condizioni che già sono rispettate (il ciclo non parte),
  • confondere la condizione vera dalla condizione falsa (nel while bisogna inserire la condizione in cui deve RIPARTIRE il ciclo, non quando deve finire),
  • non aggiornare la variabile su cui viene fatto il test all’interno del ciclo (la variabile rimane costante e il ciclo andrà all’infinito), Per quanto riguarda i contatori, DI SOLITO si usano 0 o 1, più volte 0, ma bisogna ricordare che:
  • se inseriamo 0, allora dobbiamo porre il contatore < al numero di volte che ci interessa;
  • se inseriamo 1, allora dobbiamo porre il contatore <= al numero di volte che ci interessa.

Cicli misti

Non sempre i cicli sono controllati da un solo contatore o da un evento, anzi spesso può capitare di dover combinare più condizioni. Per gestire questo mix di condizioni potrebbe essere utile definire una variabile booleana che inizialmente è vera, ma che poi diventa falsa nel caso si verificasse una condizione in un if all’interno del ciclo. Vediamo un esempio: Interruzione anticipata di un ciclo

  • Break : il ciclo viene interrotto senza completare l’iterazione corrente, anche se non sono state fatte tutte le iterazioni necessarie, e l’esecuzione continua con le istruzioni successive al ciclo.
  • Continue : se all’interno di un ciclo si inserisce l’istruzione non viene completata l’iterazione corrente e il ciclo continua con l’iterazione successiva.

Valori Sentinella

Sono valori particolari che vengono usati per indicare un particolare evento. Vengono utilizzati principalmente per circoscrivere un insieme di valori validi per l’input. Alcuni programmatori non amano inizializzare la variabile di input ad un valore diverso dalla sentinella, ma preferiscono precaricare la variabile con una lettura iniziale fuori dal ciclo. Quindi invece di porre prima del ciclo a = 0, inserire direttamente l’input a = input(“Inserire:”), anche per avere comunque un valore iniziale valido e inserito dall’utente, non stabilito dal programmatore. Per permettere all’utente di inserire altri dati e far continuare il ciclo, si mette alla fine un altro input. Quindi se nel while la variabile è a, alla fine del ciclo bisogna inserire a = input(“Inserire:”).

Ciclare su indice e valore

Fino a ora abbiamo analizzato due modi per utilizzare il for: uno consiste nel ciclare tutti gli elementi di un insieme, accedendo direttamente a ogni iterazione all’elemento da analizzare, il secondo consiste in un ciclo basato sull’indice, che poi verrà usato per accedere all’elemento che mi serve. Queste due soluzioni sono alternative e ottengono lo stesso risultato, però ci sono delle situazioni in cui può essere utile avere nello stesso momento entrambe le informazioni (elemento da elaborare e la sua posizione nell’insieme = indice). Per le conoscenze attuali, dovremmo usare delle variabili aggiuntive, ad esempio se gestisco il ciclo tramite l’indice, devo poi salvarmi l’elemento in una variabile. Viceversa, se ciclo sugli elementi, devo generare una variabile che indica il valore dell’indice corrente. Soluzioni fattibili ma scomode. Per risolvere questo problema posso utilizzare la funzione enumerate e si applica a tutti gli insiemi enumerabili. La funzione ritorna ad ogni iterazione due informazioni: indice dell’elemento e l’elemento stesso (questo dato è chiamato tupla). Struttura : for (indice, lettera) in enumerate(insieme). Esempio: nome = “Paolo” for (i, lettera) in enumerate(nome): print(i, lettera) Questo codice stamperà sia la posizione della lettera, sia la lettera corrispondente. Infatti, la funzione enumerate trasforma un contenitore in una sequenza di coppie, in questo caso: 0 P, 1 a, 2 o, 3 l, 4 o.

Cicli annidati

Come abbiamo fatto con gli if, possiamo annidare anche un ciclo all’interno di un altro. Può rivelarsi utile quando vogliamo analizzare delle celle di una tabella, in cui il ciclo più esterno itera sulle righe della tabella e il ciclo più interno processa le colonne nella riga corrente. A fianco possiamo vedere il diagramma di flusso. Se volessimo stampare una tabella, dovremmo prima stampare l’header, in cui ci sono i parametri generali (con le variabili) e poi, andando ogni volta a capo, inserire i dati sostituendo i numeri alla variabile. Scrivendo quindi riga per riga quante volte quante sono le colonne. Si presenta però un problema: come stampare un singolo valore con la print senza andare a capo? Questa funzione usa un formalismo chiamato named arguments, che permette di indicare in chiamata i parametri esplicitamente per nome. Questi parametri sono:

  • sep = “…”: indica il carattere che viene usato per separare due argomenti che devono essere stampati dalla funzione (con i parametri separati dalle virgole); all’interno delle virgolette, al posto dei puntini, si possono inserire i caratteri che devono separare gli argomenti;
  • end = “…”: rappresenta il carattere che aggiungo alla fine della stampa quando ho terminato l’istruzione print, e se ho un print con end = “…” , il prossimo print (che di default andrebbe a capo) va nella stessa riga del print con end = “…” Bisogna ricordare che i named parameters devono essere messi DOPO tutti i parametri nel print.

Numeri casuali e simulazioni

I numeri casuali risultano spesso utili, soprattutto nei giochi, come il lancio di dati, girare una ruota, estrarre una carta. Ma come fare a generare dei numeri casuali? Python mette a disposizione un generatore di numeri casuali che produce numeri che sembrano casuali, ma che in realtà sono estratti da una sequenza di numeri non consecutivi che non si ripetono. Questo generatore si trova nel modulo random che contiene appunto la funzione random. QUINDI prima di utilizzarla, assicurarsi di aver importato un modulo! Un’altra funzione è randint (a,b) che dà numeri interi casuali dal numero a al numero b inclusi.

Il metodo Monte Carlo Metodo statistico che prende il nome dai casinò di Monte Carlo, con alla base l’idea di trovare delle soluzioni approssimate a dei problemi complessi, che sono molto difficili da calcolare in maniera esatta, facendo un campionamento casuale di un determinato fenomeno e poi mettere insieme le informazioni che ho ottenuto per arrivare a una mia soluzione. Un’applicazione è proprio il calcolo del 𝜋. Se mettessimo in relazione un cerchio e il quadrato circoscritto, con i dovuti calcoli ci accorgiamo che il rapporto tra l’area del quadrato e l’area del cerchio è 𝜋 4

. Il concetto base è di generare quanti più punti possibili. Quanti di questi cadono sia sul cerchio che sul quadrato, e quanti solo nel quadrato? Facendo il rapporto tra il numero dei punti, otteniamo in maniera approssimata 𝜋 4 e moltiplicando per 4 avremo quindi con buona approssimazione il valore di 𝜋. Funzioni Una funzione è una sequenza di istruzioni a cui viene dato un nome. Per essere utilizzata è necessario invocarla/chiamarla, essa eseguirà varie operazioni e quando terminerà, restituirà un risultato. Dopo che il valore è stato utilizzato, il programma riprende l’esecuzione. Se si vuole eseguire una funzione su una o più variabili, queste devono essere inserite ( input ) all’interno delle parentesi dopo la funzione (è comunque possibile avere funzioni senza argomenti). Alla fine, la funzione restituirà in output uno o più valori (lista o tupla), anche se ci sono alcune funzioni che non restituiscono valori. Le funzioni sono come scatole nere : si passa alla funzione ciò che le serve per eseguire il suo compito e si ottiene il risultato, quando c’è. Ci sono diverse funzioni all’interno di Python, ma dietro queste funzioni ci sono diverse operazioni che il calcolatore esegue, ma che l’utilizzatore non vede, poiché a lui interessa solo sapere come usare la funzione, ad esempio la funzione round ha delle sotto-operazioni, ma l’utilizzatore non le conosce, lui sa solo che se mette la variabile float x e un numero int n, la funzione restituirà il numero x arrotondato a n cifre decimali. Dove trovare la libreria delle funzioni? Come già detto, ci sono delle funzioni predefinite nella libreria standard (round è una di queste), in cui ci sono più di 200 moduli con varie funzioni ciascuno. Tra i moduli più interessanti ci sono string, math, random, statistics, os.path, csv, json ecc. RICORDA: per importare il modulo ‘import modulo’, o ‘from modulo import funzione’ o ‘from modulo import *’

Realizzazione e collaudi di funzioni

Per definire una funzione, bisogna:

  1. scegliere un nome per la funzione;
  2. dichiarare una variabile per ogni argomento
  3. mettere insieme queste informazioni, precedute da def. L’istruzione def apre un nuovo blocco (compound statement), all’interno del quale scriveremo le istruzioni che compongono il corpo della funzione. All’interno del corpo si possono utilizzare le variabili parametro, come se fossero normali variabili. Osserviamo a destra la sintassi della definizione di funzione.

In Python i dati passati ad una funzione sono indicati da un nome nella definizione di funzione. I parametri si possono usare poi in chiamata in due modi (esempi con la funzione complex (real, imag):

  1. Positional parameters : associo la posizione del dato all’argomento (x = complex(3, 5) → 3 + 5i);
  2. Named parameters : uso il nome dell’argomento (x = comples(real=3, imag=5) → 3 + 5i); Come possiamo vedere, abbiamo due modi per ottenere lo stesso risultato. Ci sono però delle regole:
  • I positional parameters devono precedere i named parameters; (rivedere “Cicli annidati”)
  • I named parameters possono essere inseriti in un qualsiasi ordine. I parametri possono avere dei valori di default, che vengono usati se in chiamata quel parametro non viene specificato, come ad esempio, per la funzione complex (real = 0.0, imag = 0.0):
  • X = complex(0) → 0.
  • X = complex(imag = 5) → 5i
  • X = complex(real = 3) → 3 Eccezione : la sintassi speciale *args nelle definizioni di una funzione, in Python, viene utilizzata per passare un numero variabile di parametri a una funzione (e non è associata ad un nome). Una lista di parametri di questo genere è sempre positional.

Valori restituiti

Le funzioni possono (opzionalmente) restituire un valore. Per fare ciò utilizziamo la funzione return , che:

  • Termina immediatamente la funzione
  • Passa il valore di ritorno (valore, variabile, risultato di un calcolo matematico) direttamente alla variabile eguagliata alla funzione invocata. Enunciati return multipli Una funzione può utilizzare molte istruzioni return. Tutte le diramazioni del flusso di esecuzione di una funzione devono restituire un valore, portando la funzione a incontrare un enunciato return. Potremmo inserire più return nel caso in cui nel corpo della funzione ci sono uno o più if. I return multipli sono però evitabili, ad esempio memorizzando il risultato di una variabile e restituendo il valore della variabile nell’ultima istruzione della funzione. Vediamo un confronto tra due codici che danno lo stesso risultato: Quando definiamo una funzione, bisogna assicurarsi che il return si trovi in ogni condizione verificabile, nel caso in cui non ci fosse un return per una determinata condizione, potrebbero sorgere errori di tempo di esecuzione e quando ci si dimentica di far restituire un valore, Python restituisce il valore speciale None. Per implementare una funzione, bisogna quindi fornire le varie operazioni da fare all’interno, inserire i parametri che possono cambiare all’interno delle parentesi dopo la funzione, determinare i tipi di variabili parametro e del valore restituito e assicurarsi che per ogni valore inserito ci sia un return. Return multipli in due modi differenti ma equivalenti Come possiamo evitare return multipli

Funzioni che non restituiscono un valore

Se non serve restituire alcun valore, la funzione termina senza trasmettere un valore. Se l’enunciato return non viene incontrato durante l’esecuzione della funzione, è equivalente ad avere un return vuoto dopo l’ultima istruzione. Infatti, le funzioni non sono obbligate a restituire un valore; inoltre, non è richiesta alcun’istruzione return e la funzione può dare comunque un output se inseriamo ad esempio dei print. ATTENZIONE: si può utilizzare return senza un valore, ma in quel caso la funzione terminerà e tutto ciò che c’è, indentato nella funzione, dopo la riga di codice del return, non verrà mai letto dall’interprete.

Ambito di visibilità delle variabili

L’ambito di visibilità di una variabile è la porzione del programma dove essa è visibile Le variabili possono essere dichiarate:

  • Dentro una funzione: conosciute come variabili locali , disponibili solo all’interno della funzione, quindi se proviamo a usarle al di fuori di essa, ci sarà un errore di compilazione. Visto che le variabili locali possono essere utilizzate solo all’interno della funzione, è consigliato non riutilizzare gli stessi nomi, perché potrebbe generare confusione
  • Fuori dalla funzione: talvolta dette variabili globali , possono essere usate e modificate in qualsiasi funzione. Qualsiasi funzione che voglia aggiornare una variabile globale deve includere una dichiarazione global. Ci sono rari casi in cui le variabili globali sono richieste, ma in generale i programmi con questo tipo di variabili sono difficili da gestire ed estendere. CONSIGLIO: invece di usare variabili globali, usare, nelle funzioni, le variabili parametro e il valore restituito, che consentono di trasferire informazioni da un punto del programma a un altro.

Raffinamenti successivi

Per risolvere un problema complesso, esso va scomposto in problemi più semplici, fino a quando non si ottengono problemi che si sappiano risolvere. Dopo aver scomposto il problema, probabilmente tramite flowchart, dovremmo scrivere lo pseudocodice per capire effettivamente quali operazioni deve eseguire il calcolatore. Possiamo adesso scrivere il codice definendo innanzitutto delle funzioni che mi permettano di risolvere ogni sotto-problema. Suggerimenti:

  • Realizzare funzioni brevi: se occupano più di uno schermo, spezzarle in sotto-funzioni;
  • Tenere traccia dell’esecuzione delle funzioni: una linea per ogni step, le colonne per le variabili;
  • Usare gli stub se si scrivono programmi ampi: una funzione che restituisce un valore calcolato in modo semplice, sufficiente per collaudare funzione il prima possibile, nel contesto in cui viene chiamata. Liste e tabelle Lista : struttura dati versatile e dinamica, che contiene un numero variabile di elementi, di qualunque tipo, a cui si può avere accesso tramite la loro posizione (indice). In altri linguaggi potrebbe essere chiamata: sequenza, array, vettore. Per creare una lista basta dichiarare la variabile e mettere gli elementi in […] separati da virgole. Esempio: numeri = [1, 2, 3, 4, 5] Per accedere a un elemento si usano le parentesi quadre, mettendo la posizione dell’elemento (ricorda che partono dall’indice 0). Esempio: due = numeri[1]

Indici negativi

A differenza che in altri linguaggi, Python permette agli indici negativi di accedere alla lista, quindi se ci interessa ad esempio l’ultimo elemento, possiamo utilizzare l’indice - 1. Vediamo un esempio a fianco.

Operazioni con le liste

  • Aggiungere elementi: lista.append (elemento da aggiungere)
  • Inserire un elemento: lista.insert (indice in cui inserirlo, elemento da inserire)
  • Trovare un elemento: di solito con while o if, si usa ad esempio if elemento in lista, altrimenti, se vogliamo conoscere la posizione, possiamo usare lista.index (elemento da trovare)
  • Rimuovere un elemento: lista.pop (indice), rimuovendo l’elemento e facendo salire tutti i successivi, se vogliamo togliere un elemento indicandolo, su usa il metodo lista.remove (elemento)
  • Concatenazione: posso concatenare due liste per creare una lista3 = lista1 + lista
  • Replica di elementi: se volessi una lista con 10 zeri, potrei scrivere lista = [0] * 10
  • Test di uguaglianza/differenza: uso l’operatore == oppure != , l’uguaglianza tiene conto della posizione dell’elemento, quindi [1, 2, 3] == [1, 2, 3] != [1, 3, 2]
  • Somma di numeri di una lista: sum (lista)
  • Massimo e minimo: max (lista) o min (lista), se ci sono numeri è chiaro, se ci sono stringhe si basa sul codice ASCII dei caratteri di ogni elemento
  • Ordinamento (modifica): con lista.sort () riordiniamo gli elementi di una lista dal minore al maggiore, col metodo lista.sort (reverse = True) otteniamo il riordinamento decrescente
  • Ordinamento (copia): con la funzione sorted (lista) viene generata una nuova lista, ovvero una copia di quella all’interno delle parentesi, ma con riordinamento crescente. Con la funzione sorted (lista, reverse = True) si avrà una copia con riordinamento decrescente.
  • Porzioni: per estrarre una parte della lista uso l’ operatore slice : primiTre = lista[0 : 3] in cui il primo indice è incluso, il secondo è escluso. Possiamo assegnare anche valori alla porzione, rimpiazzando gli elementi che ci sono, altrimenti vengono riempite posizioni. Vediamo qualche esempio: Come possiamo sfruttare le liste e le relative operazioni? Riempire una lista con i quadrati dei numeri interi. Elaborare una somma di numeri Concatenare stringhe, inizializzando un valore str Aggiungere un separatore prima di ogni elemento ad accezione del primo, che ha indice 0. Ricerca lineare, come ad esempio cercare la posizione del primo numero che sia > 100 Trovare o contare corrispondenze Per quanto riguarda la rimozione (no foto) bisogna stare attenti a iterare l’indice: se viene eliminato un elemento, gli altri scorrono; quindi, è consigliabile usare un ciclo while e non aumentare l’indice quando si tolgono elementi.

Scambiare elementi

Un modo per ordinare una lista è attraverso ripetuti scambi di elementi che non sono in ordine. L’operazione fondamentale è scambiare gli elementi in posizioni i e j di una lista di valori. È necessario copiare in values[i] il valore values[j], ma questo sovrascriverebbe il valore precedente di values[i], quindi bisognerà salvarlo in una variabile. values = [1, 2, 3, 4] #inizializzo la lista temp = values[i] #salvo il vecchio values[i] in una variabile values[i] = values[j] #cambio il valore di values[i] in values[j] values[j] = temp #cambio il valore values[j] col vecchio valore values[i] salvato in temp

Leggere valori in input

È possibile leggere l’input da un utente e raccoglierli in una lista per poi elaborarli:

Uso di liste nelle funzioni

Una funzione può accettare una lista come argomento e può essere modificata. Se ad esempio volessimo moltiplicare ogni elemento di una lista per un fattore, potremmo scrivere un algoritmo del genere. Una funzione può generare una lista anche tramite operazioni. Ad esempio, possiamo definire una funzione squares(n) che restituisce i quadrati nei numeri da 0 a n-1.

Tuple

Una tupla è simile a una lista, ma una volta creata, il suo contenuto non può essere modificato; quindi, una tupla è una versione immutabile di una lista. Una tupla viene creata specificando il suo contenuto in una sequenza separata di virgole e inserita all’interno delle parentesi tonde (a differenza delle liste, che richiedono parentesi quadre). In realtà è possibile omettere le parentesi tonde, ma per maggior chiarezza del codice, è consigliabile usare le parentesi. Abbiamo già visto le tuple in passato, nella funzione enumerate (stringa / lista), usata nel ciclo for per iterare sia sull’indice che sull’elemento. Come per le liste, anche qui valgono le funzioni di accesso agli elementi con tupla [i], di concatenazione con operatore + , di len (tupla), sum (tupla), max (tupla), di iterazione sugli elementi con for, di verifica dell’appartenenza di elementi nella tupla con in e not in. In Python (solo in Python) si possono assegnare variabili multiple in una sola operazione e questo risulta utile, ad esempio, nello scambio di variabili. Ciò ci permette di evitare di salvare gli elementi in variabili, come abbiamo visto in precedenza. È possibile usare tuple per la restituzione di valori multipli da parte di una funzione: