Impariamo la programmazione con Banana Joe
https://www.youtube.com/watch?v=akO86aGV9oQ
Banana Joe è un simpatico commerciante di banane, una persona tranquilla, ma siccome è grande e grosso gli propongono di lavorare al night Mocambo come buttafuori. Vediamo come se la cava, e se avrà delle difficoltà lo aiuteremo.
La pagina che abbiamo creato con la colaborazzione del prof. Alessandro Mucci, vuole dimostrare come nella vita di tutti i giorni si uttilizza la logica che potremo uttilizzare nello svillupo di un programma con il linguaggio Python.
Banana Joe in azione
Il nostro amico è un po’ come i nostri computer, prende alla lettera tutto ciò che gli si dice, dunque dobbiamo spiegargli il lavoro in modo più preciso di come ha
fatto il direttore del locale, ma prima cominciamo con un compito più facile: non è venuta anche a voi la curiosità di sapere quanti pesos vale un carico di banane?
Possiamo calcolarlo, perché la paga che il direttore offre a Banana Joe è di 50 pesos e lui la valuta in questo modo:
Un quarto di un quarto della metà di un carico di banane.
Nel film Banana Joe mette a paragone le banane con i soldi spagnoli, dicendo che le banane possono essere una valuta di scambio io lavoro tu mi paghi con le banane.

Matematica, m’hai provocato e io ti distruggo!
Qui dobbiamo ripassare un po’ la matematica: noi sappiamo quant’è la paga rispetto al valore del carico di banane, dunque cominciamo trasformando
fedelmente il calcolo di Joe in un’equazione precisa e ordinata:
paga = 1/4 × 1/4 × 1/2 × carico
Detta così è un po’ scomoda, ci conviene semplificarla: moltiplichiamo tra loro
tutti i dividendi e i divisori per ottenere un unico numero fisso:
paga = 1/32 × carico
Possiamo farci la vita ancora più facile perché il dividendo è un’unità, dunque il
carico andrà semplicemente diviso per il divisore.
paga = carico / 32
Ora noi possiamo usare qualsiasi linguaggio di programmazione per risolvere il
nostro problema, scegliamo Python e – meraviglia! – vediamo che possiamo
scrivere la formula matematica esattamente come l’avevamo già espressa,
l’importante è capire che paga e carico prima erano incognite matematiche, e ora
diventano variabili del programma. A proposito di variabili, loro sono piccoli
spazi virtuali di memoria dove il programma si segnerà numeri, frasi o altre cose
che ha bisogno di ricordare in un secondo momento. La nostra prima riga di
codice sarà dunque la formula stessa, e la seconda riga chiamerà un’istruzione di
output per vedere il risultato del nostro calcolo.
paga = carico / 32
print(carico)

Ahiahiahi! Il nostro programma è andato di traverso all’interpete Python:
NameError: name ‘carico’ is not defined
Perché avviene questo? Semplicemente, stiamo cercando di leggere la variabile
carico che semmai dovremmo andare a scrivere, oltretutto nel nostro programma
non abbiamo ancora inserito il valore che conosciamo già, ovvero la paga da cui
possiamo dedurre l’altro valore. All’inizio del programma dovremo dunque
assegnare il valore alla variabile paga, poi dovremo invertire il calcolo
matematico.
paga = 50
carico = paga * 32
print(carico)
Per registrare il valore della paga, usiamo sempre l’operatore di assegnazione = proprio come facciamo sotto per definire la formula. Questo succede perché
anche la definizione di una formula in un programma avviene assegnando un valore ad una variabile, solo che ad esempio il valore del carico noi non lo
conosciamo a priori, dunque a destra dell’operatore abbiamo un’espressione, cioè una serie di operazioni che possono avere per oggetto valori fissi e variabili.
Stavolta il computer ci darà il risultato giusto: 1600 Magari possiamo sforzarci un pochino di più e preparare un output più eloquente, naturalmente dobbiamo ricordarci di usare l’istruzione str() per convertire il numero in una stringa e unirlo al testo fisso:
paga = 50
carico = paga * 32
print(
“Un carico di banane vale “
+ str(carico) + ” pesos.”
)

In questo modo potremo leggere un output chiaro, e vale sempre la pena di farlo.
Immaginate infatti di rivedere questo programma tra qualche mese, quando probabilmente vi sarete dimenticati a che cosa serve: se l’output fosse un semplice numero non ci capireste davvero nulla e vi toccherebbe esaminare di nuovo il codice, invece in questo caso:
Un carico di banane vale 1600 pesos.
Anche i buttafuori fanno le loro valutazioni
Ora torniamo al compito di buttafuori del nostro amico Joe, il direttore del night glielo ha descritto in questo modo: “Buttafuori significa che dovrai stare qui in sala e se qualcuno molesta i nostri clienti, specialmente le ragazze del locale, tu lo prendi e lo butti fuori a calci!”
Ora importiamo il modulo mocambo che serve a gestire il night, tra le varie cose definisce una classe di oggetti chiamata Qualcuno. In programmazione un oggetto è una variabile complessa che contiene altre variabili dette proprietà, ad esempio a noi serve sapere il nome, il cognome, il colore dell’abito e altre cose che ci servono a riconoscere tutte le persone che stanno al Mocambo. Un oggetto spessono ha delle funzioni proprie, per esempio a noi per ogni persona servono funzioni come molestaQualcuno() e buttaFuoriACalci() che ci permettono rispettivamente di controllarle e agire su di esse. La bella Dorian è una ragazza molto in gamba e si arrabbierebbe pensando che noi trattiamo le persone come oggetti, ma purtroppo in informatica si fa così, e una classe ci serve proprio per stabilire proprietà e funzioni tipiche di un tipo di oggetto.

