Premessa
Ti diamo il benvenuto nel tutorial online di Python di Google. Si basa sul corso introduttivo su Python offerto internamente. Come indicato nella pagina di configurazione, questo materiale riguarda Python 3.
Se cerchi un corso MOOC complementare, prova quelli di Udacity e Coursera (introduzione alla programmazione [principianti] o introduzione a Python). Infine, se cerchi un apprendimento online autonomo senza guardare video, prova quelli elencati verso la fine di questo post. Ogni funzionalità include contenuti di apprendimento e un interprete interattivo di Python con cui fare pratica. Che cos'è questo "interprete" che menzioniamo? Lo scoprirai nella sezione successiva.
Introduzione alla lingua
Python è un linguaggio dinamico, interpretato (compilato in bytecode). Non sono presenti dichiarazioni di tipo di variabili, parametri, funzioni o metodi nel codice sorgente. In questo modo il codice è breve e flessibile e si perde il controllo dei tipi in fase di compilazione del codice sorgente. Python tiene traccia dei tipi di tutti i valori in fase di runtime e segnala il codice che non ha senso durante l'esecuzione.
Un ottimo modo per vedere come funziona il codice Python è eseguire l'interprete Python e digitare il codice direttamente. Se ti poni una domanda come "Che cosa succede se aggiungo un int
a un list
?", digitarla nell'interprete Python è un modo rapido e probabilmente il migliore per vedere cosa succede. (Vedi sotto per scoprire cosa succede davvero.)
$ python3 ## Run the Python interpreter Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX Type "help", "copyright", "credits" or "license" for more information. >>> a = 6 ## set a variable in this interpreter session >>> a ## entering an expression prints its value 6 >>> a + 2 8 >>> a = 'hi' ## 'a' can hold a string just as well >>> a 'hi' >>> len(a) ## call the len() function on a string 2 >>> a + len(a) ## try something that doesn't work Traceback (most recent call last): File "" , line 1, inTypeError: can only concatenate str (not "int") to str >>> a + str(len(a)) ## probably what you really wanted 'hi2' >>> foo ## try something else that doesn't work Traceback (most recent call last): File " " , line 1, inNameError: name 'foo' is not defined >>> ^D ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)
Le due righe che Python stampa dopo aver digitato python e prima del prompt >>> indicano la versione di Python che stai utilizzando e dove è stata creata. Se la prima cosa stampata è "Python 3.", questi esempi dovrebbero funzionare.
Come puoi vedere sopra, è facile sperimentare con variabili e operatori. Inoltre, l'interprete genera, o "solleva" in gergo Python, un errore di runtime se il codice tenta di leggere una variabile a cui non è stato assegnato un valore. Come C++ e Java, Python è sensibile alle maiuscole, quindi "a" e "A" sono variabili diverse. La fine di una riga indica la fine di un'istruzione, quindi, a differenza di C++ e Java, Python non richiede un punto e virgola alla fine di ogni istruzione. I commenti iniziano con '#' e si estendono fino alla fine della riga.
Codice sorgente Python
I file sorgente Python utilizzano l'estensione ".py" e sono chiamati "moduli". Con un modulo Python hello.py
, il modo più semplice per eseguirlo è con il comando della shell "python hello.py Alice", che chiama l'interprete Python per eseguire il codice in hello.py
, passandogli l'argomento della riga di comando "Alice".
Consulta la pagina della documentazione ufficiale per scoprire tutte le diverse opzioni disponibili quando esegui Python dalla riga di comando.
Ecco un programma hello.py
molto semplice (nota che i blocchi di codice sono delimitati rigorosamente utilizzando il rientro anziché le parentesi graffe. Approfondiremo questo argomento in seguito):
#!/usr/bin/python3 # import modules used here -- sys is a very standard one import sys # Gather our code in a main() function def main(): print('Hello there', sys.argv[1]) # Command line args are in sys.argv[1], sys.argv[2] ... # sys.argv[0] is the script name itself and can be ignored # Standard boilerplate to call the main() function to begin # the program. if __name__ == '__main__': main()
L'esecuzione di questo programma dalla riga di comando ha questo aspetto:
$ python3 hello.py Guido Hello there Guido $ ./hello.py Alice ## without needing 'python3' first (Unix) Hello there Alice
Importazioni, argomenti della riga di comando e len()
Le istruzioni più esterne di un file Python, o "modulo", eseguono la configurazione una tantum. Queste istruzioni vengono eseguite dall'alto verso il basso la prima volta che il modulo viene importato da qualche parte, impostando le relative variabili e funzioni. Un modulo Python può essere eseguito direttamente, come sopra python3 hello.py Bob
, oppure può essere importato e utilizzato da un altro modulo. Quando un file Python viene eseguito direttamente, la variabile speciale "__name__" è impostata su "__main__". Pertanto, è comune mostrare il boilerplate if __name__ ==...
riportato sopra per chiamare una funzione main() quando il modulo viene eseguito direttamente, ma non quando viene importato da un altro modulo.
In un programma Python standard, l'elenco sys.argv
contiene gli argomenti della riga di comando nel modo standard, con sys.argv[0] che è il programma stesso, sys.argv[1] il primo argomento e così via. Se conosci argv
o il numero di argomenti, puoi semplicemente richiedere questo valore da Python con len(sys.argv)
, proprio come abbiamo fatto nel codice dell'interprete interattivo sopra quando abbiamo richiesto la lunghezza di una stringa. In generale, len()
può indicare la lunghezza di una stringa, il numero di elementi in elenchi e tuple (un'altra struttura di dati simile a un array) e il numero di coppie chiave-valore in un dizionario.
Funzioni definite dall'utente
Le funzioni in Python sono definite nel seguente modo:
# Defines a "repeat" function that takes 2 arguments. def repeat(s, exclaim): """ Returns the string 's' repeated 3 times. If exclaim is true, add exclamation marks. """ result = s + s + s # can also use "s * 3" which is faster (Why?) if exclaim: result = result + '!!!' return result
Nota anche come le righe che compongono la funzione o l'istruzione if siano raggruppate perché hanno tutte lo stesso livello di rientro. Abbiamo anche presentato due modi diversi per ripetere le stringhe, utilizzando l'operatore + che è più facile da usare, ma funziona anche * perché è l'operatore "repeat" di Python, il che significa che '-' * 10
restituisce '----------'
, un modo semplice per creare una "linea" sullo schermo. Nel commento del codice, abbiamo suggerito che * funziona più velocemente di +, perché * calcola le dimensioni dell'oggetto risultante una sola volta, mentre con +, il calcolo viene eseguito ogni volta che viene chiamato +. Sia + che * sono chiamati operatori "overload" perché hanno significati diversi per i numeri rispetto alle stringhe (e ad altri tipi di dati).
La parola chiave def
definisce la funzione con i relativi parametri tra parentesi e il codice rientrato. La prima riga di una funzione può essere una stringa di documentazione ("docstring") che descrive cosa fa la funzione. La docstring può essere una singola riga o una descrizione su più righe, come nell'esempio precedente. Sì, si tratta di "triple virgolette", una funzionalità esclusiva di Python. Le variabili definite nella funzione sono locali per quella funzione, quindi "result" nella funzione precedente è separata da una variabile "result" in un'altra funzione. L'istruzione return
può accettare un argomento, nel qual caso questo è il valore restituito al chiamante.
Ecco il codice che chiama la funzione repeat() precedente e stampa il valore restituito:
def main(): print(repeat('Yay', False)) ## YayYayYay print(repeat('Woo Hoo', True)) ## Woo HooWoo HooWoo Hoo!!!
In fase di runtime, le funzioni devono essere definite dall'esecuzione di un'istruzione "def" prima di essere chiamate. È normale definire una funzione main() verso la parte inferiore del file con le funzioni che chiama sopra.
Rientro
Una caratteristica insolita di Python è che il rientro degli spazi bianchi di un blocco di codice ne influenza il significato. Un blocco logico di istruzioni, come quelle che compongono una funzione, deve avere la stessa rientranza, impostata rispetto alla rientranza della funzione principale o dell'istruzione "if" o di altro tipo. Se una delle righe di un gruppo ha un rientro diverso, viene segnalata come errore di sintassi.
L'uso degli spazi bianchi in Python sembra un po' strano all'inizio, ma è logico e mi ci sono abituato molto rapidamente. Evita di utilizzare i caratteri di tabulazione, in quanto complicano notevolmente lo schema di rientro (senza contare che i caratteri di tabulazione possono avere significati diversi su piattaforme diverse). Imposta l'editor in modo che inserisca spazi anziché tabulazioni per il codice Python.
Una domanda comune che i principianti si pongono è: "Quanti spazi devo rientrare?" Secondo la guida di stile ufficiale di Python (PEP 8), devi rientrare di 4 spazi. (Curiosità: le linee guida di stile interne di Google prevedono un rientro di due spazi.)
Codice controllato al runtime
Python esegue pochissimi controlli in fase di compilazione, rimandando quasi tutti i controlli di tipo, nome e così via su ogni riga fino all'esecuzione della riga. Supponiamo che la funzione main() precedente chiami repeat() in questo modo:
def main(): if name == 'Guido': print(repeeeet(name) + '!!!') else: print(repeat(name))
L'istruzione if contiene un errore ovvio, in cui la funzione repeat() è stata digitata per errore come repeeeet(). La cosa divertente in Python è che questo codice viene compilato ed eseguito correttamente finché il nome in fase di runtime non è "Guido". Solo quando un'esecuzione tenta di eseguire la funzione repeeeet(), si accorge che non esiste e genera un errore. In questo snippet è presente anche un secondo errore: a name non è stato assegnato un valore prima di essere confrontato con "Guido". Python genererà un errore "NameError" se provi a valutare una variabile non assegnata. Questi sono alcuni esempi che dimostrano che quando esegui per la prima volta un programma Python, alcuni dei primi errori che visualizzi saranno semplici errori di battitura o variabili non inizializzate come queste. Questo è un ambito in cui i linguaggi con un sistema di tipi più dettagliato, come Java, hanno un vantaggio: possono rilevare questi errori in fase di compilazione (ma ovviamente devi mantenere tutte queste informazioni sui tipi, è un compromesso).
Python 3 ha introdotto i suggerimenti sul tipo.
I suggerimenti per il tipo ti consentono di indicare il tipo di ciascun argomento in una funzione, nonché
il tipo dell'oggetto restituito dalla funzione.
Ad esempio, nella funzione annotata def is_positive(n: int) -> bool:
, l'argomento
n
è un int
e il valore restituito è un bool
.
Più avanti vedremo cosa significano questi tipi. I suggerimenti sul tipo sono del tutto facoltativi.
Vedrai sempre più codice adottare suggerimenti sui tipi perché, se li utilizzi,
alcuni editor come cider-v e VS.code possono eseguire controlli per verificare che le tue funzioni vengano chiamate con
i tipi di argomenti corretti. Possono persino suggerire e convalidare gli argomenti mentre modifichi il codice.
Questo tutorial non tratterà i suggerimenti sul tipo, ma vogliamo assicurarci che tu ne sia a conoscenza se ne senti parlare o se li vedi in giro.
Nomi delle variabili
Poiché le variabili Python non hanno alcun tipo specificato nel codice sorgente, è molto utile assegnare nomi significativi alle variabili per ricordare cosa sta succedendo. Utilizza "name" se si tratta di un singolo nome, "names" se si tratta di un elenco di nomi e "tuples" se si tratta di un elenco di tuple. Molti errori di base di Python derivano dal fatto che si dimentica il tipo di valore contenuto in ogni variabile, quindi utilizza i nomi delle variabili (l'unica cosa che hai a disposizione) per fare chiarezza.
Per quanto riguarda la denominazione effettiva, alcune lingue preferiscono underscored_parts per i nomi delle variabili composti da "più di una parola", mentre altre preferiscono camelCasing. In generale, Python preferisce il metodo con il carattere di sottolineatura, ma consiglia agli sviluppatori di utilizzare camelCase se l'integrazione avviene in un codice Python esistente che utilizza già questo stile. Conteggi di leggibilità. Scopri di più nella sezione sulle convenzioni di denominazione in PEP 8.
Come puoi immaginare, parole chiave come "if" e "while" non possono essere utilizzate come nomi di variabili. In caso contrario, riceverai un errore di sintassi. Tuttavia, fai attenzione a non utilizzare le funzioni integrate come nomi di variabili. Ad esempio, anche se "str", "list" e "print" possono sembrare nomi validi, sovrascriveresti queste variabili di sistema. Le funzioni integrate non sono parole chiave e quindi sono soggette a un utilizzo involontario da parte di nuovi sviluppatori Python.
Scopri di più sui moduli e sui relativi spazi dei nomi
Supponiamo di avere un modulo "binky.py" che contiene una "def foo()". Il nome completo della funzione foo è "binky.foo". In questo modo, i vari moduli Python possono assegnare alle loro funzioni e variabili i nomi che preferiscono e i nomi delle variabili non entreranno in conflitto: module1.foo è diverso da module2.foo. Nel vocabolario Python, diremmo che binky, module1 e module2 hanno ciascuno i propri "spazi dei nomi", che, come puoi immaginare, sono associazioni di nomi di variabili a oggetti.
Ad esempio, abbiamo il modulo standard "sys" che contiene alcune funzionalità di sistema standard, come l'elenco argv e la funzione exit(). Con l'istruzione "import sys" puoi accedere alle definizioni nel modulo sys e renderle disponibili con il loro nome completo, ad esempio sys.exit(). Sì, anche "sys" ha uno spazio dei nomi.
import sys # Now can refer to sys.xxx facilities sys.exit(0)
Esiste un altro modulo di importazione simile a questo: "from sys import argv, exit". In questo modo, argv ed exit() sono disponibili con i loro nomi brevi. Tuttavia, consigliamo la forma originale con i nomi completi perché è molto più facile determinare la provenienza di una funzione o di un attributo.
Esistono molti moduli e pacchetti inclusi in un'installazione standard dell'interprete Python, quindi non devi fare nulla di aggiuntivo per utilizzarli. Questi sono noti collettivamente come "libreria standard di Python". I moduli/pacchetti utilizzati più di frequente includono:
- sys: accesso a exit(), argv, stdin, stdout, ...
- re - espressioni regolari
- os: interfaccia del sistema operativo, file system
Puoi trovare la documentazione di tutti i moduli e i pacchetti della libreria standard all'indirizzo http://docs.python.org/library.
Guida online, help()
e dir()
Esistono diversi modi per ricevere assistenza per Python.
- Esegui una ricerca su Google iniziando con la parola "python", ad esempio "python list" o "python string lowercase". Il primo risultato è spesso la risposta. Per qualche motivo, questa tecnica sembra funzionare meglio per Python che per altri linguaggi.
- Il sito ufficiale della documentazione di Python, docs.python.org, contiene documentazione di alta qualità. Tuttavia, spesso trovo più veloce una ricerca su Google di un paio di parole.
- Esiste anche una mailing list ufficiale di Tutor progettata appositamente per chi non ha familiarità con Python e/o la programmazione.
- Molte domande (e risposte) sono disponibili su StackOverflow e Quora.
- Utilizza le funzioni help() e dir() (vedi di seguito).
All'interno dell'interprete Python, la funzione help() estrae le stringhe di documentazione per vari moduli, funzioni e metodi. Queste stringhe di documentazione sono simili a javadoc di Java. La funzione dir() indica gli attributi di un oggetto. Di seguito sono riportati alcuni modi per chiamare help() e dir() dall'interprete:
help(len)
: stringa di aiuto per la funzionelen()
integrata; tieni presente che è "len" e non "len()", che è una chiamata alla funzione, che non vogliamohelp(sys)
: stringa di aiuto per il modulosys
(è necessario eseguire prima un'import sys
)dir(sys)
-dir()
è simile ahelp()
, ma fornisce solo un elenco rapido dei simboli definiti o "attributi".help(sys.exit)
: stringa di aiuto per la funzioneexit()
nel modulosys
help('xyz'.split)
: stringa di assistenza per il metodosplit()
per gli oggetti stringa. Puoi chiamarehelp()
con l'oggetto stesso o con un esempio dell'oggetto, più il relativo attributo. Ad esempio, chiamarehelp('xyz'.split)
equivale a chiamarehelp(str.split)
.help(list)
: stringa di aiuto per gli oggettilist
dir(list)
: mostra gli attributi dell'oggettolist
, inclusi i relativi metodihelp(list.append)
: stringa di aiuto per il metodoappend()
per gli oggettilist