Python: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Diablo (discussione | contributi)
Nessun oggetto della modifica
Diablo (discussione | contributi)
Riga 19:
Vengono supportate anche funzionalità estensive di introspezione sui tipi e sulle classi. I tipi e le classi sono a loro volta oggetti che possono essere esplorati e confrontati. Gli attributi sono gestiti in un dizionario..
 
== Sintassi ==
 
Python è stato progettato in modo da essere altamente leggibile. Visivamente si presenta in modo molto semplice e ha pochi costrutti sintattici rispetto a molti altri linguaggi strutturati come [[Linguaggio C|C]], [[Linguaggio Perl|Perl]] o [[Programmare in Pascal|Pascal]].
 
Per esempio, Python ha solo due forme di ciclo -- <TT>for</TT>, che cicla sugli elementi di una lista o su di un iteratore (come il <TT>foreach</TT> del Perl); e <TT>while</TT>, che cicla fin tanto che l'espressione booleana indicata risulta vera. In sostanza manca dei cicli in stile C <TT>for</TT>, <TT>do</TT>...<TT>while</TT>, oppure di un <TT>until</TT> in stile Perl, ma tutti questi naturalmente possono essere espressi con dei semplici equivalenti. Allo stesso modo ha solamente il costrutto <TT>if</TT>...<TT>elif</TT>...<TT>else</TT> per le scelte condizionate -- niente <TT>switch</TT> oppure <TT>goto</TT>.
 
==== Uso degli spazi ====
 
Una cosa inusuale del Python è il metodo che usa per delimitare i blocchi di programma, che lo rende unico fra tutti i linguaggi più diffusi.
 
Nei linguaggi derivati dall'[[Linguaggio Algol|Algol]] -- come ad esempio Pascal, C e Perl -- i blocchi di codice sono indicati con le parentesi oppure con parole chiave. (Il C ed il Perl usano <TT>{ }</TT>; il Pascal usa <TT>begin</TT> ed <TT>end</TT>.) In questi linguaggi è solo una convenzione degli sviluppatori il fatto di indentare il codice interno ad un blocco, per metterlo in evidenza rispetto al codice circostante.
 
Python, invece, prende a prestito una caratteristica dal meno noto linguaggio di programmazione [[Linguaggio Occam|Occam]] -- invece di usare parentesi o parole chiavi, usa l'indentazione stessa per indicare i blocchi nidificati. Di seguito un esempio per chiarire questo. La versione C e Python di funzioni che fanno la stessa cosa -- calcolare il fattoriale di un intero:
 
''Fattoriale in C:''
int fattoriale(int x) {
if (x == 0) {
return(1);
} else {
return(x * fattoriale(x-1));
}
}
 
''Fattoriale in Python:''
def fattoriale(x):
if x == 0:
return 1
else:
return x * fattoriale(x-1)
 
 
All'inizio questo modo di indicare i blocchi può confondere le idee a chi viene da altri linguaggi, ma poi si rivela molto vantaggioso, perché risulta molto conciso e obbliga a scrivere sorgenti indentati correttamente, aumentando alquanto la leggibilità del codice quando passa di mano in mano.
 
==== Programmazione funzionale ====
 
Come detto sopra, un altro punto di forza del Python è la disponibilità di elementi che facilitano la [[w:programmazione funzionale|programmazione funzionale]]. Come ci si può aspettare, questo rende ancora più comodo operare con liste o altri tipi contenitore. Uno di questi costrutti è stato preso dal linguaggio funzionale [[Linguaggio Haskell|Haskell]] e consente il "riempimento" di una lista, come possiamo vedere nel seguente esempio in cui vengono calcolate le prime cinque potenze di due:
 
numeri = [1, 2, 3, 4, 5]
potenze_di_due = [ 2 ** n for n in numeri ]
 
Dal momento che Python permette di avere funzioni come argomenti, è anche possibile avere costrutti funzionali più sottili, come ad esempio la ''[http://www.ps.uni-sb.de/~duchier/python/continuations.html continuation]''.
 
In Python esiste la parola chiave <tt>lambda</tt>, ma i blocchi <tt>lambda</tt> possono contenere solo [[espressione|espressioni]], non [[statement]]. Non sono quindi il modo più generale per restituire una funzione. Si può usare invece la seguente tecnica, che restituisce una funzione il cui nome è definito in uno [[scope]] locale.
 
def add_and_print_maker(x):
def temp(y):
print "%d + %d = %d" % (x, y, x+y)
return temp
 
==== Gestione delle eccezioni ====
Python supporta e usa estensivamente la [[gestione delle eccezioni]] come un mezzo per controllare la presenza di eventuali condizioni di errore. Addirittura è possibile intercettare l'eccezione generata da un errore di sintassi (syntax error)!
 
Le [[eccezioni]] permettono un controllo degli errori più conciso ed affidabile rispetto a molti altri modi possibili usati in genere per segnalare errori o situazioni anomale. Le eccezioni sono [[thread-safe]]; non sovraccaricano il [[codice sorgente]] come fanno invece in C i controlli sui valori di errore ritornati, e inoltre possono facilmente propagarsi verso l'alto nello [[stack]] delle chiamate a funzione quando un errore deve venire segnalato ad un livello più alto del programma.
 
Il modo di fare frequente consiste, invece che fare controlli preventivi, nell'eseguire direttamente l'azione desiderata e catturare invece le eventuali eccezioni che si verificassero.
 
== Libreria standard ==