Fondamenti di programmazione in Python per ingegneri

Cosa aspettarsi da questo articolo

Parto dal presupposto che, a mio avviso, chiunque lavori con i computer deve saper programmare almeno un minimo.
Scopo di questa mini-lezione non è formare grandi programmatori (io programmo da circa dieci anni e sono lontano anni luce da essere un grande programmatore) ma darvi le basi per poter scrivere un piccolo script.
Questa guida non si occupa di problemi di prestazioni e performance, problemi di scrittura e leggibilità del codice, teoria del codice e quant’altro. Vi fornisco solo elementi di utilizzo immediato: chi di voi diventerà “più esperto” e supererà questa mini-lezione probabilmente non utilizzerà mai più niente di tutto ciò che c’è scritto qui. Ma il fatto è che quanto state per imparare funziona e funziona subito. Livello di difficoltà prossima allo zero.
Ovviamente con le conoscenze qui sotto potrete al più scrivere dei piccoli script imperativi e nient’altro. Quanto basta per inserire “pezzi di codice” in programmi di uso comune per l’ingegneria.

Cosa significa scrivere un programma

Un programma è essenzialmente un insieme di istruzioni che il vostro computer riceve ed esegue. Linguaggi di programmazione “seri” hanno la possibilità di definire quale sia il punto d’ingresso del programma, in che tempo e con quali risorse devono essere eseguite le varie istruzioni e altre cose di questo tipo.

Un programma viene generalmente scritto in un editor di testo (anche il blocco note di windows) e poi passato ad un compilatore. Il compilatore ha il compito di convertire il vostro file (o insieme di file) in quello che definiamo bytecode. Cosa sia il bytecode se vi interessa ve lo cercate su internet, anche perchè è molto interessante sapere perché serve e quali vantaggi offre una “compilazione intermedia”… insomme, dovreste aver sentito la parola Java almeno una volta! Ma quello che conta sapere è che il vostro codice non viene eseguito dalla macchina così com’è, ma subisce prima alcune trasformazioni. In realtà una volta convertito in bytecode il vostro codice deve essere convertito in linguaggio macchina prima di poter essere realmente eseguito.

Noi ci occuperemo di illustrare in seguito i principi di base della cosiddetta programmazione imperativa, ovvero una forma di programmazione in cui essenzialmente si mettono in fila, disposte per riga, le diverse istruzioni che si vuole il computer esegua. Le istruzioni vengono compilate (ed eseguite) dall’alto verso il basso. In questo modo possiamo pensare l’intero codice come un unico algoritmo.

Giusto per incuriosirvi rispetto a qualcosa di cui non parleremo: la programmazione imperativa è oggi sostanzialmente abbandonata. Oggi si utilizzano paradigmi di programmazione assai diversi – il più diffuso è forse il paradigma OOP, in cui sostanzialmente si programma mettendo in risalto le qualità dei dati rispetto alle routine (Object Oriented Programming). Ma allora perchè fare una lezione sulla programmazione imperativa? Semplice: l’OOP è qualcosa di decisamente evoluto, che pone le sue basi sul concetto di astrazione dei tipi. Qualcosa che esula completamente dal nostro scopo e che richiederebbe troppo tempo.

La caratteristica dei programmi di cui tratteremo è:

  1. Tutto il codice è contenuto in un unico file
  2. Non viene fatto riferimento a stream, persistenza dei dati
  3. Non vengono presi in considerazione problemi di astrazione
  4. Non vengono fatti riferimenti a librerie esterne (quasi mai)

Il primo punto spiega un po’ la filosofia: vi voglio dare solo gli elementi che vi consentano di scrivere piccoli script da inserire dentro Dynamo o Rhyno… non ha senso spiegarvi come gestire progetti veri e propri. Non vi insegnerò neppure come salvare file o caricare dati esternamente. Anche se questo sarebbe interessante (per esempio ingrare un foglio Excel con Dynamo e Python non sarebbe male), ma richiede conoscenze più avanzate e un’approfondimento di concetti che non toccherò neppure. Altresì per l’astrazione, che essenzialmente mi imporrebbe di spiegare l’OOP o almeno le funzioni. Non vi spiegherò neppure come fare grafici o utilizzare strumenti scritti da terze parti, tranne il minimo indispensabile per utilizzare alcune funzioni matematiche di base (come seno e coseno).

