diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 5e1dd8c..6448be4 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -22,5 +22,5 @@ Manutentori del progetto che non seguono o non fanno rispettare il codice di con Questo codice di condotta vale sia online che nella vita reale nel momento in cui un individuo sta rappresentando il progetto o la sua comunità. Questo codice di condatta è stato tradotto e adattato da: -The Contributor Covenant, version 1.3.0, available at [https://www.contributor-covenant.org/version/1/3/0/code-of-conduct.html](https://www.contributor-covenant.org/version/1/3/0/code-of-conduct.html) released under the [CC BY 4.0 License](https://github.com/ContributorCovenant/contributor_covenant/blob/master/LICENSE.md). +The Contributor Covenant, version 1.3.0, available at [https://www.contributor-covenant.org/version/1/3/0/code-of-conduct.html](https://www.contributor-covenant.org/version/1/3/0/code-of-conduct.html) released under the [CC BY 4.0 License](https://github.com/ContributorCovenant/contributor_covenant/blob/release/LICENSE.md). diff --git a/docs/Pyllole/00_Install.md b/docs/Pyllole/00_Install.md index 21ae32e..2b73aa4 100644 --- a/docs/Pyllole/00_Install.md +++ b/docs/Pyllole/00_Install.md @@ -9,7 +9,7 @@ Il modo più semplice per sapere se il tuo sistema ha già installato Python è Per installare Python scarica la versione più recente dal sito ufficiale: [https://www.python.org/downloads/](https://www.python.org/downloads/) -**Ricorda, [a breve](https://pythonclock.org) Python 2.7 non verrà più supportato.** +**Ricorda, Python 2 non è più supportato dal 1° gennaio 2020, maggiori informazioni i [qui](https://www.python.org/doc/sunset-python-2/).** --- diff --git a/docs/Pyllole/01_Use_Python.md b/docs/Pyllole/01_Use_Python.md index 58e42b1..33a51eb 100644 --- a/docs/Pyllole/01_Use_Python.md +++ b/docs/Pyllole/01_Use_Python.md @@ -11,7 +11,8 @@ Una volta installato Python ci sono due fondamentali modi per utilizzarlo: Eseguendo direttamente Python viene attivata la modalità intereattiva dell'interprete (REPL), un'interfaccia per scrivere ed eseguire immediatamente i comandi del linguaggio Python. Il REPL si presenta semplicemente con un _prompt_ `>>>` in attesa di un comando. -A seconda di come, cosa e dove è stato installato Python, potrebbe essere necessario specificare quale versione si vuole eseguire. Ad oggi molte versioni pre-installate eseguono Python 2.7 di default, in questi casi è necessario specificare `python3` per eseguire l'ultima versione. +A seconda di come, cosa e dove è stato installato Python, potrebbe essere necessario specificare quale versione si vuole eseguire. +In alcuni sistemi obsoleti potresti trovar installato Python 2, in questi casi è necessario specificare `python3` per eseguire l'ultima versione. ``` $ python @@ -28,6 +29,7 @@ Python 3.5.3 (default, Jan 19 2017, 14:11:04) Type "help", "copyright", "credits" or "license" for more information. >>> ``` +**Ricorda, Python 2 non è più supportato dal 1° gennaio 2020, maggiori informazioni [qui](https://www.python.org/doc/sunset-python-2/).** All'interno dell'interprete è possibile inviare comandi Python che vengono eseguiti man mano che vengono scritti (riga per riga). @@ -39,7 +41,7 @@ Ciao Se si utilizzano istruzioni che prevedono più linee di codice, come i cicli o la definizione di funzione, l'interprete segnalerà che non ha ancora iniziato a interpretare i comandi forniti cambiando il prompt in `...`. -Naturalmente, in questi casi, si deve fare molta attenzione all'[indentazione](Syntax.md#indentazione). +Naturalmente, in questi casi, si deve fare molta attenzione all'[indentazione](11_Syntax.md#indentazione). ```python >>> for a in range(3): @@ -107,7 +109,7 @@ Un'altro aiuto diretto nell'interprete è dato dalla funzione `dir()`, in grado Creare uno script significa creare un file contenente un programma Python. Questo file/programma potrà poi essere eseguito direttamente o importato da altri programmi. -Per creare un file script **basta un semplice [editor di testo](Pyllole/Development_Environment.md)**, nulla di più. Studiando Python è meglio evitare complessi ambienti di sviluppo (IDE), quando si conoscerà il linguaggio e si svilupperanno veri programmi, si potrà decidere di utilizzarli per ottimizzare il proprio lavoro. +Per creare un file script **basta un semplice [editor di testo](05_Development_Environment.md)**, nulla di più. Studiando Python è meglio evitare complessi ambienti di sviluppo (IDE), quando si conoscerà il linguaggio e si svilupperanno veri programmi, si potrà decidere di utilizzarli per ottimizzare il proprio lavoro. Il file script di python hanno estensione _.py_, crea un tuo file, chiamiamolo _prova.py_ e comincia a programmare. @@ -138,7 +140,7 @@ Eseguendo il file `prova.py` viene generato il file `prova.pyc` che, per spiegar ### Sintassi e stile di scrittura -Consulta la pagina relativa alla [sintassi di base](Syntax.md) per cominciare a conoscere il linguaggio python. +Consulta la pagina relativa alla [sintassi di base](11_Syntax.md) per cominciare a conoscere il linguaggio python. Anche se al momento è prematuro, sappi che in Python anche lo stile di scritture del codice è importante ed è definito nel [PEP 8 - Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/). diff --git a/docs/Pyllole/05_Development_Environment.md b/docs/Pyllole/05_Development_Environment.md index 2a4f572..2009cf4 100644 --- a/docs/Pyllole/05_Development_Environment.md +++ b/docs/Pyllole/05_Development_Environment.md @@ -4,7 +4,7 @@ ## L'editor di testo Il fondamentale, e più usato, strumento di ogni programmatore è l'_editor di testo_, un programma in grado di creare e modificare file, testuali appunto, contenenti il codice sorgente dei programmi. -Un file testuale è un file che contiente solo ed esclusivamente byte che verranno interpretati come caratteri di testo. +Un file testuale è un file che contiente solo ed esclusivamente byte che verranno interpretati come caratteri di testo. Un editori di testo non è un [IDE](#IDE), inizia a programmare con un semplice editor di testo e passa ad un [IDE](#IDE) solo quando avrai più esperienza. @@ -15,10 +15,10 @@ Un editori di testo non è un [IDE](#IDE), inizia a programmare con un semplice Naturalmente qualunque editor di testo in grado semplicemente di creare, aprire e modificare un file di testo ti permetterà di scrivere il tuo codice. Ci sono poi altre caratteristiche che ti renderanno la vita più semplice nelle ore che passerai a scrivere. -* Funzioni di ricerca e sostituzione +* Funzioni di ricerca e sostituzione * Funzioni per tagliare, copiare e incollare vRappresentazione a colori ([syntax highlighting](https://it.wikipedia.org/wiki/Syntax_highlighting)) del codice -* Possibilità di aggiungere funzionalità dell'editor tramite _plugin_ +* Possibilità di aggiungere funzionalità dell'editor tramite _plugin_ * Personalizzazione (dimensione del carattere, combinazioni di colori, ecc) **Nota**: oggi è quasi obbligatorio che un editor di testo supporti la [codifica UTF-8](https://it.wikipedia.org/wiki/UTF-8). @@ -26,14 +26,14 @@ vRappresentazione a colori ([syntax highlighting](https://it.wikipedia.org/wiki/ ### Linea di comando -Se si programma per lavoro prima o poi Linux si dovrà utilizzare, per questo è fondamentale conoscere i suoi editor testuali da linea di comando: `vim` e `nano`. +Lavorando su Linux può essere utile conoscere editor da terminale come `vim` e `nano`. Entrambi, funzionando in modalità testuale (non grafica) e possono sembrare un po' ostici. Tutti i comandi (esci, salva, cerca, ...) vengono attivati tramite combinazioni di tasti, il mouse, se siete fortunati, può essere utilizzato per selezionare un testo e copiarlo. Tra i due `nano` è probabilmente il più semplice, si scrive direttamente sul "foglio" e in una barra vengono indicati i comandi principali, con `^` che indica il tasto `ctrl` (`ctrl+x` esce, `ctrl+o` salva, `ctrl+w` cerca). -### I più diffusi editor di testo (ambiente grafico) +### I più diffusi editor di testo (ambiente grafico) * [Sublime Text](https://www.sublimetext.com/) * [Atom](https://atom.io) diff --git a/docs/Pyllole/11_Syntax.md b/docs/Pyllole/11_Syntax.md index 05177fa..56640d7 100644 --- a/docs/Pyllole/11_Syntax.md +++ b/docs/Pyllole/11_Syntax.md @@ -6,7 +6,7 @@ * `Complesso è meglio di complicato` * `La leggibilità è importante` -Questi cinque principi, presi da [Lo Zen di Python](Zen.md), fanno capire quanto in Python la forma sia importante tanto quanto la sintassi. +Questi cinque principi, presi da [Lo Zen di Python](99_Zen.html), fanno capire quanto in Python la forma sia importante tanto quanto la sintassi. In Python ogni comando si scrive su una singola riga e non necessita di particolari caratteri di termine (altri linguaggi necessitano, per esempio, di `;`). Se si vogliono scrivere più comandi sulla stessa riga è possibile dividerli utilizzando il `;`, ma non farlo. @@ -111,7 +111,7 @@ mia_var="pippo" ```python #! /usr/bin/python3 -def mia_funzione(*args) +def mia_funzione(*args): """ Questa funzione restituisce ... Gli argomenti ... """ diff --git a/docs/Pyllole/21_Variables.md b/docs/Pyllole/21_Variables.md index db214bf..ade535c 100644 --- a/docs/Pyllole/21_Variables.md +++ b/docs/Pyllole/21_Variables.md @@ -16,12 +16,12 @@ Così nascono gli standard, dall'ASCII a UTF-8, dalle GIF alle PNG, tutti i modi Ogni linguaggio di programmazione ha i suoi tipi di dati con le proprie particolari caratteristiche, ma in generale i tipi di base sono: -* [Booleani](Type_Boolean.md): 0 o 1, chiamati anche False o True -* [Numeri interi](Type_Number.md): in grado di rappresentare, a seconda del numero di byte utilizzati, i numeri interi da -N a +N -* [Numeri decimali](Type_Number.md): numero in virgola mobile, indica il metodo di rappresentazione approssimata dei numeri reali -* [Stringhe](Type_String.md): sequenze di caratteri (lettere, numeri e simboli) che formano un testo +* [Booleani](43_Type_Boolean.md): 0 o 1, chiamati anche False o True +* [Numeri interi](41_Type_Number.md): in grado di rappresentare, a seconda del numero di byte utilizzati, i numeri interi da -N a +N +* [Numeri decimali](41_Type_Number.md): numero in virgola mobile, indica il metodo di rappresentazione approssimata dei numeri reali +* [Stringhe](42_Type_String.md): sequenze di caratteri (lettere, numeri e simboli) che formano un testo -Esistoni inoltre molti tipi di dati complessi, dagli array agli oggetti, ma per il momento è meglio fermarsi a questi. +Esistono inoltre molti tipi di dati complessi, dagli array agli oggetti, ma per il momento è meglio fermarsi a questi. ## Le variabili @@ -34,30 +34,29 @@ Più o meno in tutti i linguaggi di programmazione, per assegnare un valore ad u nome="Pippo" ``` -In realtà **una variabile non è _il contenitore_ ma solo un soprannome che si dà ad una zona di memoria**. +In realtà **una variabile non è _il contenitore_ ma solo un soprannome che si dà ad una zona di memoria**. -In Python, per gran parte dei tipi, assegnare un nuovo valore ad una variabile non vuol dire modificare il valore di una zona di memoria, ma far "puntare" il nostro "soprannome" ad una nuova zona di memoria con un nuovo contenuto. +In Python, per gran parte dei tipi, assegnare un nuovo valore ad una variabile non vuol dire modificare il valore di una zona di memoria, ma far "puntare" il nostro "soprannome" ad una nuova zona di memoria con un nuovo contenuto. Questa operazione è del tutto trasparente per il programmatore, ma è una cosa molto importante da sapere quando si realizzano programmi in cui le performance contano. -_Per uteriori informazioni su questo argomento cercare in rete "[Python immutable types](https://www.google.it/search?q=python+immutable+types)"_ +_Per ulteriori informazioni su questo argomento cercare in rete "[Python immutable types](https://www.google.it/search?q=python+immutable+types)"_ ### Nomi e convenzioni delle variabili -In Python i nomi delle variabili possono essere di qualsiasi lunghezza e possono usare lettere maiuscole o minuscole, il carattere di sottolineatura `_` e le cifre da 0 a 9. -I nomi delle variabili non possono iniziare con una cifra e non possono essere uguali alla parole riservate del linguaggio Python, come ad esempio `if`, `else`, `and`. -I nomi delle variabili sono case sensitive, cioé i caratteri maiuscoli e quelli minuscoli sono considerati come se fossere due lettere differenti. Quindi `nome` e `Nome` sono considerate due variabili differenti. +In Python i nomi delle variabili possono essere di qualsiasi lunghezza e possono usare lettere maiuscole o minuscole, il carattere di sottolineatura `_` e le cifre da 0 a 9. +I nomi delle variabili non possono iniziare con una cifra e non possono essere uguali alle parole riservate del linguaggio Python, come ad esempio `if`, `else`, `and`. +I nomi delle variabili sono case sensitive, cioè i caratteri maiuscoli e quelli minuscoli sono considerati come se fossero due lettere differenti. Quindi `nome` e `Nome` sono considerate due variabili differenti. -Infine, come convenzione per migliorare la leggibilità del codice, si suggerisce di dare alle variabili un **nome minuscolo con le eventuali parole separate dal carattere di sottolineatura `_`**. +Infine, come convenzione per migliorare la leggibilità del codice, si suggerisce di dare alle variabili un **nome minuscolo con le eventuali parole separate dal carattere di sottolineatura `_`**. ### Tipizzazione -Il programma, quando viene eseguito, deve sapere quanto spazio di memoria dovrà "assegnare" ad una variabile. Lo spazio utilizzato da un numero intero è differente da quello utilizzato da una stringa. -Per questo molti linguaggi di programmazione necessitano che una variabile sia inizializzata, prima di essere utilizzata, assegnandogli un determinato tipo. Questi linguaggi si definiscono _tipizzati_. +Il tipo di un dato determina quali operazioni si possono eseguire su di esso. Per esempio, sommare due numeri è diverso dal concatenare due stringhe. -**Python è un linguaggio tipizzato dinamicamente**, non c'é bisogno di inizializzare una variabile prima di utilizzarla, è possibile cambiare tipo alla variabile in qualunque momento semplicemente assegnandogli un differente valore. +**Python è un linguaggio tipizzato dinamicamente**: non serve dichiarare in anticipo il tipo di una variabile. Il tipo appartiene all’oggetto a cui il nome si riferisce, e lo stesso nome può essere associato successivamente a oggetti di tipo diverso. Prima di leggere una variabile, però, è necessario averle assegnato un valore. -Di seguito assegnamo valori differenti alla variabile nome ed utiliziamo la funzione `type()` per vedere che cambia tipo senza alcun problema. +Di seguito associamo al nome `nome` prima una stringa e poi un intero. Utilizziamo la funzione `type()` per conoscere il tipo dell’oggetto a cui si riferisce. ```python >>> nome="Pippo" @@ -77,19 +76,19 @@ Di seguito assegnamo valori differenti alla variabile nome ed utiliziamo la funz ... Traceback (most recent call last): File "", line 1, in -NameError: name 'a' is not defined +NameError: name 'my_var' is not defined ``` -**Importante**: qui sopra abbiamo anticipato un esempio di controllo `if` in cui c'é `my_var==2`. -Il doppio carattere uguale `==` è sempre un operatore di uguaglianza, non una assegnazione (vedere [operatori booleani]()). +**Importante**: qui sopra abbiamo anticipato un esempio di controllo `if` in cui c’è `my_var==2`. +Il doppio carattere uguale `==` è sempre un operatore di uguaglianza, non una assegnazione (vedere [operatori di confronto](43_Type_Boolean.md)). ### Casting Il _casting_ in programmazione è la conversione di un dato da un tipo ad un altro. -Potremmo avere una variabile a cui è assegnato il valore `"123", anche se sembra un numero, come già suggeriscono le virgolette, in realtà si tratta di una stringa (magari acquisita tramite [input](Input.md)). +Potremmo avere una variabile a cui è assegnato il valore `"123"`, anche se sembra un numero, le virgolette indicano che è una stringa, magari acquisita tramite [input](25_Input.md). -Se volessi trattare questo `"123"` come se fosse un numero, e sommargline ad esempio un altro, dovrei prima trasformalo in un intero. +Se volessi trattare questo `"123"` come se fosse un numero, e sommargline ad esempio un altro, dovrei prima trasformarlo in un intero. Per convertire in intero una stringa, o un float, si utilizza la funzione `int()`. ``` @@ -103,5 +102,5 @@ C'è una funzione di casting per ogni tipo di dato, molto usate sono, ad esempio ## Tutto è un oggetto Senza voler anticipare concetti troppo avanzati, sappi solo che in Python ogni tipo è un oggetto. -Se in altri linguaggi una stringa è solo uno spazio contenente i byte relativi ai caratteri che la compongono, in Python è un oggetto più complesso con relativi medoti e proprietà. +Se in altri linguaggi una stringa è solo uno spazio contenente i byte relativi ai caratteri che la compongono, in Python è un oggetto più complesso con relativi metodi e proprietà. diff --git a/docs/Pyllole/23_Print.md b/docs/Pyllole/23_Print.md index c875e56..985224a 100644 --- a/docs/Pyllole/23_Print.md +++ b/docs/Pyllole/23_Print.md @@ -1,6 +1,6 @@ # Print -La funzione `print()` permette di scrivere sulla vostra console delle stringhe (in Python 2.7 non era una funzione ma un'istruzione built-in del linguaggio che non richiedeva le parentesi). +La funzione `print()` permette di scrivere sulla vostra console delle stringhe (sequenze di caratteri). ```python >>> print("Ciao, questa è una stringa.") diff --git a/docs/Pyllole/25_Input.md b/docs/Pyllole/25_Input.md index 3c84f45..1f84d50 100644 --- a/docs/Pyllole/25_Input.md +++ b/docs/Pyllole/25_Input.md @@ -22,17 +22,17 @@ Inserisci la tua età: 42 ### Valore restituito -La funzione `input()` restituisce sempre una stringa, se si vuole utilizzare il risultato come dato numerico è necessario convertirlo utilizzando le funzioni [int() o float()](Type_Number.md). +La funzione `input()` restituisce sempre una stringa, se si vuole utilizzare il risultato come dato numerico è necessario convertirlo utilizzando le funzioni [int() o float()](41_Type_Number.md). ```python >>> stringa = input("Inserisci un numero intero: ") Inserisci un numero intero: 42 >>> numero=int(stringa) ``` -**Importante**: se la stringa passata a `int()` non è convertibile in un intero, Python genererà un'errore, è quindi consigliabile gestire l'eccezione con [try/except](Try_Except.md) +**Importante**: se la stringa passata a `int()` non è convertibile in un intero, Python genererà un'errore, è quindi consigliabile gestire l'eccezione con [try/except](61_Try_Except.md) **Nota**: nelle versioni 2.x l'attuale funzione input() si chiamava raw_input(). La funzione input() di Python2 esiste ma ha un comportamento differente da quello qui descritto. -Vedi l'esempio pratico nella pagina [try/except](Try_Except.md) per come gestire l'errata conversione. +Vedi l'esempio pratico nella pagina [try/except](61_Try_Except.md) per come gestire l'errata conversione. -Vedi l'esempio pratico nella pagina [cicli](Loops.md) per come ripetere input() finché il valore è corretto. +Vedi l'esempio pratico nella pagina [cicli](29_Loops.md) per come ripetere input() finché il valore è corretto. diff --git a/docs/Pyllole/27_If-Else.md b/docs/Pyllole/27_If-Else.md index f9d6255..79c8d13 100644 --- a/docs/Pyllole/27_If-Else.md +++ b/docs/Pyllole/27_If-Else.md @@ -4,7 +4,7 @@ In un programma le istruzioni vengono eseguite nell'ordine in cui sono scritte n Per poter eseguire una parte di questo codice solo in alcuni casi si utilizza l'istruzione di controllo `if`/`else`. -_Ricorda, in python [l'indentazione](Syntax.md#indentazione) è molto importante!_ +_Ricorda, in python [l'indentazione](11_Syntax.md#indentazione) è molto importante!_ La sintassi di base di `if` è: diff --git a/docs/Pyllole/29_Loops.md b/docs/Pyllole/29_Loops.md index 7bd0a5a..3cafad7 100644 --- a/docs/Pyllole/29_Loops.md +++ b/docs/Pyllole/29_Loops.md @@ -1,36 +1,36 @@ # Cicli -_Prima di studiare i cicli e gli iteratori assicurati di conoscere le [liste](Type_List.md)._ +_Prima di studiare i cicli e gli iteratori assicurati di conoscere le [liste](53_Type_List.md)._ Per ripetere una determinata azione più volte e/o su più elementi si utilizzano le istruzioni `for` e `while` per costruire dei _"cicli"_. Il programma ripeterà il codice all'interno del ciclo per un numero di volte determinato da una determinata condizione. -_Ricorda, in python [l'indentazione](Syntax.md#indentazione) è molto importante!_ +_Ricorda, in python [l'indentazione](11_Syntax.md#indentazione) è molto importante!_ ## For -I cicli `for` iterano sulle liste, cioé ripetono un codice per ogni elemento all'interno di una lista. +I cicli `for` scorrono gli elementi di un oggetto iterabile, per esempio una lista, ripetendo il codice per ogni elemento. Il seguente codice: ```python -for animale in ["cane", "gatto", "topo"]: +for animale in ["cane", "gatto", "topo"]: print ("{0} è un mammifero".format(animale)) ``` Genera il seguente risultato: ```python -cane è un mammifero +cane è un mammifero gatto è un mammifero topo è un mammifero ``` -I cicli for posso iterare anche dal risultato di una funzione `range()`. +I cicli `for` possono scorrere anche i numeri rappresentati da un oggetto `range`. -Infatti `range(numero)` restituisce una lista di numeri da zero al numero dato +`range(stop)` restituisce un oggetto `range` che rappresenta una sequenza di numeri interi a partire da `0`, fino a `stop` escluso, con passo `1`. Per esempio, `range(4)` rappresenta i numeri `0`, `1`, `2`, `3`. Il codice: @@ -41,19 +41,19 @@ for i in range(4): Scriverà: ```python -0 +0 1 2 3 ``` -La funzione `range()` ha anche altri paramentri opzionali. +La funzione `range()` permette di specificare anche il valore iniziale e il passo. -`range(lower, upper)` restituisce una lista di numeri dal più piccolo `lower` al più grande `upper`. +`range(start, stop)` rappresenta una sequenza di interi a partire da `start`, fino a `stop` escluso, con passo `1`. -`range(lower, upper, step)` restituisce una lista di numeri dal più piccolo `lower` al più grande `upper` incrementando del valore `step`. +`range(start, stop, step)` permette di specificare il passo, che può essere positivo o negativo, ma non zero. Il valore finale `stop` è sempre escluso. -Il codice: +Il codice: ```python for i in range(10,30,5): @@ -63,7 +63,7 @@ for i in range(10,30,5): Scriverà: ```python -10 +10 15 20 25 @@ -71,13 +71,13 @@ Scriverà: ## While -I cicli `while` vengono eseguiti finchè la condizione indicata viene a mancare. +I cicli `while` ripetono il codice finché la condizione indicata è vera. ```python -x = 0 +x = 0 while x < 4: print(x) - x += 1 + x += 1 ``` **Nota**: La sintassi `x += 1` è la versione compatta di `x = x+1` @@ -85,18 +85,19 @@ while x < 4: ### Esempio pratico **Ciclo while per riproporre la richiesta di dati in caso di errore di immissione** -La funzione `input()` acqusisce un valore inserito da tastiera in formato stringa. A volte è necessario che il dato acquisito sia un numero, in questi casi si utilizzano le funzioni `int()` o `float()` per convertirlo. +La funzione `input()` acquisisce un valore inserito da tastiera in formato stringa. A volte è necessario che il dato acquisito sia un numero, in questi casi si utilizzano le funzioni `int()` o `float()` per convertirlo. Si può quindi utilizzare `try`/`except` per controllare che sia stato inserito un dato valido, ma per riproporre la domanda in caso di errore è necessario creare un ciclo. -Nel seguente esempio ripetiamo la richiesta finché a `numero` non viene assegnato un valore. +Nel seguente esempio ripetiamo la richiesta finché `numero` è `None`, cioè finché non è stato acquisito un intero valido. Se la conversione fallisce, viene gestita l’eccezione `ValueError` e `numero` rimane `None`. Anche `0` è un valore intero valido e permette di terminare il ciclo. ```python -numero=None -while not numero: +numero = None + +while numero is None: try: - numero=int(input("Inserisci un numero intero: ")) - except: + numero = int(input("Inserisci un numero intero: ")) + except ValueError: print("Il dato inserito non è un numero intero") ``` diff --git a/docs/Pyllole/42_Type_String.md b/docs/Pyllole/42_Type_String.md index 78e323f..6b59f07 100644 --- a/docs/Pyllole/42_Type_String.md +++ b/docs/Pyllole/42_Type_String.md @@ -100,7 +100,7 @@ Con le _f-string_ è possibile anche eseguire delle espressioni all'interno del >>> seven = 7 >>> f'''Il suo nome è {name.upper()} ...ed ha {6 * seven} anni.''' -'Il suo nome è John ed ha 42 anni.' +'Il suo nome è JOHN ed ha 42 anni.' ``` diff --git a/docs/Pyllole/53_Type_List.md b/docs/Pyllole/53_Type_List.md index 29b4f16..f72fefe 100644 --- a/docs/Pyllole/53_Type_List.md +++ b/docs/Pyllole/53_Type_List.md @@ -26,7 +26,7 @@ Si può aggiungere un valore alla fine della lista con append ```python >>> li.append(10) >>> li -[7] +[10] >>> li.append(20) >>> li.append(30) >>> li.append(40) diff --git a/docs/Pyllole/55_Type_Tuple.md b/docs/Pyllole/55_Type_Tuple.md index 02f791b..d2cfc9a 100644 --- a/docs/Pyllole/55_Type_Tuple.md +++ b/docs/Pyllole/55_Type_Tuple.md @@ -1,8 +1,8 @@ # Tipi: Tuple -_Prima di studiare le tuple assicurati di conoscere le [liste](Type_List.md)._ +_Prima di studiare le tuple assicurati di conoscere le [liste](53_Type_List.md)._ -Le tuple sono come le [liste](Type_List.md) ma immutabili. +Le tuple sono come le [liste](53_Type_List.md) ma immutabili. ```python >>> tup = (1, 2, 3) diff --git a/docs/Pyllole/57_Type_Set.md b/docs/Pyllole/57_Type_Set.md index ddd4469..fcc8b75 100644 --- a/docs/Pyllole/57_Type_Set.md +++ b/docs/Pyllole/57_Type_Set.md @@ -1,6 +1,6 @@ # Tipi: Set -_Prima di studiare i set assicurati di conoscere le [liste](Type_List.md)._ +_Prima di studiare i set assicurati di conoscere le [liste](53_Type_List.md)._ I set sono come le liste ma non possono contenere doppioni. diff --git a/docs/Pyllole/59_Type_Dictionary.md b/docs/Pyllole/59_Type_Dictionary.md index 5fe93aa..07e3814 100644 --- a/docs/Pyllole/59_Type_Dictionary.md +++ b/docs/Pyllole/59_Type_Dictionary.md @@ -1,10 +1,10 @@ # Tipi: Dizionari -_Prima di studiare i dizionari assicurati di conoscere le [liste](Type_List.md)._ +_Prima di studiare i dizionari assicurati di conoscere le [liste](53_Type_List.md)._ -Un dizionario è come una lista che ha un nome al posto dell'indice, è un insieme di coppie chiave-valore. +Un dizionario è come una lista che ha un nome al posto dell'indice, è un insieme di coppie chiave-valore. -**Importante**: le coppie chiave-valore in un dizionario non sono ordinate o ordinabili. +**Importante**: da Python 3.7 i dizionari conservano l’ordine di inserimento delle coppie chiave-valore. Le chiavi non vengono ordinate automaticamente per nome o valore. Se in una lista è possibile accedere ad un dato in questo modo: @@ -51,31 +51,31 @@ Si accede ai valori indicando la chiave tra `[]` ```python >>> filled_dict["uno"] -1 +1 ``` Puoi ottenere tutte le chiavi di un dizionario con `keys()` (come oggetto iterabile). Per averle in formato lista è necessario utilizzare `list()`. -**Importante**: Nei dizionari l'ordine delle chiavi non è garantito. Il tuo risultato potrebbe non essere uguale a questo. +**Importante**: da Python 3.7 l’ordine delle chiavi corrisponde all’ordine di inserimento. Nelle versioni precedenti del linguaggio questa garanzia non era prevista. ```python ->> list(filled_dict.keys()) -['uno', 'tre', 'due'] +>>> list(filled_dict.keys()) +['uno', 'due', 'tre'] ``` -Puoi ottenere tutti i valori di un dizionario con `values()` (come oggetto iterabile). -Anche in questo caso, per averle in formato lista, è necessario utilizzare `list()`. Anche in questo caso, come per le chiavi, l'ordine non è garantito +Puoi ottenere tutti i valori di un dizionario con `values()` (come oggetto iterabile). +Per avere i valori in formato lista è necessario utilizzare `list()`. I valori seguono lo stesso ordine delle chiavi. ```python -list(filled_dict.values()) -[1, 3, 2] +>>> list(filled_dict.values()) +[1, 2, 3] ``` Controlla l'esistenza delle chiavi in un dizionario con `in` ```python >>> "uno" in filled_dict -True +True >>> 1 in filled_dict False ``` @@ -122,7 +122,7 @@ Aggiungere una coppia chiave->valore a un dizionario ```python >>> filled_dict.update({"quattro":4}) >>> filled_dict -{'uno': 1, 'tre': 3, 'quattro': 4, 'cinque': 5, 'due': 2} +{'uno': 1, 'due': 2, 'tre': 3, 'cinque': 5, 'quattro': 4} ``` Un altro modo: @@ -130,7 +130,7 @@ Un altro modo: ```python >>> filled_dict["sette"] = 7 >>> filled_dict -{'sette': 7, 'tre': 3, 'cinque': 5, 'due': 2, 'uno': 1, 'quattro': 4} +{'uno': 1, 'due': 2, 'tre': 3, 'cinque': 5, 'quattro': 4, 'sette': 7} ``` Rimuovi una chiave da un dizionario con `del` @@ -138,7 +138,7 @@ Rimuovi una chiave da un dizionario con `del` ```python >>> del filled_dict["uno"] >>> filled_dict -{'sette': 7, 'tre': 3, 'cinque': 5, 'due': 2, 'quattro': 4} +{'due': 2, 'tre': 3, 'cinque': 5, 'quattro': 4, 'sette': 7} ``` Da Python 3.5 puoi anche usare ulteriori opzioni di spacchettamento diff --git a/docs/Pyllole/61_Try_Except.md b/docs/Pyllole/61_Try_Except.md index 1f67267..4ae61aa 100644 --- a/docs/Pyllole/61_Try_Except.md +++ b/docs/Pyllole/61_Try_Except.md @@ -1,6 +1,6 @@ # Try - Except -_Ricorda, in python [l'indentazione](Syntax.md#indentazione) è molto importante!_ +_Ricorda, in python [l'indentazione](11_Syntax.md#indentazione) è molto importante!_ Le eccezioni (exception) sono errori rilevati durante l'esecuzione di un programma. @@ -67,7 +67,7 @@ finally: ### Esempio pratico **Conversione e controllo risultato di input()** -Se si vuole utilizzare il risultato della funzione `input()`, che è sempre una stringa, come dato numerico è necessario convertirlo utilizzando le funzioni [int() o float()](Type_Number.md). Il valore immesso potrebbe però non essere convertibile in un numero, in questo caso la funzione di conversione usata genererà un'errore che è meglio gestire. +Se si vuole utilizzare il risultato della funzione `input()`, che è sempre una stringa, come dato numerico è necessario convertirlo utilizzando le funzioni [int() o float()](41_Type_Number.md). Il valore immesso potrebbe però non essere convertibile in un numero, in questo caso la funzione di conversione usata genererà un'errore che è meglio gestire. ```python stringa = input("Inserisci un numero intero: ") @@ -77,4 +77,4 @@ except: print("Il dato inserito non è un numero intero") ``` -Vedi l'esempio pratico nella pagina [cicli](Loops.md) per come ripetere il controllo finché il valore è corretto. +Vedi l'esempio pratico nella pagina [cicli](29_Loops.md) per come ripetere il controllo finché il valore è corretto. diff --git a/docs/Pyllole/63_Functions.md b/docs/Pyllole/63_Functions.md index 5791628..be925b3 100644 --- a/docs/Pyllole/63_Functions.md +++ b/docs/Pyllole/63_Functions.md @@ -5,7 +5,7 @@ Puoi considerare una funzione come un piccolo programma contenuto nel tuo codice Ad una funzione è possibile passare degli "argomenti" variabili ad ogni chiamata. Infine, una funzione, può restituire un valore con `return`. -Se si sta utilizzando python dal suo prompt questo valore verrà scritto sulla console. +Se si sta utilizzando python dal suo prompt questo valore verrà scritto sulla console. Se si sta eseguendo un programma il risultato di una funzione può essere assegnato ad una variabile o utilizzato come argomento per altre funzioni. In Python si utilizza `def` per creare le funzioni. @@ -13,15 +13,15 @@ In Python si utilizza `def` per creare le funzioni. Il seguente esempio crea una funzione con due argomenti chiamati `x` e `y`. Scrive sulla console il loro valore e restituisce la loro somma. ```python -def aggiungi(x, y): +def aggiungi(x, y): print("x è {} e y è {}".format(x, y)) - return x + y + return x + y ``` Eseguendo la funzione appena creata si avrà il seguente risultato: ```python ->>> risultato_1 = aggiungi(2, 3) +>>> risultato_1 = aggiungi(2, 3) x è 2 e y è 3 >>> risultato_2 = aggiungi(100, 50) x è 100 e y è 50 @@ -31,13 +31,13 @@ x è 100 e y è 50 150 ``` -## Argomenti +## Argomenti Se eseguo `aggiungi(5,6)`, `x` avrà valore 5 e `y` sarà 6, poiché questo è l'ordine definito alla creazione della funzione. È possibile però cambiare l'ordine degli argomenti specificando direttamente chiave e valore durante la chiamata ad una funzione. ```python ->>> aggiungi(y=6, x=5) +>>> aggiungi(y=6, x=5) x è 5 e y è 6 11 ``` @@ -45,41 +45,41 @@ x è 5 e y è 6 Puoi definire funzioni che accettino un numero non definito di argomenti definindo la funzione con un argomento preceduto da un asterisco: ```python -def varargs(*args): +def varargs(*args): return args ``` All'interno della funzione la variabile `args` sarà di un tipo particolare chiamato tupla. -Questa variabile conterrà tutti i parametri passati alla funzione (leggi la pagine relativa alle [liste](Type_List.md) e alle [tuple](Type_Tuple.md)). +Questa variabile conterrà tutti i parametri passati alla funzione (leggi la pagine relativa alle [liste](53_Type_List.md) e alle [tuple](55_Type_Tuple.md)). ```python ->>> varargs(1, 2, 3) +>>> varargs(1, 2, 3) (1, 2, 3) ``` Puoi definire funzioni che accettino un numero variabile di coppie chiave/valere come argomento devi definire la funzione con un argomento preceduto da due asterischi: ```python -def keyword_args(**kwargs): +def keyword_args(**kwargs): return kwargs ``` All'interno della funzione la variabile `kwargs` sarà di un tipo particolare dizionario. -Questa variabili conterrà tutti i paramentri inviati come coppie chiave/valore (leggi la pagine relativa ai [dizionari](Type_Dictionary.md)). +Questa variabili conterrà tutti i paramentri inviati come coppie chiave/valore (leggi la pagine relativa ai [dizionari](59_Type_Dictionary.md)). ```python ->>> keyword_args(alpha=40, beta=50) +>>> keyword_args(alpha=40, beta=50) {'beta': 50, 'alpha': 40} ``` -Puoi utilizzare entrambi i metodi in una volta: +Puoi utilizzare entrambi i metodi in una volta: ```python def all_the_args(*args, **kwargs): print(args) print(kwargs) ->>> all_the_args(10, 20, alpha=40, beta=50 ) +>>> all_the_args(10, 20, alpha=40, beta=50 ) (10, 20) {'beta': 50, 'alpha': 40} ``` @@ -88,7 +88,7 @@ Quando chiami una funzione, puoi fare l'opposto di `args`/`kwargs`. Usa \* per sviluppare gli argomenti posizionale ed usa \*\* per espandere gli argomenti parola chiave. ```python ->>> args = (1, 2, 3, 4) +>>> args = (1, 2, 3, 4) >>> kwargs = {"a": 3, "b": 4} >>> all_the_args(*args) >>> all_the_args(**kwargs) @@ -97,34 +97,35 @@ Usa \* per sviluppare gli argomenti posizionale ed usa \*\* per espandere gli ar ## Return di valori multipli -Una funzione può restituire valori multipli, tutte le variabili indicate dopo il return verranno restituite in un singolo oggetto tupla (le parentesi sono opzionali). +Una funzione può restituire valori multipli, tutte le variabili indicate dopo il return verranno restituite in un singolo oggetto tupla (le parentesi sono opzionali). ```python -def swap(x, y): +def swap(x, y): return y, x ->>> swap(1, 2) +>>> swap(1, 2) (2, 1) ``` -## Visibilità delle variabili +## Visibilità delle variabili -La visibilità di una variabile, o "variable scope", è la parte di un programma in cui una variabile può essere utilizzata. -Una variabile definita all'interno di una funzione, detta variabile locale, può essere utilizzata solo all'interno di quella funzione. -Una variabile definita all'esterno della funzione, variabile globale, potrà essere utilizzata all'interno di una funzione solo se richiamata tramite `global`. +La visibilità di una variabile, o "variable scope", è la parte di un programma in cui una variabile può essere utilizzata. + +Una variabile definita all’interno di una funzione è detta locale e può essere utilizzata solo all'interno della funzione stessa. +Una variabile definita al livello principale di un modulo è detta globale. Una funzione può leggere una variabile globale senza usare `global`, purché quel nome non venga definito come locale nella funzione. Per assegnare un nuovo valore alla variabile globale dall’interno della funzione, invece, è necessario dichiararla con `global`. ```python -x = 5 +x = 5 -def set_x(num): - # La variabile locale x non è la variabile globale x +def set_x(num): + # La variabile locale x non è la variabile globale x x = num # => 43 print(x) # => 43 -def set_global_x(num): +def set_global_x(num): global x print(x) # => 5 - x = num # la variabile globable x è ora 6 + x = num # la variabile globale x è ora 6 print(x) # => 6 >>> print(x) @@ -148,29 +149,29 @@ Per creare una funzione anonima si utilizza il costrutto `lambda`. Un esempio di funzione (elevamento alla seconda) definita con un nome: ```python -def pow(x): +def pow(x): return x**2 ->>> pow(8) +>>> pow(8) 64 ``` Equivalente funzione ma anonima con `lambda`: ```python ->>> pow = lambda x: x**2 +>>> pow = lambda x: x**2 >>> pow(8) 64 ``` -La definizione lambda non include un `return`, è l'espressione stessa definita in lambda che viene restituita. +La definizione lambda non include un `return`, è l'espressione stessa definita in lambda che viene restituita. È possibile inserire una definizione `lambda` ovunque sia prevista una funzione e non è necessario assegnarla a una variabile. Di seguito un esempio di `lambda` utilizzato per creare funzioni durante, l'esecuzione del programma, ognuna con caretteristiche differenti. ```python ->>> def crea_incrementatore (n): +>>> def crea_incrementatore (n): ... return lambda x: x + n ... >>> incr10 = crea_incrementatore(2) @@ -187,7 +188,7 @@ Spesso le funzioni anonime trovano il loro miglior utilizzo con `map`, `filter` Esempio utilizzando una lista e il precendete esempio di funzione anonima (elevamente alla seconda) ```python ->>> lista = [1,2,3,4] +>>> lista = [1,2,3,4] >>> list(map(lambda x: x**2, lista)) [1, 4, 9, 16] ``` @@ -195,7 +196,7 @@ Esempio utilizzando una lista e il precendete esempio di funzione anonima (eleva Un esempio di un filtro che lascia passare solo valori maggiori di 5: ```python ->>> list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) +>>> list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) [6, 7] ``` diff --git a/docs/Pyllole/71_Iterable.md b/docs/Pyllole/71_Iterable.md index a10cc92..4b1a369 100644 --- a/docs/Pyllole/71_Iterable.md +++ b/docs/Pyllole/71_Iterable.md @@ -1,7 +1,7 @@ # Iterabili e Iteratori -_Prima di approfondire gli oggetti iterabili assicurati di conoscere le [liste](Type_List.md), [set](Type_Set.md) e [dizionari](Type_Dictionary.md)._ +_Prima di approfondire gli oggetti iterabili assicurati di conoscere le [liste](53_Type_List.md), [set](57_Type_Set.md) e [dizionari](59_Type_Dictionary.md)._ **In Python qualunque oggetto in grado di essere trattato come una sequenza è definito un oggetto iterable (iterabile)**. @@ -13,7 +13,6 @@ L'oggetto restituito dalla funzione `range()` è un iterabile. 0 1 2 -3 ``` Una lista, un set o le chiavi di un dizionario sono iterabili: diff --git a/docs/Pyllole/75_List_Comprehension.md b/docs/Pyllole/75_List_Comprehension.md index 82467ad..1574376 100644 --- a/docs/Pyllole/75_List_Comprehension.md +++ b/docs/Pyllole/75_List_Comprehension.md @@ -1,6 +1,6 @@ # List Comprehension -_Prima di approfondire le "List Comprehension" assicurati di conoscere le [liste](Type_List.md), [set](Type_Set.md) e [dizionari](Type_Dictionary.md)._ +_Prima di approfondire le "List Comprehension" assicurati di conoscere le [liste](53_Type_List.md), [set](57_Type_Set.md) e [dizionari](59_Type_Dictionary.md)._ La sintassi per le _list comprehension_ consente, in modo semplice ed elegante, di costruire sequenze da altre sequenze. diff --git a/docs/Pyllole/81_Classes.md b/docs/Pyllole/81_Classes.md index d7548fd..1d6012f 100644 --- a/docs/Pyllole/81_Classes.md +++ b/docs/Pyllole/81_Classes.md @@ -20,10 +20,10 @@ class Human: # Assegna l'argomento all'attributo name dell'istanza self.name = name - # Inizializza una proprietà - self._age = 0 + # Inizializza una proprietà + self._age = 0 - # Un metodo dell'istanza. Tutti i metodi prendo "self" + # Un metodo dell'istanza. Tutti i metodi prendono "self" # come primo argomento def say(self, msg): print("{name}: {message}".format(name=self.name, message=msg)) @@ -45,7 +45,7 @@ class Human: return "*grunt*" # Una property è come un metodo getter. - # Trasforma il metodo age() in un attributo in sola lettura, + # Trasforma il metodo age() in un attributo in sola lettura, # che ha lo stesso nome @property def age(self): @@ -84,17 +84,15 @@ if __name__ == '__main__': # Chiama un metodo statico print(Human.grunt()) # => "*grunt*" - - # Non è possibile chiamare il metodo statico con l'istanza dell'oggetto - # poiché i.grunt() metterà automaticamente "self" (l'oggetto i) - # come argomento - print(i.grunt()) # => TypeError: grunt() takes 0 positional arguments but 1 was given + + # I metodi statici possono essere chiamati anche dalle istanze + print(i.grunt()) # => "*grunt*" # Aggiorna la property (age) di questa istanza i.age = 42 # Leggi la property i.say(i.age) # => "Ian: 42" - j.say(j.age) # => "Joel: 0" + j.say(j.age) # => "Joel: 0" # Cancella la property del i.age i.age # => questo genererà un AttributeError diff --git a/docs/Pyllole/83_Inheritance.md b/docs/Pyllole/83_Inheritance.md index 99d96fb..e30f809 100644 --- a/docs/Pyllole/83_Inheritance.md +++ b/docs/Pyllole/83_Inheritance.md @@ -17,31 +17,30 @@ Specificare le classi genitore come parametri della definizione della classe ```python class Superhero(Human): - # Se la classe figlio deve ereditare tutte le definizioni del - # genitore senza alcuna modifica, puoi semplicemente usare + # Se la classe figlio deve ereditare tutte le definizioni del + # genitore senza alcuna modifica, puoi semplicemente usare # la parola chiave "pass" (e nient'altro) # Le classi figlio possono sovrascrivere gli attributi dei loro genitori species = 'Superhuman' - # Le classi figlie ereditano automaticamente il costruttore della classe - # genitore, inclusi i suoi argomenti, ma possono anche definire ulteriori - # argomenti o definizioni e sovrascrivere i suoi metodi (compreso il + # Le classi figlie ereditano automaticamente il costruttore della classe + # genitore, inclusi i suoi argomenti, ma possono anche definire ulteriori + # argomenti o definizioni e sovrascrivere i suoi metodi (compreso il # costruttore della classe). - # Questo costruttore eredita l'argomento "nome" dalla classe "Human" e + # Questo costruttore eredita l'argomento "nome" dalla classe "Human" e # aggiunge gli argomenti "superpowers" e "movie": def __init__(self, name, movie=False, superpowers=["super strength", "bulletproofing"]): - # aggiungi ulteriori attributi della classe - self.fictional = True - self.movie = movie - self.superpowers = superpowers + # aggiungi ulteriori attributi della classe + self.fictional = True + self.movie = movie + self.superpowers = superpowers - # La funzione "super" ti consente di accedere ai metodi della classe - # genitore che sono stati sovrascritti dalla classe figlia, - # in questo caso il metodo __init__. - # Il seguente codice esegue il costruttore della classe genitore: - super().__init__(name) + # La funzione "super" ti consente di accedere ai metodi della classe + # genitore, in questo caso il metodo __init__. + # Il seguente codice inizializza gli attributi definiti in Human: + super().__init__(name) # Sovrascrivere il metodo "sing" def sing(self): @@ -59,36 +58,36 @@ Proviamo la classe `Superhero`: if __name__ == '__main__': sup = Superhero(name="Tick") -# Controllo del tipo di istanza -if isinstance(sup, Human): - print('I am human') -if type(sup) is Superhero: - print('I am a superhero') + # Controllo del tipo di istanza + if isinstance(sup, Human): + print('I am human') + if type(sup) is Superhero: + print('I am a superhero') -# Ottieni il "Method Resolution search Order" usato sia da getattr () -# che da super (). Questo attributo è dinamico e può essere aggiornato -print(Superhero.__mro__) # => (, - # => , ) + # Ottieni il "Method Resolution search Order" usato sia da getattr () + # che da super (). Questo attributo è dinamico e può essere aggiornato + print(Superhero.__mro__) # => (, + # => , ) -# Esegui il metodo principale ma utilizza il proprio attributo di classe -print(sup.get_species()) # => Superhuman + # Esegui il metodo principale ma utilizza il proprio attributo di classe + print(sup.get_species()) # => Superhuman -# Esegui un metodo che è stato sovrascritto -print(sup.sing()) # => Dun, dun, DUN! + # Esegui un metodo che è stato sovrascritto + print(sup.sing()) # => Dun, dun, DUN! -# Esegui un metodo di Human -sup.say('Spoon') # => Tick: Spoon + # Esegui un metodo di Human + sup.say('Spoon') # => Tick: Spoon -# Esegui un metodo che esiste solo in Superhero -sup.boast() # => I wield the power of super strength! - # => I wield the power of bulletproofing! + # Esegui un metodo che esiste solo in Superhero + sup.boast() # => I wield the power of super strength! + # => I wield the power of bulletproofing! -# Attributo di classe ereditato -sup.age = 31 -print(sup.age) # => 31 + # Attributo di classe ereditato + sup.age = 31 + print(sup.age) # => 31 -# Attributo che esiste solo in Superhero -print('Am I Oscar eligible? ' + str(sup.movie)) + # Attributo che esiste solo in Superhero + print('Am I Oscar eligible? ' + str(sup.movie)) ``` diff --git a/docs/Pyllole/85_Inheritance_Multiple.md b/docs/Pyllole/85_Inheritance_Multiple.md index 2eeee3e..ad2fcf6 100644 --- a/docs/Pyllole/85_Inheritance_Multiple.md +++ b/docs/Pyllole/85_Inheritance_Multiple.md @@ -8,19 +8,19 @@ Creaimo una nuova classe `Bat`: # bat.py class Bat: -species = 'Baty' + species = 'Baty' -def __init__(self, can_fly=True): - self.fly = can_fly + def __init__(self, can_fly=True): + self.fly = can_fly -# Questa classe ha anche un metodo "say" -def say(self, msg): - msg = '... ... ...' - return msg + # Questa classe ha anche un metodo "say" + def say(self, msg): + msg = '... ... ...' + return msg -# E anche un suo metodo personale -def sonar(self): - return '))) ... (((' + # E anche un suo metodo personale + def sonar(self): + return '))) ... (((' if __name__ == '__main__': b = Bat() @@ -31,7 +31,7 @@ if __name__ == '__main__': Definiamo una classe che erediti da `Superhero` e `Bat` e proviamola ```python -# superhero.py +# batman.py from superhero import Superhero from bat import Bat @@ -42,14 +42,14 @@ class Batman(Superhero, Bat): def __init__(self, *args, **kwargs): # In genere per ereditare gli attributi devi chiamare super: # super(Batman, self).__init__(*args, **kwargs) - # Ma qui abbiamo a che fare con l'ereditarietà multipla, - # e super() funziona solo con la successiva classe + # Ma qui abbiamo a che fare con l'ereditarietà multipla, + # e super() funziona solo con la successiva classe # nell'elenco MRO. - # Quindi, invece, chiamiamo esplicitamente __init__ per - # tutti gli antenati. L'uso di *args e **kwargs consente - # di passare in modo pulito gli argomenti, con ciascun + # Quindi, invece, chiamiamo esplicitamente __init__ per + # tutti gli antenati. L'uso di *args e **kwargs consente + # di passare in modo pulito gli argomenti, con ciascun # genitore che "sbuccia un livello della cipolla". - Superhero.__init__(self, 'anonymous', movie=True, + Superhero.__init__(self, 'anonymous', movie=True, superpowers=['Wealthy'], *args, **kwargs) Bat.__init__(self, *args, can_fly=False, **kwargs) # sovrascrivere il valore per l'attributo name @@ -61,23 +61,23 @@ class Batman(Superhero, Bat): if __name__ == '__main__': sup = Batman() - # Ottieni il "Method Resolution search Order" + # Ottieni il "Method Resolution search Order" # utilizzato da getattr() e super(). # Questo attributo è dinamico e può essere aggiornato - print(Batman.__mro__) # => (, - # => , - # => , + print(Batman.__mro__) # => (, + # => , + # => , # => , ) - # Esegui il metodo del genitore ma utilizza il proprio + # Esegui il metodo del genitore ma utilizza il proprio # attributo di classe print(sup.get_species()) # => Superhuman # Esegui un metodo che è stato sovrascritto print(sup.sing()) # => nan nan nan nan nan batman! - # Esegui un metodo da Human, perché l'ordine di - # ereditarietà è importante + # Esegui un metodo da Human, perché l'ordine di + # ereditarietà è importante sup.say('I agree') # => Sad Affleck: I agree # Esegui un metodo che esiste solo nel 2o antenato @@ -87,7 +87,7 @@ if __name__ == '__main__': sup.age = 100 print(sup.age) # => 100 - # Attributo ereditato dal secondo antenato il cui valore + # Attributo ereditato dal secondo antenato il cui valore # predefinito è stato ignorato. print('Can I fly? ' + str(sup.fly)) # => Can I fly? False ``` diff --git a/docs/Pyllole/assets/favicon.png b/docs/Pyllole/assets/favicon.png new file mode 100644 index 0000000..c2478ba Binary files /dev/null and b/docs/Pyllole/assets/favicon.png differ diff --git a/docs/index.md b/docs/index.md index 1554996..5d90cb2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,10 +11,9 @@ Prima di voler scrivere un qualunque programma con Python è necessario conoscer ## Principali Riferimenti Online * **Python.org**: [il sito ufficiale in inglese](https://docs.python.org) -* **Python.it** : [sito ufficiale italiano](http://www.python.it/) - [Forum](http://www.python.it/forum) - [Telegram](https://t.me/pythonita) - [Mailing list](http://www.python.it/comunita/mailing-list/) -* **Python-it.org**: [Sito](http://www.python-it.org) - [Forum](http://www.python-it.org/forum) +* **Python.it** : [sito ufficiale italiano](http://www.python.it/) - [Forum](http://www.python.it/forum) - [Telegram](https://t.me/python_ita) - [Mailing list](http://www.python.it/comunita/mailing-list/) -**Cerca di usare, per quanto possibile, Python 3.x**, [a breve](https://pythonclock.org) Python 2.7 non verrà più supportato. +**Nello studio e nelle ricerche fai sempre riferimento a Python 3.x**, Python 2 non è più supportato dal 1° gennaio 2020, maggiori informazioni [qui](https://www.python.org/doc/sunset-python-2/). ## Per iniziare @@ -30,7 +29,7 @@ Le Pyllole sono brevi e semplici spiegazioni relative al linguaggio Python 3. * [Come usare Python](Pyllole/01_Use_Python.md) - [Ambiente di sviluppo](Pyllole/05_Development_Environment.md) * [Sintassi di base](Pyllole/11_Syntax.md) * [Le variabili](Pyllole/21_Variables.md) -* [Print](Pyllole/23_Print.md) - [Input](Pyllole/25_Input.md) - [If/Else](Pyllole/27_If-Else.md) - [Cicli](Pyllole/Loops.md) +* [Print](Pyllole/23_Print.md) - [Input](Pyllole/25_Input.md) - [If/Else](Pyllole/27_If-Else.md) - [Cicli](Pyllole/29_Loops.md) * [Numeri](Pyllole/41_Type_Number.md) - [Stringhe](Pyllole/42_Type_String.md) - [Booleani](Pyllole/43_Type_Boolean.md) - [None](Pyllole/44_Type_None.md) * [Liste](Pyllole/53_Type_List.md) - [Tuple](Pyllole/55_Type_Tuple.md) - [Set](Pyllole/57_Type_Set.md) - [Dizionari](Pyllole/59_Type_Dictionary.md) * [Try/Except](Pyllole/61_Try_Except.md) @@ -44,21 +43,25 @@ Le Pyllole sono brevi e semplici spiegazioni relative al linguaggio Python 3. * Per condividere il tuo codice, in un forum o chat, usa un servizio per la condivisione del codice * [hastebin](https://hastebin.com) - [arin.ga](https://arin.ga) - [dpaste.de](https://dpaste.de) * Puoi provare il tuo codice, senza installare nulla sul tuo PC, usando un compilatore online - * [Judge0 IDE](https://ide.judge0.com) - [repl.it](https://repl.it/) + * [Judge0 IDE](https://ide.judge0.com) - [trinket.strivemath.org](https://trinket.strivemath.org/python3) - [repl.it](https://repl.it/) - [Coddy](https://coddy.tech/playground/it/python) ## Documentazione Gratuita -* ### eBook, Guide e Tutorial +* ### Tutorial, eBook e Guide Online * ITALIANO * [Documentazione ufficiale](http://python.it/doc/) - * eBook: [Immersione in Python 3](http://gpiancastelli.altervista.org/dip3-it/) - [PDF](http://gpiancastelli.altervista.org/dip3-it/d/diveintopython3-it-pdf-latest.zip) - * eBook: [ThinkPython](https://github.com/AllenDowney/ThinkPythonItalian/) -[PDF](https://github.com/AllenDowney/ThinkPythonItalian/blob/master/thinkpython_italian.pdf) - * Guida: [Guida Python di HTML.IT](http://www.html.it/guide/guida-python/) + * Tutorial e guide online: + * [Tutorial Python di Nicola Cassetta (base e intermedio)](http://ncassetta.altervista.org/materiali-didattici.html) + * [Tutorial Python di CodingCreativo.it](https://www.codingcreativo.it/tutorial-python/) + * [Guida Python di HTML.IT](http://www.html.it/guide/guida-python/) + * eBook: + * [Immersione in Python 3](http://gpiancastelli.altervista.org/dip3-it/) - [PDF](http://gpiancastelli.altervista.org/dip3-it/d/diveintopython3-it-pdf-latest.zip) + * [ThinkPython](https://github.com/AllenDowney/ThinkPythonItalian/) -[PDF](https://github.com/AllenDowney/ThinkPythonItalian/blob/master/thinkpython_italian.pdf) * INGLESE * Python 3 Official Documentation - * [Documentation](https://docs.python.org/3/download.html) + * [Documentation](https://www.python.org/doc/) * [Tutorial](https://docs.python.org/3/tutorial/index.html) * E-book * [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) @@ -66,9 +69,8 @@ Le Pyllole sono brevi e semplici spiegazioni relative al linguaggio Python 3. * [Fundamentals of Programming Python](http://python.cs.southern.edu/pythonbook/pythonbook.pdf) * [O’Reilly Media: A Whirlwind Tour of Python](http://www.oreilly.com/programming/free/files/a-whirlwind-tour-of-python.pdf) * Packt Publishing - * [Learning Python](https://www.packtpub.com/packt/free-ebook/learning-python) - * [What You Need To Know About Python](https://www.packtpub.com/packt/free-ebook/what-you-need-know-about-python) - * [Mastering Python](https://www.packtpub.com/free-ebook/mastering-python) + * [Learning Python](https://www.packtpub.com/free-ebooks/learning-python) + * [Mastering Python](https://www.packtpub.com/free-ebooks/mastering-python) * [Python Practice Book](https://anandology.com/python-practice-book/index.html) * [Python Programming](https://upload.wikimedia.org/wikipedia/commons/9/91/Python_Programming.pdf) * [Syncfusion: Python Succinctly](https://www.syncfusion.com/ebooks/python) @@ -76,22 +78,25 @@ Le Pyllole sono brevi e semplici spiegazioni relative al linguaggio Python 3. * [The Hitchhiker’s Guide to Python!](http://docs.python-guide.org/en/latest/) * [Python 101](https://leanpub.com/python_101) * [Intermediate Python](https://leanpub.com/intermediatepython) - * [Think Python 2e](http://greenteapress.com/wp/think-python-2e/) + * [Think Python 2 edition](http://greenteapress.com/wp/think-python-2e/) * [30 Python Language Features and Tricks You May Not Know About](http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html) * [Building Skills in Python](http://www.itmaybeahack.com/book/python-2.6/latex/BuildingSkillsinPython.pdf) + * Cheatsheet + * [Python Cheatsheet](https://www.pythoncheatsheet.org/) + * [Comprehensive Python Cheatsheet](https://gto76.github.io/python-cheatsheet/) * Tutorial * [A Beginner's Python Tutorial](https://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorial) + * [Python 3 Module of the Week](https://pymotw.com) * [A Byte of Python](https://python.swaroopch.com/first_steps.html) - * [CodeCademy: Python](https://www.codecademy.com/learn/python) * ### Video Corsi e Tutorial * ITALIANO * [Video Corso Python 3 - Impara a Programmare in Python 3.6](https://www.youtube.com/playlist?list=PLHUQL6-_n9Zes1VLMgJbLa8IIOHT9x4Nu) * [Python 3.6 Tutorial Italiano - Programmazione a Oggetti - Classi e Istanze](https://www.youtube.com/watch?v=nmoJf-Ei4TA&list=PLHUQL6-_n9ZdD3JMKg4On4NFh8bBg3Ckn) * [ProgrammareInPython.it - Video Corsi e Esercizi](https://www.programmareinpython.it/programmare-in-python/) - * [Programmare in Python 2 - Marco Beri](https://www.youtube.com/playlist?list=PLC4DEDAECF24B855D) * [Amazing Python - Marco Beri](https://www.youtube.com/watch?v=O0DLSD5o5VU&list=PLu-RPGHOxmPVN7WbrlmO6Vc2gb8djB3_n) * INGLESE + * [Python for Beginners - Microsoft](https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6) * [Automate the Boring Stuff with Python](https://www.youtube.com/playlist?list=PL0-84-yl1fUnRuXGFe_F7qSH1LEnn9LkW) * [Python 3.4 Programming Tutorials](https://www.youtube.com/playlist?list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_) * [Python Programming Tutorials](https://www.youtube.com/playlist?list=PLEA1FEF17E1E5C0DA) @@ -107,21 +112,22 @@ In questi elenchi possono essere trovati approfondimenti e documentazione relati * ITALIANO * [Python.it - I libri su Python](http://www.python.it/doc/libri/) * INGLESE - * [Free Programming Books](https://github.com/EbookFoundation/free-programming-books/blob/master/free-podcasts-screencasts-en.md#python) - * [Packt Publishing: Free Learning - Free Programming Ebooks](https://www.packtpub.com/packt/offers/free-learning) - * [O’Reilly Media: Free Ebooks](http://www.oreilly.com/free/reports.html) + * [Python projects for beginners](https://beginnerpythonprojects.com/) + * [Free Programming Books](https://github.com/EbookFoundation/free-programming-books/blob/main/casts/free-podcasts-screencasts-en.md#python) + * [Packt Publishing: Free Learning - Free Programming Ebooks](https://www.packtpub.com/free-learning) + * [O’Reilly: Open Books](https://www.oreilly.com/openbook/) * [Syncfusion: Succinctly free eBooks](https://www.syncfusion.com/ebooks) - * [Awesome Python Awesome](https://github.com/vinta/awesome-python) - list of frameworks, libraries, software and resources + * [Awesome Python](https://github.com/vinta/awesome-python) - una lista di frameworks, librerie e software * ### Video Corsi e Tutorial * ITALIANO * [Python.it - Media](http://python.it/doc/media/) * INGLESE - * [Free Python Podcasts and Screencasts](https://github.com/EbookFoundation/free-programming-books/blob/master/free-podcasts-screencasts-en.md#python) + * [Free Python Podcasts and Screencasts](https://github.com/EbookFoundation/free-programming-books/blob/main/casts/free-podcasts-screencasts-en.md) --- -Ogni contributo è ben accetto, leggi il [codice di condotta](CODE_OF_CONDUCT.md) e la pagina con le [linee guida alla collaborazione](CONTRIBUTING.md). +Ogni contributo è ben accetto, leggi il [codice di condotta](https://github.com/pythonitalia/python-abc/blob/master/CODE_OF_CONDUCT.md) e la pagina con le [linee guida alla collaborazione](https://github.com/pythonitalia/python-abc/blob/master/CONTRIBUTING.md). Questa guida è è pubblicata con licenza [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) (Creative Commons Attribution 4.0 International) - [leggi qui i dettagli](https://github.com/pythonitalia/python-abc/blob/master/LICENSE).