lunedì 29 ottobre 2012

Mission Python: I cicli - for e while

Che ne dite di costruire una tabella con i quadrati e i cubi dei primi 10 numeri interi positivi? Può sempre servire no?
Allora pronti, via!

Per fare questa tabella useremo un ciclo di cui sappiamo sia il termine iniziale (1) che quello finale (10). In questo caso l'istruzione che fa per noi è for . Ecco il codice, con millemila cose nuove (tab-qc.py).


#!/usr/bin/python
# -*- coding: utf-8 -*-

for i in range(1, 11):
    print i, '\t', i ** 2, '\t', i ** 3
print "\nOK"

Naturalmente i nostri piccoli nerd sanno che si potrebbe rendere eseguibile lo script con chmod; lo abbiamo lasciato come esercizio tanto sappiamo che lo sapete. E se non lo sapete basta ripassare la lezione precedente Qui

Anche per quanto riguarda le prime due righe abbiamo già detto tutto, vero?

Possiamo quindi cominciare a esaminare il ciclo for. E lo facciamo come farebbero i veri programmatori (TM), usando l'help online.
Aprite il vostro browser preferito al seguente URL (da memorizzare prima di subito) http://docs.python.org/2/genindex.html

OK, questo è solo l'indice, click su F e poi cercate for (con crtl-F)
Dovreste trovare questa roba qui
click su "statement" (sarebbe "istruzione") e finite in uno spiegone che non finisce più. Parla tra l'altro di cose che abbiamo appena accennato (le liste) e altre ancora completamente sconosciute. Ma provate a vedere, spesso vi troverete in una situazione come questa.

OK, tornando a noi: i è la variabile del ciclo, il contatore che assumerà i valori compresi nel range ("range" si può tradurre "intervallo"), dal valore iniziale di 1 a 11 escluso. Sì! attenzione: a differenza di tutti gli altri linguaggi Python non comprende mai l'ultimo elemento di una lista. Una cosa simile l'abbiamo vista quando abbiamo parlato delle stringhe (se non ricordare andare a vedere qui)

La riga finisce con due-punti :
Se siete come me all'inizio ve lo dimenticherete spesso, poi continuerete a dimenticarlo. Il due-punti segna l'inizio del corpo de ciclo, nel nostro caso costituito da una sola riga. Altri linguaggi usano simboli diversi per delimitare il corpo del ciclo, {...} per C, Java, JavaScript per esempio. Il Pascal (e Delphi) usano begin ... end.
Python è diverso: c'è il due-punti come abbiamo detto e poi tutte le righe del corpo devo essere rientrate di una tabulazione o di qualche spazio. Vanno bene sia il Tab che gli spazi ma non si possono mischiare: scegliete quello che vi piace di più e usate solo quello. Io che sono un pasticcione (e ho spesso a che fare con altri come me) preferisco gli spazi perché si vedono, ma voi vedete voi. Tra l'altro gli editor fighi (come Geany) consentono di trasformare gli spazi in tab e viceversa. Quando ero giovane mi ero autocostruito uno shell-script per questo. Se serve lo recupero (o rifaccio).
Il corpo del nostro ciclo è costituito da una sola riga, ricordo che ** è l'operatore di elevazione a potenza e \t è il carattere tab, in modo da avere i numeri incolonnati. (I numeri potrebbero essere incolonnati anche meglio, i più coraggiosi potrebbero andare alla scoperta di format, anche se può essere prematuro; per gli altri niente panico, ci arriveremo).
L'ultima riga non è rientrata perché non fa parte del ciclo e deve quindi essere allineata con le istruzioni precedenti.

C'è un altro ciclo, per quando non sappiamo a priori quante sono le iterazioni. Vediamo un esempio

#!/usr/bin/python
# -*- coding: utf-8 -*-

st = raw_input('numero (zero per finire): ')
n = int(st)
while n > 0:
    radq = n ** 0.5
    print n, radq
    st = raw_input('numero (zero per finire): ')
    n = int(st)
    
print '\nOK, ciao.'

Ecco questo è un ciclo while. while significa mentre quindi si può leggere "mentre n è maggiore di zero" (Sì, potreste fare un salto all'help online).
L'uso di raw_input l'abbiamo già visto. Qui il corpo del ciclo è di quattro righe, vedete com'è ordinato lo script?

OK, allora passiamo a --No! per oggi basta così!

Juhan

P.S. L'indice di "Mission Python" lo trovate qui.

3 commenti:

  1. Bravo molto chiaro, ho vagato per secoli
    per il web cercando spiegazioni chiare su python
    stavolta mi fermo qui :D
    non sono digiuno di programmazione perché da giovane ho studiato l'algol (simil pascal)
    e il linguaggio macchina ,ma son passati molti anni :choke:

    RispondiElimina
  2. sapete dirmi perché avviando questo programmino
    il terminale si chiude improvvisamente? Ho ricopiato coscienziosamente
    non mi lasciate al mio destino :((((

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    for i in range(1, 11):
    print i, '\t', i ** 2, '\t', i ** 3
    print "\nOK"

    RispondiElimina
  3. @Bit3Lux " Quando ero giovane mi ero autocostruito uno shell-script per questo. Se serve lo recupero (o rifaccio)."
    Sarebbe utile almeno dammi una dritta su come autocostruirlo non ho idea di come si fa...

    RispondiElimina