Ok, iniziamo.

Python. Cos’è e primo avvio

Python è il linguaggio più semplice in assoluto. Possiamo dire che non ha neppure una vera grammatica, sostanzialmente scriverete esattamente quello che volete che il computer faccia.

A causa di questa semplicità e al fatto che defacto Python non viene neppure compilato (ma interpretato), Python viene utilizzato come linguaggio di programmazione per scriptare dentro molti programmi. E’ veloce e semplice. Questo vi basta.

Potete installare l’interprete Python (che a sua volta è scritto in linguaggio C) da qui: http://www.python.it/download/ – scegliete la versione 2.7 perchè su Dynamo in realtà quello che eseguirete non è Python ma IronPython (cosa cambia? a voi niente) che è basato sulla versione 2.7 di Python. Dico questo perchè sebbene quello che diremo in questa sede vale per tutte le versioni di Python, se deciderete di andare avanti è utile avere una versione perfettamente adatta ai vostri scopi.

In alternativa potete installare Canopy, che fornisce una versione di Python che include al suo interno numerose librerie che potrebbero esservi utili: https://www.enthought.com/products/canopy/

Ad installazione completata, se non ci sono intoppi troverete fra i vostri programmi “Idle”, che non è altro che una console Ppythonintroython JIT. Significa che voi scrivete del codice Python, premete invio, e questo viene eseguito. E’ lo step prima dello script. Tutta la prima parte di questo corso, per spiegare un po’ come funziona, sarà eseguita su Idle.

Ad esempio io ho scritto:

print("hello world")

e Python ha risposto “hello world”. Il comando print() produce la stampa dell’argomento.

Non fate caso alla mia versione di Python: voi scaricate la 2.7!

Fondamenti

Variabili

Provate a scrivere:

nome = "Cristiano"

e premete invio. Come vedete Python non stampa niente, ma ha memorizzato la stringa “Cristiano” dentro la variabile nome. Se ora digitate

print(nome)

otterrete la stampa del mio nome.
Altresì potete scrivere:

nome = "Cristiano"
print(nome) #Stampa: Cristiano
nome = "Filippo"
print(nome) #Stampa: Filippo
nome = "Mario"
nome = "Giulio"
print(nome) #Stampa: Giulio

Come vedete le istruzioni vengono eseguite dall’alto verso il basso, nell’ordine di scrittura.
Possiamo anche concatenare più stringhe:

nome = "Mario"
cognome = "Rossi"
print(nome + cognome) # MarioRossi
print(nome + " " + cognome) #Mario Rossi

Notate bene:

  1. Tutto ciò che segue il carattere # non viene considerato parte del codice, si tratta dunque di un commento del programmatore.
  2. I commenti e le stringhe devono essere su una linea singola
  3. Ogni linea deve contenere una sola istruzione
  4. Le stringhe devono essere contenute dentro le virgolette “”

Numeri

Potete immaginare facilmente come eseguire delle operazioni matematiche e quali “cose strane” possono capitare:

i = 5
j = 2
print(i+j) # 7
print(2*3) # 6
i = "5"
j = "2"
print(i+j) #stampa 52 (i e j vengono considerati stringhe: sono fra virgolette)
print(i*3) #stampa 555
print("ciao"*2) #stampa ciaociao

Liste (matrici)

Le variabili viste fino ad ora possono contenere solo un elemento per volta. Se le riassegnate perdete il valore precedente (abbiamo già visto degli esempi). E’ possibile creare e gestire una lista in questo modo:

