Sì, ci sono ancora parecchie cose da dire, mi sa che neanche oggi finiamo. Ma in fondo siamo entrati nel cuore della programmazione. E poi vogliamo arrivare alla grafica (finestre, pulsanti, etc)? Ecco lì sarà tutto una funzione! E allora ecco...
Una funzione può essere ricorsiva, cioè chiamare se stessa. Di solito si illustra la ricorsività con la definizione di fattoriale. Proprio come faremo noi, subito-subito.
Si definisce fattoriale di N, indicandolo con N!, il prodotto di 1 * 2 * 3 * ... (N-1) * N. Se N è uguale a 0 o 1, allora N! = 1. I matematici riescono a far saltare fuori il fattoriale dove meno te lo aspetti e allora seguiamoli.
Allora se rileggiamo la definizione per N > 1, si ha che N! = N * (N-1)!, cioè è una funzione ricorsiva.
Per rendere la cosa meno monotona (in fondo vogliamo imparare Python, non solo la mate) introduciamo una variabile built-in (cioè predefinita), argv, che si trova nel modulo sys.
È una lista (ne riparleremo), facciamo qualche prova (arg.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
argomenti = sys.argv
numarg = len(sys.argv)
if numarg > 0:
for a in argomenti:
print a
Allora vediamo che ci sono cose interessanti: il primo argomento (quello numero 0) è il nome dello script; ogni argomento è una parola; le virgolette, sia semplici che doppie raggruppano le parole; volendo (provate voi) si possono raggruppare le parole mettendo un \ immediatamente prima dello spazio o del tab o degli altri caratteri speciali.OK, siamo pronti per il calcolo del fattoriale (fact.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def factorial(n):
if n in (0, 1):
return n
else:
return n * factorial(n - 1)
argomenti = sys.argv
if len(sys.argv) > 0:
n = int(sys.argv[1])
print str(n) + '! =', factorial(n)
C'è una congettura (detta di Collatz) che dice: per qualunque numero intero positivo se pari dividi per 2 se dispari moltiplica per 3 e aggiungi 1; ripeti e arriverai sempre a uno. Con Python è semplicissimo, vero, ecco la mia versione (collatz.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def collatz(n):
print n,
if n > 1:
if n % 2 == 0:
n /= 2
else:
n = 3 * n + 1
collatz(n)
# main
if len(sys.argv) == 1:
print "Uso: collatz numero\n"
sys.exit(1)
num = int(sys.argv[1])
collatz(num)
print
Solo una cosa: mettendo una virgola alla fine della print si elimina l'a-capo.Articolo dell'amico Juhan cui va tutta la mia stima e che ringrazio pubblicamente per il corso di Python...Alla fine è lui il maestro...e non io. Per me è una gioia pubblicare i suoi post su questo blog. ;-)
Dimenticavo, l'indice di Mission Python lo trovate qui.
non capisco la prima a me da sempre errore :(
RispondiElimina