Nel modulo mocambo abbiamo anche una funzione inizia Serata() che ci permette di creare automaticamente un po’ di oggetti di tipo Qualcuno, ciascuno dei quali corrisponde a un singolo cliente. La funzione scegliUno() invece ci permette di pescare un cliente a caso. Con queste premesse sembra che possiamo tradurre la frase del direttore con un algoritmo molto semplice:
import mocambo
mocambo.iniziaSerata()
tizio = mocambo.scegliUno()
if tizio.molestaQualcuno():
tizio.prendi()
tizio.buttaFuoriACalci()
print(
“Uno con l’abito “
+ tizio.abito + ” (“
+ tizio.cognome
+ “) molesta la ragazza “
+ “e io lo butto fuori!”
)
Spesso non succede niente perché i clienti si comportano bene, a volte invece
Banana Joe deve buttar fuori qualcuno.
Come facciamo ad assicurarci che il programma funzioni a dovere e che non ripeta sempre la stessa situazione?
Attraverso un output raffinato, naturalmente! Joe non sa come si chiamano i clienti che accompagna alla porta, ma in compenso si ricorda bene le loro facce e
il colore degli abiti. Noi per fare un controllino in più nell’output del programma abbiamo aggiunto il cognome tra parentesi.
Uno con l’abito grigio (Navarro) molesta la ragazza e io lo butto fuori!

A prima vista sembra che un solo ciclo if sia sufficiente. In realtà questo algoritmo è troppo semplice, perché quando Joe interviene lo fa sempre una volta
sola, mentre i clienti sono tanti e può capitare benissimo che nella stessa serata ce ne siano due o più a dare i numeri. Dunque ci serve un Array di tutti i clienti e un
ciclo for. L’array ce lo fornisce la funzione tuttiQuanti() del modulo mocambo.
import mocambo
mocambo.iniziaSerata()
tutti = mocambo.tuttiQuanti()
for tizio in tutti:
if tizio.molestaQualcuno():
tizio.prendi()
tizio.buttaFuoriACalci()
print(
“Uno con l’abito “
+ tizio.abito + ” (“
+ tizio.cognome
+ “) molesta la ragazza “
+ “e io lo butto fuori!”
)
Computer a parte, nella realtà il nostro amico Banana Joe questa cosa l’ha capita
al volo e infatti, dopo aver defenestrato il primo ubriacone, torna subito al bar e
agguanta un bruto che minaccia Dorianne. Attenzione, però! Anche nel nostro
programma può capitare che Joe butti fuori il signor Urriega che è il direttore del
Mocambo, o ancora peggio il signor Torcillo che è l’impresario.
Uno con l’abito nero (López) molesta la ragazza e io lo butto fuori!
Uno con l’abito blu (Jiménez) molesta la ragazza e io lo butto fuori!
Uno con l’abito gessato (Urriega) molesta la ragazza e io lo butto fuori!
Uno con l’abito grigio (Torcillo) molesta la ragazza e io lo butto fuori!

Purtroppo Joe non ha capito che il direttore non si tocca, tantomeno l’impresario
del locale, ma la colpa non è sua: sapendo che Joe è un po’ ingenuo, il direttore
avrebbe dovuto istruirlo meglio, per esempio così:
import mocambo
mocambo.iniziaSerata()
tutti = mocambo.tuttiQuanti()
direttore = “Urriega”
impresario = “Torcillo”
for tizio in tutti:
if tizio.cognome == direttore:
continue
elif tizio.cognome == impresario:
continue
elif tizio.molestaQualcuno():
tizio.prendi()
tizio.buttaFuoriACalci()
print(
“Uno con l’abito “
+ tizio.abito + ” (“
+ tizio.cognome
+ “) molesta la ragazza “
+ “e io lo butto fuori!”
)
Questo codice è molto più efficiente, perché i cognomi dei due illustrissimi vengono fissati nelle impostazioni all’inizio del programma, poi si rende più raffinato il ciclo if aggiungendo alcune istruzioni elif, che stanno per l’espressione inglese “else if”, in italiano “se invece”. Molto importante è anche l’istruzione continue che passa subito alla ripetizione successiva di un ciclo for. Notiamo pure che l’operatore di confronto == è diverso dall’operatore di assegnazione = proprio per evitare fraintedimenti, dobbiamo sempre fare attenzione! Con queste nuove istruzioni, il compito per Banana Joe è ottimizzato e adesso, anche nelle serate più movimentate, Joe non prende più a ceffoni i suoi datori di lavoro.
Uno con l’abito gessato (López) molesta la ragazza e io lo butto fuori!
Uno con l’abito blu (Ruiz) molesta la ragazza e io lo butto fuori!
Uno con l’abito grigio (Ramirez) molesta la ragazza e io lo butto fuori!
Uno con l’abito bianco (Jiménez) molesta la ragazza e io lo butto fuori!
Uno con l’abito bianco (Romero) molesta la ragazza e io lo butto fuori!
Uno con l’abito bianco (Pérez) molesta la ragazza e io lo butto fuori!
Uno con l’abito grigio (Muñoz) molesta la ragazza e io lo butto fuori!
Uno con l’abito gessato (Gómez) molesta la ragazza e io lo butto fuori!

Purtroppo quello che non sbaglia più è solo il clone elettronico del nostro amico Banana Joe, mentre quello “vero” è stato licenziato in tronco. Per fortuna Joe ha
fatto in tempo a conoscere la bella Dorianne, e pare che tra loro ci sia già una certa simpatia!