mesi = [] #definisce una matrice
mesi.append("Gennaio") #aggiunge un primo elemento (indice 0)
mesi.append("Febbraio") #aggiunge un elemento in coda alla lista
mesi.append("marzo") #aggiunge un elemento in coda alla lista
mesi[2] = "Marzo" #modifica l'elemento con indice '2', cioè il terzo elemento
mesi.pop(2) #rimuove l'elemento con indice 2
mesi.append("Aprile")
mesi.insert(2, "Marzo") #inserisce marzo in terza posizione facendo scalare aprile in quarta

Vi ho mostrato 3 metodi dell’oggetto list.Un metodo è essenzialmente una funzione a cui accedete tramite l’operatore “.” che segue il nome di una variabile che fa riferimento ad un oggetto.

La tecnica del “.” fa riferimento al paradigma OOP (che non vedremo), vi basta sapere che per accedere alle funzionalità delle liste, create con [] dovete inserire il nome della variabile della lista seguita dal “.”. I metodi utilizzati sono:

  1. append(variabile) – aggiunge l’argomento alla lista (per valore)
  2. pop(index) – estrae dalla lista l’elemento numero index. se non impostate index, estrae l’ultimo inserito
  3. insert(index, var) – inserisce l’elemento in una posizione specifica

Questi tre sono i metodi base per le liste. Ovviamente ce ne sono molti di più, una ricerca su internet vi basterà per scoprirlo: https://developers.google.com/edu/python/lists

Altri metodi per istanziare e lavorare sulle liste

Potete provare anche istruzioni di questo tipo:

spesa = ["Carote", "Latte", "Miele"]
conteggio = len(spesa)
print(conteggio) #3
spesa.append("Biscotti")
conteggio2 = len(spesa)
print(conteggio) #3
print(conteggio2) #4

E’ anche possibile creare matrici di matrici ed eseguire operazioni su matrici:

vettore = [[[1],[0],[0]],[[0],[1],[0]],[[0],[0],[1]]]
mischio = ["mischio", "testo", "a", 3, "numeri"]
list1 = [1,2,3]
list2 = [4,5,6]
list1+list2 #[1,2,3,4,5,6]
sum(list1) #6

Insomma, spero di aver reso l’idea. Ulteriori metodi li trovare online. Basta cercare qualcosa come “intersezione liste con Python”, magari in inglese. Andate su Google e provate a cercare qualcosa come “how to intersect lists python” – troverete svariati post (in genere quelli che puntano sul sito stackoverflow forniscono risposte rapide ed attendibili).

Iterazioni

Il modo più semplice per iterare in una lista è illustrato in questo esempio. Digitate su Idle:

list = ["lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato", "domenica"]
for giorno in list:
	print("oggi è " + giorno)
print("Domani che giorno sarà?")

Come vedete la funzione print è indentata di un TAB dopo l’istruzione for. Questo comunica a Python che l’istrzione fa riferimento al blocco for, mentre “Domani che giorno sarà” no. Se non fosse presente il TAB, Python restituirebbe errore, infatti il blocco for richiede almeno un istruzione.
Notate la differenza scrivendo:

list = ["lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato", "domenica"]
for giorno in list:
	print("oggi è " + giorno)
	print("Domani che giorno sarà?")

Spiegazione del ciclo for

for è una parola riservata del Python. Nessuna variabile può chiamarsi in questo modo, in effetti “for” è una vera e propria istruzione. Il blocco for così come scritto indica che la variabile di iterazione “giorno” deve essere desunta dall’iterazione dentro la lista di nome “list”. La variabile “giorno” continua ad esistere anche fuori dal ciclo. Provate a scrivere:

print(giorno) #domenica

Questo comportamento può sembrarvi ovvio, in realtà non lo è e porta numerosi problemi (che non vedremo). Si dice, per chi volesse approfondire, che Python ha gestito globalmente lo “scope” della variabile.
Possiamo iterare in una lista anche per indice:

for i in range(0, len(list)):
	print(list[i])

Selezione (istruzione if)

