Python: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Tipi di dati e strutture: Aggiunto un'immagine relativa alla gerarchia dei tipi in Python 3 con la relativa didascalia |
Migliorato la pagina |
||
Riga 24:
Ideato dall'[[Paesi Bassi|olandese]] [[Guido van Rossum]] all'inizio degli [[Anni 1990|anni novanta]], è spesso paragonato a [[Ruby (linguaggio di programmazione)|Ruby]], [[Tcl]], [[Perl]], [[JavaScript]], [[Visual Basic]] o [[Scheme]]<ref>Dal file ''README'' della distribuzione 2.6.4: "''What is Python anyway? Python is an interpreted, interactive object-oriented programming language suitable (amongst other uses) for distributed application development, scripting, numeric computing and system testing. Python is often compared to Tcl, Perl, Java, JavaScript, Visual Basic or Scheme.''"</ref>. Il nome fu scelto per la passione dello stesso inventore verso i [[Monty Python]] e per la loro serie televisiva ''[[Monty Python's Flying Circus]]''<ref>Fonte: {{cita web |url=https://www.python.org/search/hypermail/python-1992/0001.html |titolo=Copia archiviata |accesso=27 ottobre 2009 |urlmorto=sì |urlarchivio=https://web.archive.org/web/20091217210327/http://www.python.org/search/hypermail/python-1992/0001.html |dataarchivio=17 dicembre 2009 }}</ref>.
Spesso è tra i primi [[Linguaggio di programmazione|linguaggi di programmazione]]
Python dispone anche di una sezione grafica, il modulo
== Descrizione ==
Riga 32:
Supporta multipli [[paradigma di programmazione|paradigmi di programmazione]], tra cui quello [[programmazione orientata agli oggetti|a oggetti]] e quello [[programmazione funzionale|funzionale]].
Le caratteristiche più immediatamente riconoscibili di Python sono le [[variabile (informatica)|variabili]] non tipizzate e l'uso dell'[[indentazione]] per la sintassi delle specifiche, al posto delle più comuni parentesi.
Altre caratteristiche distintive sono l'[[overloading]] di operatori e funzioni tramite [[delegation|delegati]], la presenza di un ricco assortimento di tipi e funzioni di base e librerie standard, sintassi avanzate quali ''slicing'' e ''list comprehension''.
Il controllo dei tipi è [[Tipizzazione forte|forte]] (''strong typing'') e viene eseguito a ''[[
Python ha qualche somiglianza con [[Perl]], ma i suoi progettisti hanno scelto una sintassi più essenziale e uniforme con l'obiettivo di migliorare la leggibilità del codice. Analogamente a [[Perl]] è classificato spesso come [[Linguaggio di scripting|linguaggio di ''scripting'']], ma pur essendo utile per scrivere [[script]] di sistema, in alternativa per esempio a [[bash]], la grande quantità di librerie disponibili e la facilità con cui il linguaggio permette di scrivere software [[Modularità (informatica)|modulare]] favoriscono anche lo sviluppo di applicazioni molto complesse.
=== Altre caratteristiche ===
[[File:esempio Python.png|miniatura|destra|[[Codice sorgente]] di un programma scritto in Python]]
[[File:Python_add5_syntax.svg|miniatura|destra|Esempio di codice sorgente scritto in Python]]
Sebbene Python venga in genere considerato e presentato come un [[linguaggio interpretato]], in realtà il [[codice sorgente]] non viene convertito direttamente in [[linguaggio macchina]], ma passa prima da una fase di pre-compilazione in ''[[bytecode]]'', che viene quasi sempre riutilizzato dopo la prima esecuzione del programma, evitando così di dover reinterpretare ogni volta il sorgente e migliorando le prestazioni. Inoltre è possibile distribuire programmi Python direttamente in bytecode, saltando totalmente la fase di interpretazione da parte dell'utilizzatore finale e ottenendo programmi Python a sorgente chiuso<ref>{{Cita web|url=http://effbot.org/pyfaq/how-do-i-create-a-pyc-file.htm|titolo=How do I create a .pyc file?|sito=effbot.org|accesso=2020-05-28|dataarchivio=3 giugno 2020|urlarchivio=https://web.archive.org/web/20200603024428/http://effbot.org/pyfaq/how-do-i-create-a-pyc-file.htm|urlmorto=sì}}</ref>.
[[File:Run Module Python.png|miniatura|408x408px|[[Menù a tendina]] dal quale si può eseguire il programma cliccando su "Run Module" o con lo shortcut F5 da [[windows 10]] in poi.]]
Come il linguaggio [[Lisp]] e a differenza del Perl, l'[[Interprete (informatica)|interprete]] Python supporta anche un modo d'uso interattivo ([[Read–eval–print loop|REPL]]) attraverso cui è possibile inserire codice direttamente da un terminale, visualizzando immediatamente il risultato.
Riga 49:
Inoltre l'interprete Python è contenuto nella libreria standard, perciò come in molti altri linguaggi interpretati è possibile far valutare stringhe arbitrarie nel contesto corrente. È possibile passare all'interprete anche un contesto completamente diverso, sotto forma di liste che contengono l'elenco dei simboli definiti.
Python dispone anche di un ''[[framework]]'' per lo ''[[
=== Prestazioni ===
Se paragonato ai linguaggi compilati ''statically typed'', come ad esempio il [[C (linguaggio)|C]], la velocità di esecuzione non è uno dei punti di forza di Python<ref>{{Cita web|url=https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/python3-gcc.html|titolo=Python 3 vs C gcc - Which programs are fastest? {{!}} Computer Language Benchmarks Game|sito=benchmarksgame-team.pages.debian.net|accesso=2020-05-28}}</ref>, specie nel calcolo matematico. Inoltre, il programma si basa unicamente su un core,
Python permette di aggirare in modo facile l'ostacolo delle performance pure: è infatti relativamente semplice scrivere un'estensione in
=== Implementazioni ===
Riga 62:
* [[IronPython]]: implementazione [[C sharp|C#]] pensata per l'integrazione con l'ecosistema [[Microsoft .NET|.NET]];<ref>[http://ironpython.net/ IronPython: the Python programming language for the .NET Framework]</ref>
* PyS60: implementazione per [[Symbian OS]];<ref>[https://sourceforge.net/projects/pys60/ The Python programming language for S60 mobile phones]</ref>
*
== Sintassi ==
Python è stato progettato in modo da risultare facilmente leggibile e scrivibile. Visivamente si presenta in modo lineare e pulito, con pochi costrutti sintattici rispetto ad altri linguaggi strutturati come per esempio [[C (linguaggio)|C]], [[Perl]] o [[Pascal (linguaggio di programmazione)|Pascal]].
Per esempio, Python ha solo due forme di ciclo:
=== Indentazione ===
Un aspetto inusuale di Python è il metodo che usa per delimitare i blocchi di programma, che lo rende unico fra i linguaggi più diffusi.
Nei linguaggi derivati dall'[[ALGOL]]. come Pascal, C e Perl, i blocchi di codice sono indicati con parentesi oppure con parole chiave; per esempio il
Python, invece, deriva il suo sistema di indentazione dal meno noto linguaggio di programmazione [[Occam (linguaggio di programmazione)|Occam]]: invece di usare parentesi o parole chiave, usa l
<syntaxhighlight lang="c" line="1" copy=1>
int fattoriale(int x) {
if (x == 0)
Riga 86:
</syntaxhighlight>
<syntaxhighlight lang="python" line="1" copy=1>
def fattoriale(x):
if x == 0:
Riga 100:
Lo svantaggio è che la gestione degli spazi e dei caratteri di tabulazione può essere diversa da un [[editor di testo]] all'altro, il che costringe a prestare attenzione nell'indentare il codice oppure ad affidarsi alle funzioni di indentazione automatica ormai presenti nella maggior parte degli editor di programmi. Può anche capitare di lavorare con editor di codice sorgente diversi, su vari computer, e ritrovarsi così con codice sorgente che usa in modo misto tabulazioni e spazi, accorgendosi dell'errore solo in fase di esecuzione.
Python permette anche alcune scorciatoie per scrivere una maggiore quantità di codice sulla stessa riga. Se i due punti (<code>:</code>) danno il via a un blocco indentato di una sola istruzione, esso può essere scritto anche sulla stessa riga, preceduto da uno spazio. <syntaxhighlight lang="python">
if b > a: print("b is greater than a")
</syntaxhighlight>
Sebbene decisamente poco apprezzabile per i puristi del linguaggio Python, è comunque possibile usare il "[[punto e virgola]]" (<code>;</code>) come in grande parte dei linguaggi di programmazione per indicare che un'istruzione è conclusa, e cominciarne un'altra sulla stessa riga.<syntaxhighlight lang="python">
a = b + 10; print("Hello world"); b = 243 - 23;
</syntaxhighlight>
Riga 112:
Essendo Python a [[tipizzazione dinamica]], tutte le variabili sono, in realtà, [[Puntatore (programmazione)|puntatori]] a [[Oggetto (informatica)|oggetto]]. Per esempio, se a una variabile è assegnato un valore numerico intero, subito dopo può essere assegnata una stringa o una lista. Gli oggetti sono invece dotati di tipo.
Python prevede un moderato controllo dei tipi al momento dell'esecuzione, ovvero ''[[
Python dispone di vari modelli/librerie da utilizzare per fornire funzionalità senza dovere scrivere codice, come per esempio il modulo
Python mette a disposizione un gran numero di [[Tipo di dato|tipi base]], essenzialmente numerici e contenitori. Caratteristica distintiva è il supporto nativo, oltre che ai classici tipi quali
Molti altri tipi sono importabili da librerie standard e nuovi tipi possono essere creati attraverso le
=== Tipi numerici ===
I tipi [[Numero intero (informatica)|interi]] (
Python prevede tutti i principali operatori logici e aritmetici fra numeri, compreso l'elevamento a potenza. Il tipo booleano (
Dalla versione 2.4 di Python sono disponibili come libreria<ref>{{Cita web|url=https://docs.python.org/2/library/decimal.html|titolo=9.4. decimal — Decimal fixed point and floating point arithmetic — Python 2.7.18 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> anche i numeri decimali (
=== Contenitori ===
Python considera in generale come
Per quanto riguarda i contenitori standard propriamente detti, sono classificabili come
Le
Le
Sono previste tutte le operazioni classiche sulle stringhe come concatenamento, formattazione, ricerca, sostituzione e così via. Le stringhe in Python sono sequenze immutabili, cosicché qualsiasi operazione che in qualche modo potrebbe alterare una stringa, per esempio la sostituzione di un carattere, restituisce in effetti una nuova stringa, come avviene in Java e in [[C sharp|C#.]]
Altri contenitori sono i
Per esempio l'istruzione seguente crea un dizionario identificato come <code>diz</code> composto da due elementi le cui chiavi sono <code>wikipedia</code> e <code>wikiquote</code>'',
Le chiavi in un dizionario sono immutabili, mentre il valore corrispondente a ciascuna chiave è alterabile tramite un'assegnazione. La seguente istruzione modifica il valore corrispondente a
A partire dalla versione 2.7 di Python<ref>{{Cita web|url=https://docs.python.org/2.7/library/stdtypes.html|titolo=5. Built-in Types — Python 2.7.18 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> sono supportati anche gli insiemi (
=== Organizzazione a oggetti ===
Riga 151:
== Programmazione funzionale e sintassi avanzate ==
{{C|Troppe cose e poco chiare. Perché la sintassi avanzata deve stare qui? |informatica|marzo 2013}}
Un altro punto di forza di Python è la disponibilità di elementi che facilitano la [[programmazione funzionale]]. Le funzioni sono considerate degli oggetti e sono dunque utilizzabili alla stregua di qualsiasi altro oggetto,
Gli ''slicing'' sono un costrutto simile all'indicizzazione in grado di ottenere sottosequenze specificando gli indici di inizio e di fine e lo 'step'.
<syntaxhighlight lang="python" line="1" copy=1>
numeri = [1, 2, 3, 4, 5]
numeri_pari = numeri[1::2] # esempio di slicing
</syntaxhighlight>
La ''[[list comprehension]]'' è un costrutto preso dal linguaggio funzionale [[Haskell (linguaggio)|Haskell]] e consente il "riempimento" di una lista
<syntaxhighlight lang="python" line="1" copy=1>numeri = [1, 2, 3, 4, 5]
potenze_di_due = [2 ** n for n in numeri] # esempio di list comprehension</syntaxhighlight>▼
▲potenze_di_due = [2 ** n for n in numeri] # esempio di list comprehension
I
=== Generator expression ===
<syntaxhighlight lang="python" line="1" copy=1>▼
▲<syntaxhighlight lang="python">
numeri = [1, 2, 3, 4, 5]
potenze_di_due = (2 ** n for n in numeri) # generatore
</syntaxhighlight>
Oppure, per avere un maggiore controllo, come una normale funzione, possiamo usare la parola chiave
<syntaxhighlight lang="python" line="1" copy=1>
numeri = [1, 2, 3, 4, 5]
def potenza_di_due(numeri):
Riga 185 ⟶ 182:
</syntaxhighlight>
L'uso è identico. Si chiama la funzione next che restituisce un nuovo valore ogni volta, riprendendo l'esecuzione del codice dalla parola chiave
<syntaxhighlight lang="python" line="1" copy=1>
gen = (2 ** n for n in range(1, 6))
for x in gen:
Riga 193 ⟶ 190:
</syntaxhighlight>
Per creare una lista da un generatore, si usa semplicemente la chiamata {{Codice|codice=list(gen)|linguaggio=Python}}:
<syntaxhighlight lang="python" line="1" copy=1>
gen = (2 ** n for n in range(1, 6))
print(list(gen))
</syntaxhighlight>
I generatori sono preferiti alle liste in quanto non occupano memoria, dato che i valori sono semplicemente calcolati di volta in volta e non permangono in memoria. Per questo è consigliabile usare, per esempio,
È anche possibile scrivere espressioni if...else su una sola riga, cosa che risulta utile in combinazione con le lambda (vedi sotto).
<syntaxhighlight lang="python" line="1" copy=1>
import random
l = [1, 2]
Riga 209 ⟶ 206:
</syntaxhighlight>
Dal momento che Python permette di avere [[Funzione di ordine superiore|funzioni come argomenti]], è anche possibile avere costrutti funzionali più sottili, come
In Python esiste la parola chiave
<syntaxhighlight lang="python" line="1" copy=1>
>>> l = [1, 2,3,4,5] # oppure range(1,6)
>>> print(map(lambda x: x + 10, l))
Riga 218 ⟶ 215:
</syntaxhighlight>
Questo uso di ''map'' però è contestato e si preferisce usare le ''list
<syntaxhighlight lang="python" line="1" copy=1>
>>> l = [1, 2, 3, 4, 5] # oppure range(1,6)
>>> print([x + 10 for x in l])
Riga 226 ⟶ 223:
</syntaxhighlight>
I blocchi
<syntaxhighlight lang="python" line="1" copy=1>
def multiple_adder(x, y):
def adder(z):
Riga 236 ⟶ 233:
=== Decoratori ===
Un
I decoratori sono ispirati in parte dalla notazione Java, hanno una sintassi simile e sono considerati [[zucchero sintattico]]. Usano <code>@</code> come parola chiave:
<syntaxhighlight lang="python" line="1" copy=1>@viking_chorus
def menu_item():
print("spam")</syntaxhighlight>
I decoratori possono essere a catena posizionandone diversi in linee adiacenti:
<syntaxhighlight lang="python" line="1" copy=1>
@invincible
@favorite_color("Blue")
Riga 256 ⟶ 251:
ed è equivalente a:
<syntaxhighlight lang="python" line="1" copy=1>
def black_knight():
pass
Riga 264 ⟶ 259:
La struttura standard del decoratore è:
<syntaxhighlight lang="python" line="1" copy=1>
def favorite_color(color):
def decorator(func):
Riga 275 ⟶ 270:
=== Commenti ===
Analogamente ad altri linguaggi di programmazione, in Python è possibile lasciare dei commenti nelle righe di codice per comprendere e far comprendere meglio ciò che accade eseguendo il programma. In Python i commenti (già a partire dalle primissime versioni del linguaggio di programmazione) si introducono con il simbolo
print("qualcosa a caso") #questo programma stampa "qualcosa a caso" nella console ignorando tutto ciò che viene scritto dopo il simbolo "#"
print("andando a caporiga l'effetto del cancelletto sparisce e il codice ha effetto sul programma")
Riga 281 ⟶ 276:
</syntaxhighlight>
Spesso i commenti vengono utilizzati per il cosiddetto "[[
Un esempio pratico sarebbe:
<syntaxhighlight lang="python" line="1" copy=1>
print("Questa riga stampa qualcosa alla console")
# print("Questa invece, non stampa niente.")
Riga 295 ⟶ 290:
Le [[Eccezione (informatica)|eccezioni]] permettono un controllo degli errori più conciso e affidabile rispetto a molti altri modi possibili usati in genere per segnalare errori o situazioni anomale. Le eccezioni sono [[Thread safety|thread-safe]]; non sovraccaricano il [[codice sorgente]] come fanno invece i controlli sui valori di errore restituiti e possono facilmente propagarsi verso l'alto nello ''stack'' delle chiamate a funzione quando un errore deve essere segnalato a un livello più alto del programma.
Con la gestione delle eccezioni i controlli preventivi sono sostituiti da un più agevole meccanismo che permette di eseguire direttamente l'azione desiderata e catturare separatamente le eventuali eccezioni che si possono verificare. Oltre che per la gestione degli errori, in alcune occasioni le eccezioni sono usate in Python anche per il controllo di flusso: ad esempio l'operazione di iterazione, e di conseguenza il ciclo <code>for
=== Libreria standard ===
Riga 318 ⟶ 313:
=== Creazione di un Socket, invio di richieste e ricevere dati ===
<syntaxhighlight lang="python" line="1" copy=1>
import socket
Riga 342 ⟶ 337:
</syntaxhighlight>
=== Formattazione
<syntaxhighlight lang="python" line="1" copy=1>
a = input('Name: ')
b = input('Last Name: ')
Riga 351 ⟶ 346:
# Ma puoi anche:
print("Name ={}\nLast Name = {}\n Age = {}".format(a,b,c))
</syntaxhighlight><syntaxhighlight lang="python" line="1" copy=1>
# Programma che simula l'inserimento di una password e la sua convalida
Riga 377 ⟶ 372:
=== RGB binario, RGB esadecimale ===
Il seguente esempio di programma Python (versione 3.8.5<ref>{{Cita web|url=https://www.python.org/downloads/release/python-385/|titolo=rilascio versione 3.8.5|sito=Python.org}}</ref>) converte con i dovuti passaggi delle percentuali di rosso, verde e blu, un [[input]] in un colore codificato in [[RGB]]:<syntaxhighlight lang="python3" line="1" copy=1>
def RGB_bin():
import string
Riga 420 ⟶ 415:
hexadecimal_colour = (str(R) + " " + str(G) + " " + str(B))
print("Colour coded by hexadecimal digits: " + str(hexadecimal_colour[2:5]) + str(hexadecimal_colour[7:10]) + str(hexadecimal_colour[12:14]))
</syntaxhighlight>L'[[Output (informatica)|output]] del [[codice sorgente]] sopra è il seguente:<syntaxhighlight lang="python3" line="1" copy=1>
======== RESTART: D:\Python\Python\Python38-32\Python3.8.5 dal pc\RGB.py =======
>>> RGB_bin()
Riga 434 ⟶ 429:
=== Definizione di una classe ===
In Python è possibile creare classi attraverso un'istruzione specifica (
Il parametro riflessivo è per convenzione chiamato
Python fa distinzione tra metodi d'istanza, di classe o statici. Gli attributi possono essere invece d'istanza o di classe. Il supporto all'information hiding è parziale, ma integrato dallo strumento delle ''property'' che permettono di definire degli attributi virtuali con le caratteristiche di accesso volute.
Inoltre sono previsti dei metodi "speciali" associati a operatori e funzioni di built-in. Ad esempio, ridefinendo il metodo
A partire da Python 3.6, è possibile utilizzare una nuova funzione chiamata
<syntaxhighlight lang="python">
class Persona(object):
Riga 462 ⟶ 457:
L'output presentato sarà il seguente: <code>Sig. Rossi Mario</code>
L'output restituisce i numeri perfetti fino a <code>n</code> (inserito in {{Codice|codice=print|linguaggio=Python}}).<syntaxhighlight lang="python3">
"""Numeri perfetti"""
def print_perfetti(n):
Riga 482 ⟶ 477:
== Note ==
<references
== Bibliografia ==
Riga 497 ⟶ 492:
== Altri progetti ==
{{
== Collegamenti esterni ==
Riga 513 ⟶ 508:
{{FOSS}}
{{Controllo di autorità}}
{{
[[Categoria:Python| ]]
|