Premessa : Linguaggi di Programmazione • Per l’automazione del processo di risoluzione di un problema il primo passo è determinare l’algoritmo giusto • Stabilito l'algoritmo, questo deve essere tradotto in un linguaggio “comprensibile” al computer (Linguaggio macchina). • Per poter dare alla macchina una serie di comandi “vicini” al linguaggio naturale sono nati i linguaggi di programmazione. Questi sono linguaggi formali costituiti da una grammatica con relative regole (sintassi del linguaggio). • Un programma è la traduzione di un algoritmo in un linguaggio di programmazione e deve essere corretto in termini di “significato” (semantica). Premessa : Linguaggi Compilati • Il compilatore riceve in input l’intero programma “sorgente” e restituisce in output il codice eseguibile (in linguaggio macchina) • in esecuzione, il sorgente (e il compilatore) non servono più (es: traduzione di un libro) • La compilazione si compone di 3 fasi Premessa : Linguaggi Interpretati • L’interprete traduce e manda in esecuzione il programma man mano che processa il sorgente; • L’interprete rimane in memoria durante l’esecuzione (es: traduzione simultanea) Introduzione al linguaggio Perché Python • Adatto ai “principianti” • Facile da imparare (e da insegnare) • Non è usato solo dagli studenti ma anche dai programmatori professionisti • E’ open-source e può essere utilizzato liberamente. Download Scaricare ed installare il programma dal sito: http://www.python.org/download/ scegliendo la versione adatta al sistema operativo installato sul proprio pc (Windows, Linux, Mac OS X). Alcuni Manuali • Documentazione standard di Python: http://python.org/doc/ • Manuale di ausilio per l'insegnamento della programmazione. Autori: Aurora Martina, Angelo Raffaele Meo, Clotilde Moro e Mario Scovazzi: http://linuxdidattica.org/polito/manualepython-V2.pdf Python Shell Avvia IDLE(Python GUI) Python Shell • Possiamo usare la Shell come una calcolatrice. • Un’istruzione è un’operazione che l’interprete di Python è in grado di eseguire. • Prova a digitare nella linea indicata con “>>>” alcune operazioni • Esempio: Tipi numerici • Attenzione: Per Python la divisione tra due numeri interi è sempre un numero intero approssimato per difetto: • Bisogna usare la divisione in virgola mobile (scrivere il numero seguito dal punto): Espressioni • In Python per le espressioni numeriche si usano solo le parentesi tonde, non si possono usare le parentesi quadre e quelle graffe. • Python segue le stesse regole della matematica per quanto riguarda l’ordine di esecuzione delle operazioni: prima le parentesi (partendo da quelle più interne), poi l’elevamento a potenza, poi moltiplicazione e divisione e infine somma e addizione. Quando due operatori hanno la stessa priorità si procede da sinistra verso destra. • L’operazione di calcolo del resto di una divisione usa il simbolo % (operazione di modulo): • Esempi: Le variabili • Una variabile è una coppia: nome = valore • Il segno di uguale ('=') è usato per assegnare un valore alla variabile • I valori possono essere numeri, caratteri, parole o frasi. • In Python le variabili assumono il tipo del valore che viene loro assegnato: numero, carattere o serie di caratteri, e lo mantengono fino a quando non viene loro assegnato un valore di tipo diverso. Le variabili • I nomi delle variabili possono essere lunghi quanto si desidera, possono contenere sia lettere che numeri, ma devono sempre iniziare con una lettera oppure con il carattere "_". • È legale usare sia lettere maiuscole che minuscole. • Python è case sensitive : interpreta in modo diverso i caratteri minuscoli dai caratteri maiuscoli. VAriabile ≠ variabile Le variabili Alcuni nomi non possono essere usati perché sono parole riservate al linguaggio: Nomi di variabile illegali come: 76strumenti, milione$, lambda Produrranno un errore di sintassi SyntaxError: invalid syntax Stampa Variabili • Per mostrare in output a video il contenuto di una variabile di nome nome_variabile si usi l’istruzione di stampa print: >>> print nome_variabile1 E’ possibile stampare valori di più variabili con una unica istruzione di print separando i nomi delle variabili con una virgola I dati • I dati (valori) sono di tanti tipi diversi e dal tipo del dato dipendono le operazioni che possiamo fare con essi. • Esistono tipi di dati: – semplici che includono lettere, numeri e serie di lettere – complessi che non sono altro che una combinazione dei primi • I dati semplici sono : • I numeri : sappiamo che possono essere di tipo intero, reale o “floating point” (virgola mobile o, più semplicemente, numeri decimali con virgola). • I caratteri: un carattere è un simbolo come, ad esempio, la lettera “a” minuscola, la lettera “Q” maiuscola, la cifra ”7”, il simbolo “+” e qualunque altro simbolo che compaia sulla tastiera. I dati • Le stringhe sono tipi di dati complessi, letteralmente per stringa si intende un qualunque messaggio, quindi una serie di caratteri, cifre, lettere (o altri simboli che si trovano sulla tastiera), racchiusi tra virgolette, che il calcolatore può stampare tali e quali sul video. In Python le stringhe si possono rappresentare in diversi modi: – tra virgolette semplici: 'ciao' – tra virgolette doppie: “ciao” – tra virgolette doppie ripetute tre volte “””ciao””” Operazioni su stringhe Le stringhe possono essere concatenate (incollate assieme) tramite l'operatore +, e ripetute tramite *: >>> word = 'Help' + 'A' >>> print word HelpA >>> '<' + word*5 + '>’ '<HelpAHelpAHelpAHelpAHelpA>' Porzioni di Stringhe • Le stringhe sono composte di unità più piccole: i caratteri. • Si accede ai singoli caratteri di una stringa utilizzando l’operatore ‘*‘ …’+’ • L'espressione tra parentesi quadrate è un intero chiamato indice (il primo carattere ha indice 0, poi c’è l’1, il 2,…) Esempio: >>> nome=“Eva” >>> cognome=“Sciacca” >>> print “le mie iniziali sono:”,nome*0+,” “,cognome*0+ Porzioni di Stringhe • Una intera porzione di stringa si ottiene usando l'espressione var_stringa[i:j] • Che ottiene la porzione della stringa dal carattere i-esimo al (j-1)esimo (partendo da 0), cioè il primo indice è incluso mentre il secondo indice è escluso. Esempio: >>> nome=“Mariagrazia” >>> n1=nome[0:5] >>> n2=nome[5:11] • Se non è specificato il primo indice (i) la porzione parte dall'inizio della stringa. Senza il secondo indice (j) la porzione finisce con il termine della stringa. • var_stringa[:] è la stringa intera. Programmi Python • Dalla Shell, scegliete File, quindi New Window. Digitate: print "Hello World" • siamo nella finestra di editing. Qui possiamo salvare, modificare, fare il debug di ciò che andremo a scrivere: in tutta libertà. • Salvate dove volete il file (andando su File > Save), dandogli il nome che preferite. Ma alla fine deve esserci l'estensione .py. • Andate su Run >Run Module, apparirà la finestra di output con la scritta: Hello world! Input Per inserire un valore in una variabile in maniera interattiva si possono utilizzare le istruzioni input e raw_input: nome_variabile= input(prompt) prompt è un messaggio per l'utente per chiedere che cosa deve inserire. Esempio: Anni = input("Quanti anni hai? ") print "Tu hai ", Anni, " anni" raw_input • input funziona soltanto con i numeri e quindi con le variabili numeriche (cioè le variabili di tipo numero). Questo vuol dire che l'interprete raccoglie il dato inserito e cerca di interpretarlo come un numero. • raw_input accetta qualunque carattere immesso dall'utilizzatore. Esempio: nome = raw_input("Come ti chiami? ") print "Ciao ", nome, “ !" Esercizi 1. Scrivi il programma per calcolare l’area di qualunque rettangolo chiedendo all’utilizzatore la base e l’altezza. 2. Scrivi un programma che chiede tre numeri, ne calcola la somma, la somma dei quadrati e il quadrato della somma. Infine, visualizza i risultati. 3. Scrivi un programma che chiede un numero n ed una stringa s e stampi concatenate n volte la stringa s Istruzioni condizionali L'istruzione che ci permette di scegliere cosa fare se si verifica una determinata condizione si chiama if if <condizione> : <istruzione_1> <istruzione_2> … <istruzione_n> Le istruzioni da eseguire nel caso di verifica della condizione devono essere indentate rispetto all’ if Operatori Condizionali • • • • • • • = = uguale < minore di <= minore o uguale a > maggiore di >= maggiore o uguale a != diverso da (primo modo) < > diverso da (secondo modo) Operatori Logici Per condizioni più complesse possono essere usati gli operatori booleani: • or • and • not Esempio: if maggiorenne == "si" and prigione == "no" : print "puoi votare" If … else • L'istruzione if può essere anche più complicata, in quanto ci consente di dire cosa fare sia quando la condizione è soddisfatta sia quando non è soddisfatta. Esempio: Dati due numeri, stabiliamo se il primo è maggiore o minore del secondo. num1= input("Introduci il primo numero ") num2 = input("Introduci il secondo numero ") if num1 > num2: print num1, " è maggiore di ", num2 else: print num1, " è minore o uguale a ", num2 if...elif...else Molte volte ci sono più di due possibilità di scelta. nome = raw_input("qual è il tuo nome? ") if nome == "Carlo": print "il tuo onomastico è il 4 novembre" elif nome == "Francesca": print "il tuo onomastico è il 9 marzo" elif nome == "Anna": print "il tuo onomastico è il 26 luglio" elif nome == "Andrea": print "il tuo onomastico è il 30 novembre" elif nome == "Stefano" print "il tuo onomastico è il 26 dicembre" else: print "non so quando è il tuo onomastico ma spero che ogni giorno sia la tua festa!" elif è l'abbreviazione di "else if", che in inglese significa "altrimenti se". In modo formale questa istruzione viene definita: condizioni in serie. Esercizi 1. Controllare se un numero inserito in input è pari o dispari 2. Scrivere un programma per chiedere all’utente di indovinare un dato numero aiutandolo se è più alto o più basso del numero prescelto I Cicli Per eseguire azioni ripetitive si usano i “cicli” o in inglese “loop” Ci sono due tipi di “cicli” e tra i due c'è una differenza molto importante. • Il ciclo while, viene usato quando non si sa prima quante volte deve ripetere l'azione. • Il ciclo for, è usato quando si sa in anticipo quante volte si dovrà ripetere l'azione. While while <condizione> : <istruzione 1> <istruzione 2> … <istruzione n> L’istruzione while significa: "fai tutto quello che segue fintantoché la relazione è soddisfatta". Tutte le istruzioni che seguono la while <relazione> : devono essere indentate se fanno parte delle cose da fare quando <relazione> è soddisfatta. Esempio a=1 while a< 4 : a=a+1 print a Cicli annidati • Un ciclo può contenere al suo interno istruzioni di controllo (if) o altri cicli interni (annidati) Esempio : stampa tutte le tabelline da 1 a 10 i=1 while i<=10: print "Tabellina",i j=1 while j<=10: print i*j Ciclo interno j=j+1 i=i+1 Ciclo esterno Esercizi 1. Trovare i divisori di un numero 2. Scrivi un programma che chiede una sequenza di numeri da aggiungere ad una somma. Per terminare inserisci 0. 3. Scrivi un programma che stampi: 5 4 3 2 1 5. Scrivi un programma che stampi la “serie di Fibonacci”. Cioè, la somma di due elementi definisce l'elemento successivo (1,1,2,3,5,8,13…..) Esercizi 1. Cosa stampa questo programma? i=2 j=1 while i <= 10 : c=i while c <= 5*j: print c, c=c+j print '\n' i=i+2 j=j+1 2. Scrivi un programma che stampi (usando due cicli annidati): bravo bravo peperone bravo bravo peperone peperone bravo bravo peperone peperone peperone Le Funzioni Informalmente una funzione è un pezzo di programma cui viene dato un nome. E’ quindi un meccanismo semplice per specificare una sola volta delle operazioni ricorrenti e per richiamare quelle operazioni ogni volta che ci servono. def nome_funz(var_1, var_2, ..., var_n) La funzione sarà il programma che lavorerà sulle variabili indicate. Esempio: def saluta(nome) print “Ciao”, nome Chiamata di funzione • In generale, la chiamata di una funzione viene effettuata scrivendo il nome della funzione, seguita dai nomi delle variabili su cui lavorare separati da virgole e racchiuse da parentesi. Esempio: mioNome=“Eva” saluta(mioNome) Return • Qualche volta la funzione chiamata esegue dei calcoli il cui risultato serve al programma chiamante. Esempio: def doppio(numero): n2 = numero * 2 return n2 prova=doppio(3)+doppio(5) Ricorsione (un accenno) Nel corpo di una funzione si può anche scrivere una o più istruzioni che chiamino altre funzioni. Al limite, una funzione può anche chiamare se stessa. Supponiamo di voler calcolare il fattoriale del numero 7. Occorre scrivere: fatt = 7*6*5*4*3*2 La funzione che calcola il fattoriale di un numero n dovrà essere scritta come n moltiplicato per il fattoriale di (n-1); ad esempio: fatt(7) = 7 * fatt(6) E la funzione sarà: def fatt(n): if n == 1: return 1 else: return n * fatt(n-1) Funzioni predefinite Python fornisce alcune funzioni predefinite, ad esempio: • La funzione len (variabile stringa) restituisce la lunghezza della stringa, cioè restituisce il numero di caratteri della stringa. • repr(variabile intero) converte un intero in una stringa • int(var) converte una stringa o un numero decimale in un intero • float(var) converte una stringa o un numero intero in un decimale Librerie • Alcune funzioni predefinite sono raccolte in librerie. Ad esempio funzioni già pronte che permettono di eseguire le più comuni operazioni matematiche si trovano nella libreria: math • Prima di poter usare le funzioni fornite da math, devi dire all'interprete di caricare le funzioni in memoria. Questa operazione, che si chiama "importazione", si scrive: import math Per utilizzare le funzioni si usa l’istruzione: nome_modulo.nome_funzione (variabile) Esempio: val=4 res=math.sqrt(4) print “La radice quadrata di”,val,”e’”,res Esercizi 1) Scrivi un programma utilizzando la funzione che chiede 2 numeri e visualizzi la somma, il valore medio e visualizzi il minimo tra i due. 2) Scrivi un programma utilizzando la funzione che chiede il lato di un quadrato, calcoli l’area del quadrato e restituisca “grande” se maggiore di 100, “piccolo” altrimenti 3) Scrivi un programma utilizzando una funzione che conta il numero di volte in cui la lettera 'a' compare in una stringa, usando un contatore. Le Liste Una lista è un insieme ordinato di valori di qualunque tipo, Esempio: • [3,6,9,12,15] lista di tutti numeri interi • ["Luigi","Mario","Nicola","Giuseppina"] lista di tutte stringhe • ["pane","latte","zucchero",1,15,230,"bicchieri",1.5,2.5] lista mista: 3 stringhe, 3 numeri interi, 1 stringa, 2 numeri decimali I valori della lista sono chiamati “elementi” . Le parentesi quadrate * + iniziano e finiscono la lista e la virgola (“,”) separa un elemento della lista dall'altro. Non è obbligatorio che gli elementi di una lista siano tutti dello stesso tipo, tutti numeri o tutte stringhe, ossia una lista può essere non omogenea. Esiste poi una lista speciale chiamata “lista vuota” e si indica con [ ] Le Liste • Le liste sono un tipo di variabile "composto". • Le liste sono variabili che possono contenere più di un valore. • Come per le stringhe per accedere ai singoli elementi di una lista si usa l’operatore [indice] (l’elemento [0] è il primo elemento) • Se un indice ha valore negativo il conteggio parte dalla fine della lista. • Questo metodo di usare l’indice negativo con*-1] accederemo all’ultimo elemento, *-2] al penultimo e così via. Lunghezza Lista • La funzione len applicata ad una lista produce il numero di elementi di una lista, come nelle stringhe. Operazioni sulle liste Come per le stringhe : • L'operatore + concatena le liste: • L'operatore * ripete una lista un dato numero di volte. • L’operatore [i:j] restituisce la porzione della lista dall’indice i all’indice j. Ricordati: il primo indice incluso, il secondo indice escluso. Cancellazione Con l’operatore porzione *i:j+ possiamo eliminare uno o più elementi di una lista assegnando alla corrispondente sezione una stringa vuota. allievi_4E = ["gabriele","alessandro","anna","michela", "antonio"] allievi_4E[1:3] = [] print allievi_4E Risultato --->>> gabriele michela antonio In maniera esplicita con la funzione del è possibile cancellare un elemento da una lista. del allievi_4E[1:3] Inserimento Analogamente, possiamo inserire uno o più elementi in una lista inserendoli in una sezione vuota nella posizione desiderata: >>> allievi_4E = ["gabriele","alessandro","anna","michela","antonio"] >>>print allievi[2:2] [] >>>allievi_4E[2:2] = ["sandra", "andrea"] >>>print allievi_4E gabriele alessandro sandra andrea anna michela antonio LISTE annidate • Un elemento di una lista può essere a sua volta una lista: passeggeri = [["bianchi","gabriele"],["verdi","alessandro"],["rossi", "anna"],["neri","michela"]] Qual è il cognome del secondo passeggero? passeggero=passeggeri[1] cognome=passeggero[0] Oppure direttamente: cognome=passeggeri[1][0] Attraversamento Lista: ciclo for • Stampare le iniziali di tutti i passeggeri i = 0 while i < len(passeggeri) : nome=passeggeri[i][0] cognome=passeggeri[i][1] print nome[0],cognome[0] i = i + 1 • Questo ciclo può essere scritto anche in questo modo: for passeggero in passeggeri: print passeggero[0][0], passeggero[1][0] Stesso risultato, ma il programma è molto più conciso. In termini generali devo scrivere: for <nome di variabile> in <nome di lista>: • L’istruzione for significa: per ciascuna variabile della lista fai tutto quello che segue Lista speciale • Una lista composta da tutti numeri interi consecutivi, si crea con la funzione range. • Scrivere [0,1,2,3,4] è equivalente a scrivere range(5) • Con range si può scrivere: range(1,5) che è equivalente a [1,2,3,4] • La funzione range in questo caso legge dalla lista di interi gli elementi che partono dal primo indice incluso e arrivano all'ultimo indice escluso. • Con range possiamo scrivere anche espressioni del tipo: range(1,10,2) che è equivalente a [1,3,5,7,9]. Il terzo indice si chiama "passo" e indica con quale intervallo leggere i numeri dalla lista di interi partendo da 1 e arrivando a 10 escluso Esercizi 1. Scrivi un programma che analizzi le seguenti stringhe e per ognuna stampi la lunghezza della parola: banana, cipolla, bambino, finestra, girotondo 2. Scrivi un programma che sommi tutti gli elementi di una lista data. 3. Scrivi un programma che esamini una lista di numeri e conti il numero di volte in cui uno di questi numeri cade in un determinato intervallo, ossia è superiore a un valore indicato ed è inferiore ad un altro valore assegnato. 4. Prova a incapsulare il codice del programma in una funzione chiamata "intervallo" che ha come parametri la lista da controllare ed i valori Inferiore e Superiore. I Commenti • I "commenti" sono parole, frasi o testi brevi che servono a spiegare bene le operazioni che il codice esegue. • I commenti non sono esaminati dall'interprete che quando li incontra passa oltre. • E' molto importante aggiungere nei programmi alcune osservazioni che spiegano le operazioni che vengono fatte perchè il codice risulta molto piu' comprensibile anche allo stesso autore, che dopo un po' di mesi puo' anche non ricordarsi più perchè aveva scritto le istruzioni in quel modo. • Attenzione a scrivere bene i commenti: inserire dei commenti che contraddicono il codice è molto peggio che non avere commenti! • I commenti in linea dovrebbero essere separati da almeno due spazi dall'istruzione e devono iniziare con un # seguito da un singolo spazio.