Il costrutto if consente di eseguire una parte di codice solo se è vera la condizione del blocco if e alternativamente eseguirne un’altra. Ad esempio il codice seguente non produce nessun output

nome = "mario"
if nome == "cristiano":
	print("benvenuto")

La parola riservata else consente di inserire codice alternativo:

nome = "mario"
if nome == "cristiano":
	print("benvenuto")
else
	print("chi sei?")

Operatori booleani

Essenzialmente Python verifica il contenuto dell’istruzione contenuta in if, se vera esegue il blocco. Se è presente il blocco else e l’istruzione è falsa, viene eseguito questo.

Il blocco if viene eseguita se l’operatore restituisce il valore booleano True. I principi della logica booleana non fanno parte di questa lezione, ma pensate a “True” come “+” e “False” come “-” in matematica. Due “frasi” vere restituiscono vero, due frasi false restituiscono vero, una falsa e una vera, falso. Gli operatori di confronto sono:

  • a == b #vero se a è identico a b. Attenzione al doppio “=”. Il singolo “=” significa assegnazione.
  • a != b #vero se a è diverso da b
  • a < b, a > b, a<=b, a >= b #provate a immaginare…
  • Potete anche correlare più frasi con “and” o “or”

Quindi provate a digitare per esempio:

for giorno in list:
	print("Che bella giornata")
	if giorno != "Sabato" and giorno != "Domenica":
		print("Oggi ci si riposa")
	else:
		print("Oggi si lavora")
	print("... perchè oggi è " + giorno)

E adesso?

Questo ultimo programmino contiene tutti gli elementi che a mio avviso sono fondamentali.
Con queste informazioni ritengo possiate orientarvi e iniziare a scrivere qualche script per conto vostro. O aiutandovi con internet.

Sicuramente queste informazioni vi basteranno per iniziare a lavorare su Dynamo. Su YouTube ho caricato un video che utilizza Python per attraversare delle liste e selezionare determinati elementi: è un esempio pratico che vi consiglio di seguire per sostanziare quanto detto.

  • Questa non è una guida a Python, è solo un’introduzione. Io penso che chi vuole imparare questa roba possa facilmente farlo facendo due ricerche su internet e sbattendoci la testa sopra. Non avrei neppure il tempo per fare un maxi spiegone su Python. Peraltro spiegare i fondamentali è anche noioso e nei pochi articoli su questo blog mi sono concentrato su temi un po’ più interessanti e che un minimo invitano a ragionare… Diciamo che ho scritto questa paginetta per darvi gli strumenti per partire da soli 😉

Per i più temerari

  1. Un corso di Python di 13 ore online: https://www.codecademy.com/learn/python
  2. Il libro “Imparare Python” di Lutz è la base per imparare davvero a programmare in Python. Il libro costa una sessantina di euro, ma se volete essere dei pro, è l’inizio: https://www.amazon.it/Imparare-Python-Mark-Lutz/dp/8848125956/ref=sr_1_1?ie=UTF8&qid=1473362244&sr=8-1&keywords=imparare+python – una vola letto e appreso, il passo successivo sarà “Programmare Python”, sempre di Lutz. Questo secondo testo vi porterà a scrivere applicazioni più impegnative, magari anche piccoli giochi o programmi con una grafica decente.
  3. Python fornisce numerose librerie utili per numerosi scopi. Fra queste segnalo pyplot (qui: http://matplotlib.org/api/pyplot_api.html). Pyplot vi consente di stampare a video il grafico di qualsiasi funzione, provateci un po :). Ogni libreria è fornita di apposita documentazione che vi fornisce la descrizione dei vari comandi che potete eseguire. Prendete dimestichezza con queste “API” (Application Programming Interface) percé è il modo in cui i programmatori dicono ad altri programmatori come fare le cose. Ma attenzione: la vostra installazione di Python non andrà bene per questo scopo. Per usare Pyplot il modo più semplice sarà procurarsi Canopy: https://www.enthought.com/products/canopy/

Leave a Reply

Your email address will not be published. Required fields are marked *