Python: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
LRKalle (discussione | contributi)
Pulizia del linguaggio e aggiornamento di alcune parti
Riga 22:
'''Python''' è un [[linguaggio di programmazione ad alto livello|linguaggio di programmazione di più "alto livello"]] rispetto alla maggior parte degli altri linguaggi. È [[Programmazione orientata agli oggetti|orientato a oggetti]], ma non in maniera ferrea come ad esempio [[Java (linguaggio di programmazione)|Java]]; adatto, tra gli altri usi, a sviluppare [[applicazione (informatica)|applicazioni]] distribuite, [[scripting]], [[Calcolo (matematica)|computazione numerica]] e [[Testing#Il collaudo di sistema|system testing]].
 
Fu ideato da [[Guido van Rossum]] all'inizio degli [[Anni 1990|anni novanta]]. Il nome fu scelto per via dellala passione didello vanstesso Rossuminventore perverso 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>. Python è spesso paragonato a [[Ruby (linguaggio di programmazione)|Ruby]], [[Tcl]], [[Perl]], [[Java (linguaggio di programmazione)|Java]], [[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>.
 
Spesso viene anche studiato tra i primi linguaggi per la sua somiglianza a uno [[Pseudocodice|pseudo-codice]]. Vienee usatodi spessofrequente ancheviene usato per simulare la creazione di queisoftware programmigrazie chealla magariflessibilità andrebberodi attuatisperimentazione inconsentita altrida linguaggiPython, ma il testarli in Pythonche permette al programmatore di riordinareorganizzare le idee adurante riguardolo sviluppo, (come per esempio il creare un gioco tramite [[Pygame]] o un social-network tramite [[Flask (informatica)|Flask]]).
 
== Descrizione ==
È un linguaggio [[Paradigma di programmazione|multi-paradigma]] che ha tra i principali obiettivi: dinamicità, semplicità e flessibilità. Supporta il paradigma [[object oriented]], la [[programmazione strutturata]] e molte caratteristiche di [[programmazione funzionale]] e [[Riflessione (informatica)|riflessione]].
 
Le caratteristiche più immediatamente riconoscibili di Python sono le [[variabile (informatica)|variabili]] non tipizzate e l'uso dell'indentazione per la definizionesintassi delle specifiche. Altre caratteristiche distintive sono l'[[overloading]] di operatori e funzioni tramite [[delegation]], laal presenzaposto di un ricco assortimento di tipi e funzioni di base e librerie standard, sintassi avanzate quali ''slicing''delle epiù ''listcomuni comprehension''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 è forte (''strong typing'') e viene eseguito a [[runtime]] (''dynamic typing''): una variabile è un contenitore a cui viene associata un'etichetta (il nome) che può essere associata a diversi contenitori anche di tipo diverso durante il suo tempo di vita. Usa un [[garbage collector]] per la liberazione automatica della memoria.
 
Il controllo dei tipi è forte (''strong typing'') e viene eseguito ain [[runtime]] (''dynamic typing''): una variabile è un contenitore a cui viene associata un'etichetta (il nome) che può essere associata a diversi contenitori anche di tipo diverso durante il suo tempo di vita. UsaFa parte di Python un sistema [[garbage collector]] per la liberazione automaticae recupero automatico della memoria di lavoro.
Ha qualche somiglianza con [[Perl]], ma i suoi progettisti hanno scelto una sintassi più essenziale e uniforme con l'obiettivo di aumentare la leggibilità del codice. Analogamente a Perl è classificato spesso come [[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 modulare favoriscono anche lo sviluppo di applicazioni molto complesse.
 
HaPython ha qualche somiglianza con [[Perl]], ma i suoi progettisti hanno scelto una sintassi più essenziale e uniforme con l'obiettivo di aumentaremigliorare la leggibilità del codice. Analogamente a Perl è classificato spesso come [[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 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 un [[linguaggio interpretato]], in realtà il [[codice sorgente]] non viene convertito direttamente in [[linguaggio macchina]]. Infatti passa prima da una fase di pre-compilazione in [[bytecode]], che viene quasi sempre riutilizzato dopo la prima esecuzione del programma, evitando così di reinterpretare ogni volta il sorgente e incrementandomigliorando 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}}</ref>.
 
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.
 
Inoltre l'interprete Python è contenuto nella libreria standard, eperciò 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 [[Testing#Il collaudo di modulo|unit testing]] che supporta lo sviluppo di test unitari automatici.
Line 48 ⟶ 50:
=== Prestazioni ===
{{F|linguaggi di programmazione|giugno 2014}}
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. EsisteEsisteva un'estensione, [[Psyco (JIT)|Psyco]]<ref>{{Cita web|url=http://psyco.sourceforge.net/|titolo=Psyco - Home Page|sito=psyco.sourceforge.net|accesso=2020-05-28}}</ref>, cheil cui sviluppo è terminato nel 2012, che era una sorta di [[Compilatore just-in-time|compilatore JIT]] in grado di velocizzare in modo notevole alcuni tipi di codice, specialmente l'implementazione di algoritmi, a scapito dell'aumento di memoria utilizzata. Un progetto attuale e attivamente sviluppato per migliorare le prestazioni del codice Python grazie a un [[Compilatore just-in-time|compilatore JIT]] è PyPy<ref>{{Cita web|url=https://www.pypy.org/|titolo=PyPy|autore=The PyPy Team|sito=PyPy|data=2019-12-28|lingua=en|accesso=2020-05-28}}</ref>.
 
Le prestazioni di Python sono allineate o addirittura superiori a quelle di altri linguaggi interpretati, quali [[PHP]]<ref>{{Cita web|url=https://medium.com/@HarriSrivastav/is-python-faster-than-php-852e7734cd82|titolo=Is Python faster than PHP?|autore=Harri Srivastav|sito=Medium|data=2016-02-19|lingua=en|accesso=2020-05-28}}</ref> e Ruby, e in certe condizioni Python può rivaleggiare anche con [[Java (linguaggio di programmazione)|Java]]<ref>{{Cita web|url=https://www. Python permette di aggirare in modo facile l'ostacolo delle snaplogic.com/glossary/python-vs-java-performance pure: è infatti relativamente semplice scrivere un'estensione in [[C (linguaggio)|C]] o [[C++]] e poi utilizzarla all'interno di titolo=Python, sfruttandovs. cosìJava l'elevata velocità di un linguaggio compilato solo nelle parti in cui effettivamente serve e sfruttando invece la potenza e versatilità di Python per tutto il resto del softwarePerformance|sito=SnapLogic|lingua=en-US|accesso=2020-05-28}}</ref>.
 
Python permette di aggirare in modo facile l'ostacolo delle performance pure: è infatti relativamente semplice scrivere un'estensione in [[C (linguaggio)|C]] o [[C++]] e poi utilizzarla all'interno di Python, sfruttando così l'elevata velocità di un linguaggio compilato solo nelle parti in cui effettivamente serve e sfruttando invece la potenza e versatilità di Python per tutto il resto del software<ref>{{Cita web|url=https://realpython.com/python-bindings-overview/|titolo=Python Bindings: Calling C or C++ From Python – Real Python|autore=Real Python|sito=realpython.com|lingua=en|accesso=2020-05-28}}</ref>.
 
=== Altre implementazioni ===
Line 61 ⟶ 65:
 
== Tipi di dati e strutture ==
Essendo Python a [[tipizzazione dinamica]], tutte le variabili sono in realtà [[Puntatore (programmazione)|puntatori]] a [[Oggetto (informatica)|oggetto]] (''reference''). Per esempio se a una variabile a cui è stato assegnato un valore di tiponumerico intero, subito dopo può essere assegnata una stringa o una lista. Gli oggetti sono invece dotati di tipo.
 
In Python c'èprevede un moderato controllo dei tipi al momento deldell'esecuzione, ovvero [[runtime]]. Si haI conversionetipi implicitanumerici pergodono idi tipiconversione numerici,implicita cheperciò permetteè possibile, per esempio di, moltiplicare un numero complesso per un intero,. ma nonNon esiste lainvece conversione implicita tra numeri e stringhe alfanumeriche; perciò un numero è un argomento non valido per le operazioni su stringastringhe, a differenza di quanto avviene per esempio in linguaggio PHP.
 
Python dispone di vari modelli/librerie da utilizzare per fornire funzionalità senza dovere scrivere codice, come per esempio il modulo ''turtle graphics''<ref>{{Cita web|url=https://docs.python.org/3.3/library/turtle.html?highlight=turtle|titolo=24.1. turtle — Turtle graphics — Python 3.3.7 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> (per disegnare), ''copy''<ref>{{Cita web|url=https://docs.python.org/2/library/copy.html|titolo=8.17. copy — Shallow and deep copy operations — Python 2.7.18 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> (per creare copie di [[Oggetto (informatica)|oggetti]]), ''random''<ref>{{Cita web|url=https://docs.python.org/3/library/random.html|titolo=random — Generate pseudo-random numbers — Python 3.8.3 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> (per generare numeri casuali), <u>''sys''</u><ref>{{Cita web|url=https://docs.python.org/2/library/sys.html|titolo=28.1. sys — System-specific parameters and functions — Python 2.7.18 documentation|sito=docs.python.org|accesso=2020-05-28}}</ref> (per interagire da riga di comandi con l'interprete) e ''time'' (per operare con unità di tempo e date).
Al suo interno ci sono vari modelli da utilizzare per usare varie funzioni semplificandone l'uso, come il modulo turtle (per disegnare usando il [[Coding DNA sequence|coding]]), il modulo copy (per creare copie di [[Oggetto (informatica)|oggetti]]), il modulo random (per generare situazioni casuali) che si divide in randint (per un numero da x a y), choice (per far scegliere un elemento a caso da una [[Lista (informatica)|lista]]) e shuffle (per mischiare gli elementi di una lista); il modulo sys (per controllare la [[Shell (informatica)|shell]] di Python) e il modulo time (per conoscere e misurare il tempo).
 
Python mette a disposizione un gran numero di [[Tipo di dato|tipi base]], essenzialmente tipi numerici e contenitori. Caratteristica distintiva è il supporto nativo, oltre che ai classici tipi quali interi, [[floating point]], (numeri con virgola mobile) e stringhe alfanumeriche, anche a tipi più evoluti quali interi a grandezza arbitraria, numeri complessi, ''liste'', ''insiemi, e'' ''dizionari con delle comode sintassi per la costruzione degli stessi (letterali)''. Non è invece previsto un tipo specifico per i caratteri.
 
Molti altri tipi sono importabili da librerie standard e nuovi tipi possono essere creati attraverso le ''classi''.
 
=== Tipi numerici ===
I tipi [[Numero intero (informatica)|interi]] (<code>int</code>) e [[floating point]] (<code>float</code>) hanno una precisionedimensione dipendente dall'hardware e dall'implementazione dell'interprete, in genere 32 e 64 [[bit]]. Sono previsti, in modo nativo, numeri interi arbitrariamente grandi (<code>long</code>, che diventano l'opzione di default per gli interi a partire da Python 3.0) e numeri complessi (<code>complex</code>).
 
SonoPython definitiprevede tutti i principali operatori logici e aritmetici fra numeri, compreso l'elevamento a potenza. Il tipo booleano (<code>bool</code>) appartiene anch'esso alla categoria dei numeri.
 
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 (<code>decimal</code>), ossia numeri con lain virgola amobile con precisione illimitata, come quelli disponibili in [[REXX]] o in [[Cobol]], che non soffrono di problemi di arrotondamento e stabilità tipici dei numeri [[floating point]] classici.
 
=== Contenitori ===
Line 83 ⟶ 87:
Per quanto riguarda i contenitori standard propriamente detti, sono classificabili come ''sequenze'', ''insiemi'' e ''dizionari''. I contenitori seguono una filosofia comune e condividono gran parte dei [[Metodo (programmazione)|metodi]].
 
Le ''sequenze'' sono contenitori ordinati, che condividono dei metodi basati sull'ordinamento, l'indicizzazione intera e la creazione di sottosequenze tramite ''slicing''.

Le ''liste'' (<code>list</code>) sono sequenze estendibili, invecementre le [[tupla|tuple]] (<code>tuple</code>) sono sequenze immutabili. Anche le [[Stringa (informatica)|stringhe]] alfanumeriche (<code>str</code> e <code>unicode</code>) sono considerate sequenze. A partire da Python 3.0, i tipi <code>str</code> e <code>unicode</code> sono unificati e compare il tipo <code>byte</code>, equivalente grosso modo a una stringa binaria.
 
Sono previste tutte le operazioni classiche sulle stringhe come concatenamento, formattazione, ricerca, sostituzione, ecce 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 invecein effetti una nuova stringa, come avviene in Java e in [[C sharp|C#.]]
 
Altri contenitori sono i ''dizionari'' (<code>dict</code>), conosciuti in altri contesti con il nome di [[hash table]] oppure [[array associativo|array associativi]]. Esiste una sintassi per la creazione di dizionari, i cui elementi sono specificati da una coppia di dati separati da due punti ':'. Il primo elemento della coppia rappresenta l'indice, detto "chiave", e il secondo è il suo valore corrispondente, detto "valore". Ogni elemento è detto "coppia chiave-valore".
Per esempio l'istruzione seguente crea un dizionario Aidentificato come ''diz'' composto da due elementi le cui chiavi sono "''wikipedia"'' e "''wikiquote", rispettivamente'' e con associati i valori 40 e 60: <syntaxhighlight lang="Pythonpython">Adiz = {'wikipedia': 40000040, 'wikiquote': 600060}</syntaxhighlight>
Le chiavi sono immutabili, mentre il valore corrispondente è variabile tramite un'assegnazione. La seguente istruzione modifica il valore corrispondente a "wikipedia", portandolo a 4500004500: <syntaxhighlight lang="Pythonpython">Adiz['wikipedia'] = 4500004500</syntaxhighlight>
 
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 (<code>set</code> e <code>frozenset</code>), ovvero insiemi non ordinati di oggetti ''hashable''.
 
=== Organizzazione a oggetti ===
Il [[sistema dei tipi]] Python è ben integrato con il sistema delle [[Classe (informatica)|classi]]. Anche se i tipi base non sono precisamenteformalmente classi, come per esempio in [[C sharp|C#]], una classe può comunque ereditare da essi. In questo modo è possibile estendere stringhe, dizionari e perfino gli interi. È inoltre supportata l'[[ereditarietà multipla]]<ref>{{Cita web|url=https://pythonitalia.github.io/python-abc/Pyllole/85_Inheritance_Multiple.html|titolo=Ereditarietà multipla|sito=Python ABC|lingua=en-US|accesso=2020-05-28}}</ref>.
 
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 [[Attributo (programmazione)|attributi]] sono gestiti in un dizionario.
 
== Sintassi ==
Python è stato progettato in modo da essererisultare facilmente leggibile. Visivamente si presenta in modo semplicelineare e hapulito, 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: <kbd><code>for</code></kbd> che itera sugli elementi di una lista o su di un iteratore (equivalente al <kbd>''foreach''</kbd> del Perl) e <kbd><code>while</code></kbd> che cicla fin tanto che l'[[espressione booleana]] indicata risulterà vera. In sostanza manca dei cicli in stile C <kbd><code>for</code></kbd>, <kbd><code>do -</code></kbd> <kbd><code>while</code></kbd>, oppure die <kbd>until<code>unti</code></kbd> in stile Perl, ma tutti questi possono essere espressi con dei semplici equivalenti. Allo stesso modo ha solamente il costrutto <kbd><code>if elif</kbdcode></kbd>elif </kbd><kbdcode>else</code></kbd> per le scelte condizionate, ma non possiede né <kbd><code>switch</code></kbd> né <kbd>goto<code>got</code></kbd> (salto incondizionato).
 
=== Indentazione ===
Un aspetto inusuale del 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 le parentesi oppure con parole chiave; per esempio (il [[C (linguaggio)|C]] e il [[Perl]] usano <kbd>{ }</kbd>; mentre il [[Pascal (linguaggio di programmazione)|Pascal]] usa <kbd><code>begin</code></kbd> ede <kbd><code>end</code></kbd>). In questi linguaggi è solo una pura convenzione degli sviluppatori il fatto di [[Indentazione|indentare]] il codice interno a un blocco, per metterlomigliorarne inla evidenzaleggibilità rispettoe alchiarire codicela struttura del flusso di circostanteesecuzione. Invece Python 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'''indentazione'' stessa per indicare i blocchi nidificati in congiunzione col carattere "due punti" (:). SiIn Python si puòpossono usare sia una tabulazione, sia un numero arbitrario di spazi, mapurchè losiano standardusati Pythonsempre èin dimodo 4congruente spazicon la sintassi del linguaggio. L'esempio che segue chiarisce questo aspetto; sono, mostratemostrando la versione in C e in Python di funzioni per il calcolo del fattoriale di un numero intero.
 
''Fattoriale in C:''
Line 129 ⟶ 135:
</syntaxhighlight>
 
All'inizio questo modo di indicare i blocchi e esprimere la sintassi può confondere le idee a chi viene da altri linguaggi, ma poi si rivela molto vantaggioso, perché risulta conciso e obbliga a scrivere sorgenti indentati correttamente, aumentando così la leggibilità del codice.
 
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 fareprestare bene attenzione nell'indentare il codice oppure ad affidarsi alle funzioni di indentazione automatica ormai presenti nella maggior parte degli editor di programmi.
 
Poi Python permette anche alcune scorciatoie per scrivere codice "più" sulla stessa riga. Se i due punti (:) danno il via a un blocco indentato di una sola riga: la possiamo spostare a seguito di uno spazio dopo. <syntaxhighlight lang="python">
if b > a: print("b is greater than a")
</syntaxhighlight>
 
AddiritturaSebbene possiamodecisamente ereditarepoco apprezzabile per i puristi del linguaggio Python, è comunque possibile usare il "punto e virgola" (;) dallacome stragrandein grande parte dei linguaggi di programmazione per dichiarareindicare che un 'istruzione è conclusa, quindie cominciarne un'altra sulla stessa riga.<syntaxhighlight lang="python">
a = b + 10; print("Hello world"); b = 243 - 23;
</syntaxhighlight>