Python PDF
Python PDF
Testo originale
Contribuisci a una traduzione migliore
Pagina 2
tory
foto
Python per
® programmatori
arning Pat
hlights
ttings
Supporto
Disconnessione
Pagina 3
Playlist
®
Deitel Developer Series
storia
guadagnando Pat
Paul Deitel
Harvey Deitel
ffers & Dea
ighlights
ettings
Supporto
Disconnessione
Pagina 4
Playlist
storia
Supporto
Per informazioni sull'acquisto di questo titolo in grandi quantità o per vendite speciali
opportunità
Disconnessione (che possono includere versioni elettroniche; design di copertine personalizzate; e
contenuti specifici per la tua attività, obiettivi di formazione, obiettivi di marketing o branding
interessi), contatta il nostro reparto vendite aziendale al numero [email protected]
o (800) 3823419.
Per domande sulle vendite al di fuori degli Stati Uniti, contattare [email protected] .
Tutti i diritti riservati. Questa pubblicazione è protetta da copyright e l'autorizzazione deve esserlo
ottenuto dall'editore prima di qualsiasi riproduzione vietata, archiviazione in un recupero
sistema, o trasmissione in qualsiasi forma o con qualsiasi mezzo, elettronico, meccanico,
fotocopiatura, registrazione o altro. Per informazioni sui permessi, richiedere
moduli e i contatti appropriati all'interno di Pearson Education Global Rights &
Dipartimento permessi, visita ww.pearsoned.com/permissions/ .
gc
io
w
Pagina 5
eitel e il bug doublethumbsup sono marchi registrati di Deitel e
Associates, Inc.
ISBN13: 9780135224335
ISBN10: 0135224330
1 19
D
Pagina 6
le liste
ory
reface
1
1
Fonte sconosciuta, spesso attribuita erroneamente a Mark Twain.
rning Pat
Benvenuto in Python per programmatori ! In questo libro imparerai a fare pratica con la maggior parte di oggi
rs & Dea
tecnologie di elaborazione avvincenti e all'avanguardia e programmerai in Python, uno dei
le lingue più popolari al mondo e quelle in più rapida crescita tra loro.
hlights
Gli sviluppatori spesso scoprono rapidamente che gli piace Python. Apprezzano la sua forza espressiva,
ings
leggibilità, concisione e interattività. A loro piace il mondo del software opensource
sviluppo che sta generando una base in rapida crescita di software riutilizzabile per un enorme
Supporto
gamma di aree di applicazione.
Disconnessione
Per molti decenni sono state in atto alcune tendenze potenti. L'hardware del computer è rapidamente
sta diventando più veloce, più economico e più piccolo. La larghezza di banda di Internet è aumentata rapidamente
e più economico. E il software per computer di qualità è diventato sempre più abbondante ed essenzialmente
libero o quasi gratuito attraverso il movimento “open source”. Presto, l '"Internet of Things" lo farà
connettere decine di miliardi di dispositivi di ogni tipo immaginabile. Questi genereranno enormi
volumi di dati a velocità e quantità in rapido aumento.
Nel calcolo di oggi, le ultime innovazioni sono “interamente circa i dati” - i dati della scienza, dei dati
analisi, grandi dati , relazionali dati basi (SQL), e NoSQL e NewSQL dati basi, ognuna delle
che affrontiamo insieme a un trattamento innovativo della programmazione Python.
3
ttps: //economicgraph.linkedin.com/resources/linkedinworkforce
eportaugust2018 .
4
ttps: //www.burningglass.com/wp
ARCHITETTURA MODULARE
L'architettura modulare del libro (vedere il grafico del sommario sul file
copertina interna del libro) ci aiuta a soddisfare le diverse esigenze di diversi pubblici professionisti.
hapters 1 - 0 copre la programmazione Python. Ciascuno di questi capitoli include una breve introduzione a
Sezione di Data Science che introduce l'intelligenza artificiale, le statistiche descrittive di base,
misure di tendenza centrale e dispersione, simulazione, visualizzazione statica e dinamica,
lavorare con file CSV, panda per l'esplorazione dei dati e il data wrangling, serie temporali e
P c(1C
hrn
implementare la regressione lineare. Questi ti aiutano a prepararti per la scienza dei dati, l'IA, i big data e il cloud Pagina 7
casi di studio in hapters 11 - 6 , che offrono opportunità per utilizzare il mondo reale
set di dati in studi di casi completi.
Dopo aver coperto Python hapters 1 - 5 e alcune parti chiave di hapters 6 - 7 , sarete in grado di
hapters 11 - 6 sono caricati con esempi interessanti, potenti e contemporanei. Presentano le mani
sull'implementazione di casi di studio su argomenti come l'elaborazione del linguaggio naturale, i dati
estrazione di Twitter, elaborazione cognitiva con Watson di IBM, macchina supervisionata
apprendimento con classificazione e regressione, apprendimento automatico senza supervisione con
clustering, deep learning con reti neurali convoluzionali, deep learning
con reti neurali ricorrenti, big data con Hadoop, Spark e NoSQL
database, Internet of Things e altro ancora. Lungo la strada, acquisirai un ampio
alfabetizzazione dei termini e dei concetti della scienza dei dati, che vanno da brevi definizioni all'utilizzo di concetti
in programmi piccoli, medi e grandi. Sfogliare l'indice dettagliato del libro e
Index ti darà un'idea dell'ampiezza della copertura.
CARATTERISTICHE PRINCIPALI
Sii semplice: in ogni aspetto del libro ci impegniamo per la semplicità e la chiarezza. Per
Ad esempio, quando presentiamo l'elaborazione del linguaggio naturale, usiamo il semplice e intuitivo
Libreria TextBlob piuttosto che il più complesso NLTK. Nel nostro apprendimento profondo
presentazione, preferiamo Keras a TensorFlow. In generale, quando più biblioteche potrebbero
essere utilizzato per eseguire compiti simili, usiamo quello più semplice.
Mantenerlo piccolo: la maggior parte dei 538 esempi del libro sono piccoli, spesso solo poche righe di
codice, con feedback IPython interattivo immediato. Includiamo anche 40 script più grandi
e studi di casi approfonditi.
Attualità: leggiamo decine di libri recenti di programmazione e scienza dei dati Python,
e sfogliato, letto o guardato circa 15.000 articoli correnti, documenti di ricerca, bianchi
documenti, video, post di blog, post di forum e documenti. Questo ci ha permesso di farlo
"Prendi il polso" di Python, informatica, scienza dei dati, intelligenza artificiale, big data e cloud
comunità.
Il modo ideale per imparare da questo libro è leggerlo ed eseguire gli esempi di codice in parallelo.
In tutto il libro, utilizziamo l'interprete IPython, che fornisce un amichevole,
modalità interattiva di feedback immediato per esplorare, scoprire e
sperimentare con Python e le sue vaste librerie.
La maggior parte del codice è presentata in piccole sessioni IPython interattive. Per ogni codice
snippet che scrivi, IPython lo legge immediatamente, lo valuta e stampa i risultati. Questo
il feedback istantaneo mantiene la tua attenzione, aumenta l'apprendimento, facilita la prototipazione rapida
e accelera il processo di sviluppo del software.
I nostri libri sottolineano sempre l'approccio livecode, concentrandosi sul completo, funzionante
programmi con ingressi e uscite live. La "magia" di IPython è che trasforma anche frammenti
in codice che "prende vita" quando si immette ogni riga. Questo promuove l'apprendimento e
incoraggia la sperimentazione.
1
C
S
programmazione del tipo e programmazione orientata agli oggetti. Pagina 8
La programmazione in stile funzionale viene utilizzata in tutto il libro come appropriato. Un grafico
nel il capitolo 4 elenca la maggior parte delle capacità di programmazione in stile funzionale chiave di Python e il
capitoli in cui inizialmente trattiamo la maggior parte di essi.
Attaccherai attività significative con AI, big data e tecnologie cloud come naturale
elaborazione del linguaggio, data mining Twitter, machine learning, deep learning,
Hadoop, MapReduce, Spark, IBM Watson, librerie di data science chiave (NumPy,
panda, SciPy, NLTK, TextBlob, spaCy, Textatistic, Tweepy, Scikitlearn,
Keras), librerie di visualizzazione chiave (Matplotlib, Seaborn, Folium) e altro ancora.
Visualizzazioni
Piuttosto che includere una trattazione della programmazione grafica di basso livello, ci concentriamo su quello alto
visualizzazioni di livello prodotte da Matplotlib, Seaborn, pandas e Folium (per
mappe interattive).
Usiamo le visualizzazioni come strumento pedagogico. Ad esempio, facciamo la legge del grande
i numeri "prendono vita" in una simulazione dinamica del dierolling e in un grafico a barre. Come la
numero di tiri aumenta, vedrai gradualmente la percentuale di ogni faccia sul totale dei tiri
avvicinarsi al 16,667% (1/6) e le dimensioni delle barre che rappresentano le percentuali si equalizzano.
Le visualizzazioni sono fondamentali nei big data per l'esplorazione e la comunicazione dei dati
risultati di ricerca riproducibili, in cui gli elementi di dati possono essere milioni,
5
miliardi o più. Un detto comune è che un'immagine vale più di mille parole —In grande
dati, una visualizzazione potrebbe valere miliardi, trilioni o anche più elementi in un database.
Le visualizzazioni consentono di "volare a 40.000 piedi sopra i dati" per vederli "in grande" e verso
conoscere i tuoi dati. Le statistiche descrittive aiutano ma possono essere fuorvianti. Per esempio,
6
Il quartetto di Anscombe dimostra attraverso visualizzazioni significativamente differenti
i set di dati possono avere statistiche descrittive quasi identiche .
ttps: //en.wikipedia.org/wiki/A_picture_is_worth_a_thousand_words .
6
ttps: //en.wikipedia.org/wiki/Anscombe%27s_quartet .
Mostriamo il codice di visualizzazione e animazione in modo che tu possa implementare il tuo. Anche noi
fornire le animazioni nei file codice sorgente e come Jupyter Notebook, così puoi
personalizzare comodamente il codice ei parametri di animazione, rieseguire le animazioni
e vedere gli effetti dei cambiamenti.
Esperienze di dati
S
C
h
Esperienze di dati
Le nostre sezioni Intro to Data Science e casi di studio in hapters 11 - 6 fornire ricchi Pagina 9
esperienze di dati.
Lavorerai con molti set di dati e origini dati del mondo reale. C'è un enorme
varietà di set di dati aperti gratuiti disponibili online con cui sperimentare. Alcuni dei
i siti a cui facciamo riferimento elencano centinaia o migliaia di set di dati.
Molte librerie che utilizzerai vengono fornite in bundle con set di dati popolari per la sperimentazione.
Imparerai i passaggi necessari per ottenere i dati e prepararli per l'analisi, analizzare quei dati
utilizzando molte tecniche, sintonizza i tuoi modelli e comunica i risultati in modo efficace,
soprattutto attraverso la visualizzazione.
GitHub
GitHub è un luogo eccellente per trovare codice opensource da incorporare nel tuo file
progetti (e per contribuire con il tuo codice alla comunità opensource). È anche cruciale
elemento dell'arsenale dello sviluppatore di software con strumenti di controllo della versione che aiutano i team di
gli sviluppatori gestiscono progetti opensource (e privati).
Gran parte dell'analisi dei big data avviene nel cloud, dove è facile scalare dinamicamente il file
quantità di hardware e software di cui hanno bisogno le applicazioni. Lavorerai con vari cloud
servizi basati (alcuni direttamente e alcuni indirettamente), inclusi Twitter, Google
Translate, IBM Watson, Microsoft Azure, OpenMapQuest, geopy, Dweet.io e
PubNub.
• Ti invitiamo a utilizzare servizi cloud gratuiti, di prova gratuiti o freemium. Preferiamo quelli che
non hai bisogno di una carta di credito perché non vuoi rischiare di incappare accidentalmente in bollette elevate.
Se decidi di utilizzare un servizio che richiede una carta di credito, assicurati che il livello
che stai utilizzando gratuitamente non passerà automaticamente a un livello a pagamento.
Secondo IBM (novembre 2016), il 90% dei dati mondiali è stato creato negli ultimi due anni.
7
Le prove indicano che la velocità di creazione dei dati sta rapidamente accelerando.
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
il coinvolgimento del clientewatsonmarketingwrotherpaperandreports
rl12345usen20170719.pdf .
Secondo un articolo di AnalyticsWeek di marzo 2016 , entro cinque anni ce ne saranno più di 50
miliardi di dispositivi connessi a Internet e entro il 2020 produrremo 1,7 megabyte di
8
nuovi dati ogni secondo per ogni persona sul pianeta !
8
ttps: //analyticsweek.com/content/bigdatafacts/ .
I database sono infrastrutture critiche per big data per l'archiviazione e la manipolazione di file
enormi quantità di dati che elaborerai. I database relazionali elaborano dati strutturati -
non sono orientati ai dati non strutturati e semistrutturati nelle applicazioni big data.
Quindi, con l'evoluzione dei big data, sono stati creati database NoSQL e NewSQL per gestirli
dati in modo efficiente. Includiamo una panoramica di NoSQL e NewSQL e un caso di studio pratico
con un database di documenti JSON MongoDB. MongoDB è il NoSQL più popolare
Banca dati.
1w
C
hB
ata: Hadoop, Spark, NoSQL e IoT (Internet of Things). " Pagina 10
Ci sono poche ragioni oggi per la maggior parte degli sviluppatori di applicazioni per creare dati personalizzati
strutture. Il libro presenta una ricca trattazione in due capitoli del builtin di Python
strutture di dati - elenchi, tuple, dizionari e set - con cui la maggior parte dei dati
compiti di strutturazione possono essere realizzati.
Ci concentriamo anche su tre strutture di dati chiave dalle librerie opensource: array NumPy,
pandas Series e panda DataFrames. Questi sono ampiamente utilizzati nella scienza dei dati,
informatica, intelligenza artificiale e big data. NumPy offre fino a due ordini
di magnitudo maggiori prestazioni rispetto agli elenchi Python incorporati.
Includiamo in nel capitolo 7 una ricca trattazione degli array NumPy. Molte biblioteche, come
introdurre panda Series e DataFrames, che insieme agli array NumPy sono quindi
il capitolo 9 presenta l'elaborazione dei file di testo, quindi mostra come serializzare gli oggetti
utilizzando il popolare formato JSON (JavaScript Object Notation). Viene utilizzato JSON
frequentemente nei capitoli della scienza dei dati.
Molte librerie di data science forniscono funzionalità integrate di elaborazione dei file per il caricamento
set di dati nei tuoi programmi Python. Oltre ai file di testo semplice, elaboriamo i file nel formato
popolare formato CSV (valori separati da virgole) che utilizza lo standard Python
Modulo csv della libreria e funzionalità della libreria di data science pandas.
Con questo approccio, sarai in grado di utilizzare l'apprendimento automatico, il deep learning e altre AI
tecnologie per risolvere rapidamente un'ampia gamma di problemi intriganti, compresi quelli cognitivi
sfide informatiche come il riconoscimento vocale e la visione artificiale.
Lo sviluppo di classi personalizzate è un'abilità di programmazione orientata agli oggetti cruciale, insieme
con ereditarietà, polimorfismo e dattilografia. Ne discutiamo in capitolo 10 .
il capitolo 10 include una discussione sui test unitari con doctest e una scheda divertente
simulazione di mescolamento e scambio.
1D
C
hapters 11 - 6 richiedono solo poche semplici definizioni di classi personalizzate. In Python, Pagina 11
probabilmente utilizzerai più un approccio di programmazione basato su oggetti rispetto a un oggetto fullout
programmazione orientata.
Riproducibilità
Nelle scienze in generale, e nella scienza dei dati in particolare, è necessario riprodurre il file
risultati di esperimenti e studi e per comunicare tali risultati in modo efficace. Jupyter
I taccuini sono un mezzo preferito per farlo.
Discutiamo della riproducibilità in tutto il libro nel contesto della programmazione
tecniche e software come Jupyter Notebooks e Docker.
Prestazione
In questo libro, invece di scrivere il tuo codice di parallelizzazione, lascerai che le librerie apprezzino
Keras in esecuzione su TensorFlow e strumenti per big data come Hadoop e Spark parallelizzano
operazioni per te. In questa era di big data / intelligenza artificiale, i requisiti di elaborazione sono enormi
le applicazioni dati richiedono di sfruttare il vero parallelismo fornito dal multicore
processori, unità di elaborazione grafica (GPU), unità di elaborazione tensoriale (TPU)
ed enormi cluster di computer nel cloud. Alcune attività di big data potrebbero avere
migliaia di processori che lavorano in parallelo per analizzare enormi quantità di dati
rapidamente.
CAPITOLO DIPENDENZE
Se sei un formatore che pianifica il tuo programma per un corso di formazione professionale o uno sviluppatore
decidendo quali capitoli leggere, questa sezione ti aiuterà a prendere le decisioni migliori. per favore
leggete l'indice a colori di una pagina sulla copertina interna del libro: questo lo farà
familiarizzare rapidamente con l'architettura unica del libro. Insegnare o leggere i capitoli
in ordine è più semplice. Tuttavia, gran parte del contenuto delle sezioni Intro to Data Science in
capitolo 6 , Dizionari e set: la sezione Introduzione alla scienza dei dati in questo capitolo è
non dipende dal contenuto del capitolo.
capitolo 7 , Programmazione ArrayOriented con NumPy: Introduzione alla scienza dei dati
la sezione richiede dizionari ( capitolo 6 ) e array ( capitolo 7 ).
capitolo 8 , Stringhe: uno sguardo più approfondito: la sezione Intro to Data Science richiede raw
stringhe ed espressioni regolari ( ezioni 8.11 - .12 ) e le serie pandas e
Quanto segue riepiloga le dipendenze tra i capitoli per Python capitolo 10 e assume
volendo coprire solo le classi e gli oggetti possono presentare ezioni 10.1 - 0.6 . Formatori
volendo trattare argomenti più avanzati come ereditarietà, polimorfismo e anatra
digitando, può presentare ezioni 10.7 - 0.9 . ezioni 10.10 - 0,15 forniscono ulteriori
prospettive avanzate.
Parte 4: Case study su AI, cloud e Big Data
hai letto hapters 1 - 5 . La maggior partehapters 11 - 6 richiedono anche i fondamenti del dizionario
a partire dal
ezione 6.2 .
capitolo 16 , ig Data: Hadoop, Spark, NoSQL e IoT , utilizza la divisione del metodo di stringa
( sezione 6.2.7 ), Matplotlib FuncAnimation da Sezione 6.4 , Introduzione alla scienza dei dati,
pandas Series e funzionalità DataFrame da ection 7.14 's Intro to Data Science, string
71P
8 C
B
S
ethod join ( ezione 8.9 ), il modulo json ( sezione 9.5 ), parole di arresto NLTK ( ezione Pagina 13
1.2.13 ) e da capitolo 12 , autenticazione Twitter, classe StreamListener di Tweepy
per i tweet in streaming e le librerie di geopy e folium. Alcuni esempi richiedono
definire una classe tramite ereditarietà ( capitolo 10 ), ma puoi semplicemente imitare la classe
definizioni che forniamo senza leggere capitolo 10 .
TACCUINI JUPYTER
Per tua comodità, forniamo gli esempi di codice del libro in codice sorgente Python (.py)
file da utilizzare con l'interprete IPython da riga di comando e come notebook Jupyter
(.ipynb) file che puoi caricare nel tuo browser web ed eseguire.
Jupyter è diventato uno standard per la ricerca scientifica e l'analisi dei dati. Pacchetti
calcolo e argomentazione insieme, permettendoti di costruire "narrazioni computazionali" e questo
9
9
TTP: //www.oreilly.com/ideas/whatisjupyter .
Nella nostra esperienza, è un meraviglioso ambiente di apprendimento e uno strumento di prototipazione rapida. Per
per questo motivo, utilizziamo i notebook Jupyter piuttosto che un IDE tradizionale, come Eclipse,
Visual Studio, PyCharm o Spyder. Accademici e professionisti utilizzano già Jupyter
ampiamente per condividere i risultati della ricerca. Il supporto per Jupyter Notebooks viene fornito tramite
0
meccanismi di comunità opensource tradizionali ( vedere "Ottenere l'aiuto di Jupyter" più avanti in questo
Prefazione). Vedere la sezione Prima di iniziare che segue questa Prefazione per l'installazione del software
dettagli e vedere i testdrive in sezione 1.5 per informazioni sull'esecuzione degli esempi del libro.
0
ttps: //jupyter.org/community .
Lavorare in team e comunicare i risultati della ricerca sono entrambi importanti per gli sviluppatori in
o passare a posizioni di analisi dei dati nell'industria, nel governo o nel mondo accademico:
I taccuini che crei sono facili da condividere tra i membri del team semplicemente copiandoli
i file o tramite GitHub.
I risultati della ricerca, inclusi codice e approfondimenti, possono essere condivisi come pagine web statiche tramite strumenti
come nbviewer ( ttps: //nbviewer.jupyter.org ) e GitHub, entrambi automaticamente
rendere i taccuini come pagine web.
Nella scienza dei dati e nelle scienze in generale, dovrebbero esserci esperimenti e studi
riproducibile. Questo è stato scritto nella letteratura per molti anni, incluso
1
Knuth, D., "Literate Programming" (PDF), The Computer Journal , British Computer
Società, 1992.
2
ttp: //journals.plos.org/plosone/article?
d = 10.1371 / journal.pone.0164023 .
11m
1C
S
h
io
rovenance (origine e lignaggio). Pagina 14
DOCKER
Nel Nel capitolo 16 , utilizzeremo Docker, uno strumento per impacchettare il software in contenitori che raggruppano
tutto il necessario per eseguire quel software in modo conveniente, riproducibile e portabile
piattaforme. Alcuni pacchetti software in cui utilizziamo il capitolo 16 richiede una configurazione complicata e
configurazione. Per molti di questi, puoi scaricare container Docker preesistenti gratuiti.
Questi consentono di evitare problemi di installazione complessi ed eseguire il software localmente sul tuo
computer desktop o notebook, rendendo Docker un ottimo modo per aiutarti a iniziare con il nuovo
tecnologie rapide e convenienti.
Docker aiuta anche con la riproducibilità. Puoi creare contenitori Docker personalizzati che siano
configurato con le versioni di ogni software e di ogni libreria che hai usato nel tuo file
studia. Ciò consentirebbe ad altri sviluppatori di ricreare l'ambiente che hai utilizzato, quindi
riproduci il tuo lavoro e ti aiuterà a riprodurre i tuoi risultati. Nel nel capitolo 16 , utilizzerai
Docker per scaricare ed eseguire un contenitore preconfigurato per il codice e l'esecuzione di grandi dimensioni
applicazioni Data Spark che utilizzano Jupyter Notebook.
politica per i suoi "livelli gratuiti" per essere tra i più amichevoli per i nostri lettori.
3
TTP: //whatis.techtarget.com/definition/cognitivecomputing .
4
ttps: //en.wikipedia.org/wiki/Cognitive_computing .
5
ttps: //www.forbes.com/sites/bernardmarr/2016/03/23/whateveryone
houldknowaboutcognitivecomputing .
IBM incoraggia l'apprendimento e la sperimentazione fornendo livelli lite gratuiti per molti dei suoi
6 7
API. Nel nel capitolo 13 , proverai demo di molti servizi Watson. Quindi, utilizzerai lite
livelli dei servizi Text to Speech, Speech to Text e Translate di Watson per implementare a
App di traduzione "assistente del viaggiatore". Farai una domanda in inglese, quindi l'app
trascriverà il tuo discorso in testo inglese, tradurrà il testo in spagnolo e parlerà il
Testo spagnolo. Successivamente, pronuncerai una risposta in spagnolo (nel caso in cui non parli spagnolo, noi
fornire un file audio che puoi utilizzare). Quindi, l'app trascriverà rapidamente il discorso in spagnolo
testo, traduci il testo in inglese e pronuncia la risposta in inglese. Roba forte!
6
Controllare sempre i termini più recenti sul sito Web di IBM, poiché i termini e i servizi potrebbero cambiare.
7
ttps: //console.bluemix.net/catalog/ .
APPROCCIO DIDATTICO
Python for Programmers contiene una ricca raccolta di esempi tratti da molti campi.
Lavorerai su interessanti esempi del mondo reale utilizzando set di dati del mondo reale. Il libro
si concentra sui principi di una buona ingegneria del software e sottolinea il programma
p
C
11h
S
chiarezza. Pagina 15
Mettiamo in grassetto i termini chiave e il riferimento alla pagina dell'indice per ciascuna occorrenza di definizione
testo per un riferimento più facile. Ci riferiamo ai componenti sullo schermo con il carattere grassetto Helvetica (per
esempio, il menu File) e utilizzare il carattere Lucida per il codice Python (ad esempio, x = 5).
Colorazione sintassi
Per la leggibilità, la sintassi colora tutto il codice. Le nostre convenzioni per la colorazione della sintassi sono le seguenti:
i commenti vengono visualizzati in verde
I 538 esempi del libro contengono circa 4000 righe di codice. Questo è relativamente
piccola quantità per un libro di queste dimensioni ed è dovuta al fatto che Python è un tale espressivo
linguaggio. Inoltre, il nostro stile di codifica consiste nell'usare potenti librerie di classi per svolgere la maggior parte del lavoro
ove possibile.
Saggezza di programmazione
Noi integriamo nelle discussioni la programmazione saggezza gli autori congiunta nove
decenni di esperienza nella programmazione e nell'insegnamento, tra cui:
Suggerimenti per la prevenzione degli errori con suggerimenti per esporre i bug e rimuoverli da
i tuoi programmi. Molti di questi suggerimenti descrivono le tecniche per prevenire la ricezione di bug
nei tuoi programmi in primo luogo.
Suggerimenti sulle prestazioni che evidenziano le opportunità per rendere i tuoi programmi più veloci o
ridurre al minimo la quantità di memoria che occupano.
Osservazioni di ingegneria del software che evidenziano problemi di architettura e progettazione per
corretta costruzione del software, soprattutto per sistemi più grandi.
distribuzione. Include la maggior parte delle librerie Python, di visualizzazione e di scienza dei dati
need, così come l'interprete IPython, Jupyter Notebooks e Spyder, considerato uno dei
i migliori IDE per la scienza dei dati di Python. Usiamo solo IPython e Jupyter Notebook per il programma
sviluppo nel libro. La sezione Prima di iniziare che segue questa prefazione discute
l'installazione di Anaconda e alcuni altri elementi necessari per lavorare con i nostri esempi.
DOCUMENTAZIONE IN PITONE
Troverai la seguente documentazione particolarmente utile durante la lettura del libro:
ttps: //docs.python.org/3/reference/index.html
h
La libreria standard Python: Pagina 16
ttps: //docs.python.org/3/library/index.html
ttps: //docs.python.org/3/
pythonforum.io
ttps: //www.dreamincode.net/forums/forum/29python/
StackOverflow.com
Inoltre, molti fornitori forniscono forum per i loro strumenti e librerie. Molte delle biblioteche che farai
l'uso in questo libro sono gestiti e mantenuti su github.com. Alcuni manutentori di librerie
fornire supporto tramite la scheda Problemi nella pagina GitHub di una determinata libreria. Se non riesci a trovare
una risposta alle tue domande online, consulta la nostra pagina web per il libro all'indirizzo
8
ttp: //www.deitel.com
8
Il nostro sito web sta subendo un importante aggiornamento. Se non trovi qualcosa di cui hai bisogno, per favore
scrivici direttamente a [email protected] .
ttps: //gitter.im/jupyter/jupyter
GitHub
ttps: //github.com/jupyter/help
StackOverflow:
ttps: //stackoverflow.com/questions/tagged/jupyter
Gruppo Google Jupyter for Education (per insegnanti che insegnano con Jupyter):
SUPPLEMENTI
Per ottenere il massimo dalla presentazione, è necessario eseguire ogni esempio di codice in parallelo
con la lettura della discussione corrispondente nel libro. Sulla pagina web del libro all'indirizzo
ttp: //www.deitel.com
noi forniamo:
Video introduttivi che mostrano come utilizzare gli esempi di codice con IPython e
Quaderni Jupyter. Introduciamo questi strumenti anche in ezione 1.5 .
h1
dS
Post del blog e aggiornamenti dei libri. Pagina 17
Per le istruzioni per il download, vedere la sezione Prima di iniziare che segue questa prefazione.
®
Facebook ( ttp: //www.deitel.com/deitelfan )
®
Twitter (@deitel)
®
LinkedIn ( TTP: //linkedin.com/company/deitel&associates )
®
Youtube ( ttp: //youtube.com/DeitelTV )
RICONOSCIMENTI
Ringraziamo Barbara Deitel per le lunghe ore dedicate alla ricerca in Internet su questo progetto.
Siamo fortunati ad aver lavorato con il team dedicato di professionisti dell'editoria di
Pearson. Apprezziamo gli sforzi e il tutoraggio di 25 anni del nostro amico e collega Mark
L. Taub, Vicepresidente del Pearson IT Professional Group. Mark e il suo team pubblicano il nostro
libri professionali, prodotti video LiveLessons e percorsi di apprendimento nel servizio Safari
( ttps: //learning.oreilly.com/ ). Sponsorizzano anche la nostra formazione online dal vivo di Safari
seminari. Julie Nahil ha diretto la produzione del libro. Abbiamo selezionato la copertina e Chuti
Prasertsith ha disegnato la copertina.
Desideriamo riconoscere gli sforzi dei nostri revisori. Patricia Byron Kimball e Meghan
Jacoby ha reclutato i revisori e ha gestito il processo di revisione. Aderendo a un programma serrato,
i revisori hanno esaminato il nostro lavoro, fornendo innumerevoli suggerimenti per migliorare il
accuratezza, completezza e tempestività della presentazione.
Revisori
Revisori di libri
dh
Economia, Università di San Diego Informatica, Università del Nebraska a Pagina 18
Omaha
José Antonio González Seco, IT
Risponderemo prontamente.
Benvenuto di nuovo nell'entusiasmante mondo opensource della programmazione Python. Ci auguriamo che tu
goditi questo sguardo allo sviluppo di applicazioni informatiche all'avanguardia con Python, IPython,
Notebook Jupyter, data science, AI, big data e cloud. Vi auguriamo grande successo!
sviluppatori dal 1992. Ha tenuto centinaia di corsi di programmazione a clienti del settore
a livello internazionale, inclusi Cisco, IBM, Siemens, Sun Microsystems (ora Oracle), Dell,
Fidelity, NASA presso il Kennedy Space Center, National Severe Storm Laboratory, White
Sands Missile Range, Rogue Wave Software, Boeing, Nortel Networks, Puma, iRobot e
molti altri. Lui e il suo coautore, il dottor Harvey M. Deitel, sono i bestseller al mondo
linguaggio di programmazione libri di testo / libri professionali / autori di video.
Dr. Harvey M. Deitel, Presidente e Chief Strategy Officer di Deitel & Associates, Inc., ha
58 anni di esperienza nell'informatica. Il dottor Deitel ha conseguito la laurea in ingegneria elettrica e la laurea magistrale
Ingegneria del MIT e un dottorato di ricerca. in matematica alla Boston University, ha studiato
computer in ciascuno di questi programmi prima che venissero scorporati dai programmi di informatica. Lui
ha una vasta esperienza di insegnamento universitario, compreso il guadagno di ruolo e il servizio come
Presidente del Dipartimento di Informatica al Boston College prima di fondare Deitel &
Associates, Inc., nel 1991 con suo figlio Paul. Le pubblicazioni dei Deitels hanno guadagnato
®
INFORMAZIONI SU DEITEL & ASSOCIATES, INC.
d
eitel & Associates, Inc., fondata da Paul Deitel e Harvey Deitel, è un'azienda internazionale Pagina 19
autore riconosciuto e organizzazione di formazione aziendale, specializzata in informatica
Attraverso la sua partnership editoriale di 44 anni con Pearson / Prentice Hall, Deitel & Associates,
Inc., pubblica libri di testo di programmazione all'avanguardia e libri professionali in formato cartaceo ed elettronico
formati di libri, corsi video LiveLessons (disponibili per l'acquisto all'indirizzo
Per contattare Deitel & Associates, Inc. e gli autori, o per richiedere una proposta in loco,
formazione istruita, scrivere a:
ttp: //www.deitel.com/training
ttps: //www.amazon.com
Gli ordini all'ingrosso da parte di aziende, governo, istituzioni militari e accademiche dovrebbero
essere posizionato direttamente con Pearson. Per maggiori informazioni visita
ttps: //www.informit.com/store/sales.aspx
hD
d
Pagina 20
Prima di iniziare
storia
Questa sezione contiene informazioni da esaminare prima di utilizzare questo libro. Pubblicheremo
opiche
aggiornamenti su: http://www.deitel.com .
guadagnando Pat
font e
ighlights componenti sullo schermo, come i nomi dei menu, in un carattere sansserif in grassetto.
Usiamo il corsivo per l'enfasi e il grassetto occasionalmente per l'enfasi forte.
ettings
http://www.deitel.com
Fare clic sul collegamento Scarica esempi per salvare il file sul computer locale. La maggior parte degli errori web
i browser posizionano il file nella cartella Download del tuo account utente. Quando il download
completa, individualo sul tuo sistema ed estrai la sua cartella di esempi nel tuo utente
La maggior parte dei sistemi operativi dispone di uno strumento di estrazione integrato. Puoi anche utilizzare uno strumento di archiviazione
come 7Zip ( www.7zip.org ) o WinZip ( www.winzip.com ).
Pagina 21
Singoli frammenti di codice nell'ambiente interattivo IPython.
Notebook Jupyter: un comodo ambiente interattivo basato sul browser Web in formato
che puoi scrivere ed eseguire codice e mescolare il codice con testo, immagini e
video.
La cartella degli esempi contiene una sottocartella per capitolo. Questi sono chiamati ch ##,
dove ## è il numero di capitolo a due cifre da 01 a 16, ad esempio ch01. Eccetto per
hapters 13 , 5 e 6 , la cartella di ogni capitolo contiene i seguenti elementi:
snippets_py: una cartella contenente i file di codice sorgente Python in cui ogni codice
lo snippet che presentiamo è separato dal successivo da una riga vuota. Puoi copiare e
incolla questi frammenti in IPython o nei nuovi notebook Jupyter che crei.
INSTALLAZIONE DI ANACONDA
Con questo libro usiamo la distribuzione Python di Anaconda, facile da installare. Viene fornito con
quasi tutto ciò di cui hai bisogno per lavorare con i nostri esempi, inclusi:
l'interprete IPython,
un server Jupyter Notebooks locale in modo da poter caricare ed eseguire i nostri notebook e
vari altri pacchetti software, come Spyder Integrated Development
Ambiente (IDE): in questo libro utilizziamo solo IPython e Jupyter Notebook.
Scarica il programma di installazione di Python 3.x Anaconda per Windows, macOS o Linux da:
1
C
S
Pagina 22
ttps: //www.anaconda.com/download/
Al termine del download, esegui il programma di installazione e segui le istruzioni sullo schermo.
Per assicurarti che Anaconda funzioni correttamente, non spostare i suoi file dopo averlo installato.
AGGIORNAMENTO ANACONDA
Quindi, assicurati che Anaconda sia aggiornato. Apri una finestra della riga di comando sul tuo
sistema come segue:
Su Linux, apri il terminale o la shell del tuo sistema (questo varia a seconda della distribuzione Linux).
Nella finestra della riga di comando del tuo sistema, esegui i seguenti comandi per aggiornare
Pacchetti installati di Anaconda alle loro ultime versioni:
GESTORI DI PACCHETTI
Il comando conda usato sopra richiama il gestore di pacchetti conda, uno dei
due gestori di pacchetti Python chiave che userete in questo libro. L'altro è pip . Pacchi
contenere i file necessari per installare una determinata libreria o strumento Python. Attraverso il libro,
userete conda per installare pacchetti aggiuntivi, a meno che quei pacchetti non siano disponibili
tramite conda, nel qual caso utilizzerai pip. Alcune persone preferiscono usare esclusivamente pip
poiché attualmente supporta più pacchetti. In caso di problemi durante l'installazione di un pacchetto
con conda, prova invece pip.
Prompt dei comandi di Anaconda o shell che hai aperto in precedenza, esegui quanto segue
1
comandi uno alla volta:
1
TTP: //github.com/matplotlib/jupytermatplotlib .
ttps: //developer.twitter.com/en/applyforaccess
Twitter esamina ogni applicazione. Al momento della stesura di questo articolo, sviluppatore personale
gli account venivano approvati immediatamente e le richieste di account aziendali
h
Y
Pagina 24
da diversi giorni a diverse settimane. L'approvazione non è garantita.
A causa delle differenze nel modo in cui i calcoli vengono eseguiti con i numeri in virgola mobile
(come –123,45, 7,5 o 0,0236937) nei sistemi operativi, potresti vedere minori
variazioni nelle uscite, specialmente nelle cifre a destra del punto decimale.
Quando mostriamo gli output che appaiono in finestre separate, ritagliamo le finestre su
rimuovere i loro bordi.
pythonforum.io
StackOverflow.com
ttps: //www.dreamincode.net/forums/forum/29python/
Inoltre, molti fornitori forniscono forum per i loro strumenti e librerie. La maggior parte delle biblioteche
che userete in questo libro sono gestiti e mantenuti su github.com. Qualche libreria
i manutentori forniscono supporto tramite la scheda Problemi nella pagina GitHub di una data libreria.
ht
Pagina 25
Se non riesci a trovare una risposta alle tue domande online, consulta la nostra pagina web per il
prenotare a
2
ttp: //www.deitel.com
2
Il nostro sito web sta subendo un importante aggiornamento. Se non trovi qualcosa di cui hai bisogno,
scrivici direttamente a [email protected] .
Ora sei pronto per iniziare a leggere Python per programmatori . Ci auguriamo che ti piaccia
libro!
io
dh
Pagina 26
Creare e testare un notebook Jupyter basato sul browser Web per l'esecuzione di codice Python.
Scopri quanto sono grandi i "big data" e quanto velocemente stanno diventando ancora più grandi.
scienza.
Contorno
.1 Introduzione
.2 Una rapida rassegna delle nozioni di base sulla tecnologia degli oggetti
.3 Python
.4 Sono le biblioteche!
.6.1 Il Cloud
.7.2 Scienza dei dati e Big Data fanno la differenza: casi d'uso
.9 Introduzione alla scienza dei dati: intelligenza artificiale: all'intersezione tra CS e scienza dei dati
.10 WrapUp
1.1 INTRODUZIONE
Benvenuti in Python, uno dei linguaggi di programmazione per computer più utilizzati al mondo
1
ttps: //pypl.github.io/PYPL.html (a partire da gennaio 2019).
Esamineremo la terminologia e i concetti della programmazione orientata agli oggetti . Imparerai perché
Python è diventato così popolare. Introdurremo la libreria standard Python e vari
librerie di dati che ti aiutano a evitare di "reinventare la ruota". Utilizzerai queste librerie per
creare oggetti software con cui interagire per eseguire compiti significativi con modesto
numero di istruzioni.
Successivamente, lavorerai attraverso tre testdrive che mostrano come eseguire il codice Python:
1h
C
Nel primo, utilizzerai IPython per eseguire le istruzioni Python in modo interattivo e
Pagina 28
Nel secondo, eseguirai una sostanziale applicazione Python che mostrerà un file
grafico a barre animato che riassume i tiri di un dado a sei facce man mano che si verificano. Vedrai " aw
f Large Numbers ”in azione. Nel nel capitolo 6 , costruirai questa applicazione con l' estensione
Libreria di visualizzazione Matplotlib.
In passato, la maggior parte delle applicazioni per computer venivano eseguite su computer autonomi (ovvero non collegati in rete
insieme). Le candidature odierne possono essere scritte con lo scopo di comunicare tra i
miliardi di computer nel mondo tramite Internet. Presenteremo il cloud e Internet di
Imparerai quanto sono grandi i "big data" e quanto velocemente stanno diventando ancora più grandi. Successivamente, lo faremo
presentare un caso di studio bigdata sull'app di navigazione mobile Waze, che utilizza molti file
tecnologie per fornire indicazioni stradali dinamiche che ti portino a destinazione il più rapidamente possibile
e nel modo più sicuro possibile. Mentre esaminiamo queste tecnologie, menzioneremo dove lo farai
usane molti in questo libro. Il capitolo si chiude con la nostra prima sezione Intro to Data Science
in cui discutiamo un'intersezione chiave tra informatica e scienza dei dati: artificiale
intelligenza.
1.2 UNA RAPIDA REVISIONE DEI BASI DELLA TECNOLOGIA DEGLI OGGETTI
Poiché le richieste di software nuovo e più potente sono in aumento, la creazione di software rapidamente,
correttamente ed economicamente è importante. Vengono gli oggetti , o più precisamente, gli oggetti delle classi
da, sono componenti software essenzialmente riutilizzabili . Ci sono oggetti data, oggetti tempo,
oggetti audio, oggetti video, oggetti automobili, oggetti persone, ecc. Quasi ogni nome può essere
ragionevolmente rappresentato come un oggetto software in termini di attributi (ad esempio, nome, colore e dimensione)
e comportamenti (ad esempio, calcolare, muoversi e comunicare). Gruppi di sviluppo software
può utilizzare un approccio di progettazione e implementazione modulare e orientato agli oggetti per essere molto di più
produttivi rispetto alle precedenti tecniche popolari come la "programmazione strutturata". Oggetto
Per aiutarti a capire gli oggetti e il loro contenuto, iniziamo con una semplice analogia. Supponiamo
vuoi guidare una macchina e farla andare più veloce premendo il suo pedale dell'acceleratore . Cosa deve
accadere prima che tu possa farlo? Ebbene, prima che tu possa guidare un'auto, qualcuno deve progettarla . UN
tipicamente inizia come disegni tecnici, simili ai progetti che descrivono il
1
oC
L
Pagina 29
segno di una casa. Questi disegni includono il progetto per un pedale dell'acceleratore. Il pedale
nasconde al guidatore i complessi meccanismi che rendono l'auto più veloce, proprio come il freno
il pedale “nasconde” i meccanismi che rallentano l'auto, e il volante “nasconde” il
meccanismi che fanno girare l'auto. Ciò consente alle persone con poca o nessuna conoscenza di come
i motori, i meccanismi dei freni e dello sterzo funzionano per guidare facilmente un'auto.
Proprio come non puoi cucinare i pasti nel progetto di una cucina, non puoi guidare una macchina
disegni tecnici. Prima di poter guidare un'auto, deve essere costruita dall'ingegneria
disegni che lo descrivono. Un'auto completa ha un vero pedale dell'acceleratore per farlo andare
più veloce, ma anche questo non è abbastanza: l'auto non accelera da sola (si spera!), quindi il
il conducente deve premere il pedale per accelerare l'auto.
Metodi e classi
Usiamo il nostro esempio di macchina per introdurre alcuni concetti chiave di programmazione orientata agli oggetti.
L'esecuzione di un'attività in un programma richiede un metodo . Il metodo ospita il programma
dichiarazioni che svolgono i suoi compiti. Il metodo nasconde queste istruzioni all'utente, proprio come
il pedale dell'acceleratore di un'auto nasconde al guidatore i meccanismi per far partire l'auto
Più veloce. In Python, un'unità di programma chiamata classe ospita l'insieme di metodi che eseguono il
compiti della classe. Ad esempio, una classe che rappresenta un conto bancario potrebbe contenere un metodo
Istanziazione
Proprio come qualcuno deve costruire un'auto dai suoi disegni tecnici prima che tu possa guidare un'auto,
devi costruire un oggetto di una classe prima che un programma possa eseguire i compiti che la classe svolge
metodi definiscono. Il processo per eseguire questa operazione è chiamato istanziazione . Si fa quindi riferimento a un oggetto
come istanza della sua classe.
Riutilizzo
Proprio come i disegni tecnici di un'auto possono essere riutilizzati molte volte per costruire molte auto, puoi farlo
riutilizzare una classe molte volte per costruire molti oggetti. Riutilizzo delle classi esistenti durante la creazione di nuove
lezioni e programmi consentono di risparmiare tempo e fatica. Il riutilizzo ti aiuta anche a creare file più affidabili e
sistemi efficaci perché le classi e i componenti esistenti spesso sono stati sottoposti a numerosi interventi
test , debug e ottimizzazione delle prestazioni . Proprio come la nozione di parti intercambiabili era
cruciali per la rivoluzione industriale, le classi riutilizzabili sono fondamentali per la rivoluzione del software
che è stato stimolato dalla tecnologia degli oggetti.
In Python, in genere utilizzerai un approccio buildingblock per creare i tuoi programmi. Evitare
reinventando la ruota, utilizzerai i pezzi esistenti di alta qualità ove possibile. Questo software
Quando guidi una macchina, premendo il suo pedale del gas invia un messaggio all'auto per eseguire un compito—
Pagina 30
cioè andare più veloce. Allo stesso modo, invii messaggi a un oggetto . Ogni messaggio è implementato
come una chiamata al metodo che indica a un metodo dell'oggetto di eseguire il suo compito. Ad esempio, un programma
potrebbe chiamare il metodo di deposito di un oggetto conto bancario per aumentare il saldo del conto.
Un'auto, oltre ad avere la capacità di svolgere compiti, ha anche attributi , come il suo colore, il suo
numero di porte, quantità di benzina nel serbatoio, velocità attuale e record di miglia totali
guidato (cioè, la sua lettura del contachilometri). Come le sue capacità, gli attributi dell'auto sono rappresentati come
parte del suo design nei suoi diagrammi ingegneristici (che, ad esempio, includono un contachilometri e un
indicatore livello carburante). Mentre guidi un'auto reale, questi attributi vengono trasportati insieme all'auto. Ogni
l'auto mantiene i propri attributi. Ad esempio, ogni macchina sa quanto gas c'è nel proprio gas
Un oggetto, allo stesso modo, ha attributi che porta con sé quando viene utilizzato in un programma. Questi
gli attributi sono specificati come parte della classe dell'oggetto. Ad esempio, un oggetto conto bancario ha un'estensione
attributo saldo che rappresenta la quantità di denaro nel conto. Ogni conto in banca
l'oggetto conosce il saldo del conto che rappresenta, ma non i saldi dell'altro
conti in banca. Gli attributi sono specificati dalle variabili di istanza della classe . Una classe
(e i suoi oggetti) attributi e metodi sono intimamente correlati, quindi le classi racchiudono insieme i loro
attributi e metodi.
Eredità
Una nuova classe di oggetti può essere creata comodamente per ereditarietà , la nuova classe (chiamata
un oggetto della classe "decappottabile" è certamente un oggetto della classe più generale "automobile",
ma più specificamente , il tetto può essere alzato o abbassato.
Forse, come molti programmatori, accenderai semplicemente il computer e inizierai a digitare. Questo
l'approccio può funzionare per piccoli programmi (come quelli che presentiamo nei primi capitoli del
book), ma se ti venisse chiesto di creare un sistema software per controllare migliaia di file
sportelli automatici per una grande banca? O supponiamo che ti sia stato chiesto di lavorare in una squadra
di 1.000 sviluppatori di software che costruiscono la prossima generazione del controllo del traffico aereo degli Stati Uniti
sistema? Per progetti così grandi e complessi, non dovresti semplicemente sederti e iniziare a scrivere
programmi.
Per creare le migliori soluzioni, è necessario seguire un processo di analisi dettagliato per la determinazione
i requisiti del progetto (ovvero definire cosa dovrebbe fare il sistema), quindi
sviluppare un design che li soddisfi (cioè, specificando come il sistema dovrebbe farlo). Idealmente,
dovrai seguire questo processo e rivedere attentamente il progetto (e far esaminare il tuo progetto
y altri professionisti del software) prima di scrivere qualsiasi codice. Se questo processo comporta l'analisi
Pagina 31
sviluppato da Guido van Rossum del National Research Institute for Mathematics e
Informatica ad Amsterdam.
Python è diventato rapidamente uno dei linguaggi di programmazione più popolari al mondo. Nevica
2
particolarmente popolare per l'informatica educativa e scientifica , e recentemente ha superato il
4
3, ,5
linguaggio di programmazione R come il linguaggio di programmazione datascience più popolare.
7
6, ,
Ecco alcuni motivi per cui Python è popolare e tutti dovrebbero considerare di impararlo:
8
2
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
3
ttps: //www.kdnuggets.com/2017/08/pythonovertakesrleader
nalyticsdatascience.html .
4
ttps: //www.rbloggers.com/datasciencejobreport2017rpasses
asbutpythonleavesthembothbehind / .
5
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
6
TTP: //dbader.org/blog/whylearnpython .
7
ttps: //simpleprogrammer.com/2017/01/18/7reasonswhyyoushould
guadagnapython / .
8
TTP: //www.oreilly.com/ideas/5thingstowatchinpythonin2017 .
È open source, gratuito e ampiamente disponibile con una massiccia comunità opensource.
È più facile da imparare rispetto a linguaggi come C, C ++, C # e Java, consentendo ai principianti e
sviluppatori professionisti per diventare rapidamente operativi.
9
È ampiamente utilizzato nell'istruzione.
9
Tollervey, N., Python in Education: Teach, Learn, Program (O'Reilly Media, Inc.,
2015).
hblS
un'
Migliora la produttività degli sviluppatori con ampie librerie standard e di terze parti
Pagina 32
librerie opensource, in modo che i programmatori possano scrivere codice più velocemente ed eseguire attività complesse
con codice minimo. Diremo di più su questo in ezione 1.4.
0
ttps: //en.wikipedia.org/wiki/Python_ (programming_language) .
Semplifica la programmazione simultanea: con asyncio e async / await, sei in grado di scrivere
1
codice simultaneo a thread singolo , semplificando notevolmente i processi intrinsecamente complessi di
2
scrivere, eseguire il debug e mantenere quel codice.
1
ttps: //docs.python.org/3/library/asyncio.html .
2
ttps: //www.oreilly.com/ideas/5thingstowatchinpythonin
017 .
Ci sono molte funzionalità per migliorare le prestazioni di Python.
Viene utilizzato per creare qualsiasi cosa, da semplici script ad app complesse con un numero enorme di file
3
utenti, come Dropbox, YouTube, Reddit, Instagram e Quora.
3
ttps: //www.hartmannsoftware.com/Blog/Articles_from_Software_Fans/Mos
amousSoftwareProgramsWritteninPython .
È popolare nell'intelligenza artificiale, che sta godendo di una crescita esplosiva, in parte a causa di
4
È ampiamente utilizzato nella comunità finanziaria.
4
Kolanovic, M. e R. Krishnamachari, Big Data and AI Strategies: Machine Learning
e Approccio alternativo ai dati per investire (JP Morgan, 2017).
C'è un vasto mercato del lavoro per i programmatori Python in molte discipline,
soprattutto nelle posizioni orientate alla datascienza, e i lavori Python sono tra i più alti
5, 6
pagato di tutti i lavori di programmazione.
5
ttps: //www.infoworld.com/article/3170838/developer/getpaid10
rogramminglanguagestolearnin2017.html .
6
ttps: //medium.com/@ChallengeRocket/top10ofprogramming
C2S
1hptF
Pagina 33
anguageswiththehighestsalariesin20174390f468256e .
sezione 1.5.1 ) e Jupyter Notebook (introdotti in sezione 1.5.3 ). Anaconda include anche
altri pacchetti software e librerie comunemente usati nella programmazione e nei dati Python
science, permettendoti di concentrarti su Python e sulla scienza dei dati, piuttosto che sull'installazione del software
7
problemi. L'interprete IPython ha funzionalità che ti aiutano a esplorare, scoprire e sperimentare
con Python, la Python Standard Library e l'ampio set di librerie di terze parti.
7
ttps: //ipython.org/ .
Zen di Python
Aderiamo a The Zen of Python di Tim Peters , che riassume il creatore di Python Guido van
Principi di progettazione di Rossum per il linguaggio. Questo elenco può essere visualizzato in IPython con l'estensione
comando importa questo. Lo Zen di Python è definito nella proposta di miglioramento di Python
(PEP) 20. “Un PEP è un documento di progettazione che fornisce informazioni alla comunità Python, o
8
che descrive una nuova funzionalità per Python o i suoi processi o ambiente. "
8
ttps: //www.python.org/dev/peps/pep0001/ .
di codice originale, un processo costoso e che richiede tempo, puoi semplicemente creare un oggetto di un file
classe di libreria preesistente, che accetta solo una singola istruzione Python. Quindi, le biblioteche aiuteranno
si eseguono compiti significativi con modeste quantità di codice. In questo libro userete un ampio
gamma di librerie standard Python, librerie di datascience e librerie di terze parti.
La libreria standard Python fornisce funzionalità avanzate per l'elaborazione di dati di testo / binari,
matematica, programmazione in stile funzionale, accesso a file / directory, persistenza dei dati, dati
compressione / archiviazione, crittografia, servizi del sistema operativo, programmazione concorrente,
comunicazione tra processi, protocolli di rete, JSON / XML / altri formati di dati Internet,
multimedia, internazionalizzazione, GUI, debugging, profiling e altro. La tabella seguente
elenca alcuni dei moduli della libreria standard Python che usiamo negli esempi.
1S
lh
Alcuni dei moduli della libreria standard Python che usiamo nel libro
Pagina 34
librerie di sorgenti sviluppate dalla sua comunità opensource. Uno dei nostri obiettivi è creare
esempi e casi di studio di implementazione che ti danno un coinvolgente, stimolante e
divertente introduzione alla programmazione Python, coinvolgendoti anche nei dati manuali
scienza, biblioteche chiave di datascience e altro ancora. Rimarrai stupito dai compiti sostanziali che svolgi
può essere eseguito in poche righe di codice. La tabella seguente elenca vari dati popolari
biblioteche scientifiche. Userai molti di questi mentre lavori attraverso i nostri esempi di datascience.
Per la visualizzazione, useremo Matplotlib, Seaborn e Folium, ma ce ne sono molti altri. Per un
bel riepilogo delle librerie di visualizzazione Python vedere ttp: //pyviz.org/ .
hS
NumPy (Numerical Python) - Python non ha una struttura dati di array incorporata.
Utilizza elenchi, che sono convenienti ma relativamente lenti. NumPy fornisce il massimo
struttura dei dati ndarray delle prestazioni per rappresentare elenchi e matrici, e anche
SciPy (Scientific Python) - Costruito su NumPy, SciPy aggiunge routine per scientific
Panda: una libreria estremamente popolare per la manipolazione dei dati. Pandas fa
uso abbondante di ndarray di NumPy. Le sue due strutture dati chiave sono Series (one
Visualizzazione
Seaborn— Una libreria di visualizzazione di livello superiore costruita su Matplotlib. Seaborn aggiunge un file
aspetto più gradevole, visualizzazioni aggiuntive e consente di creare visualizzazioni
con meno codice.
ere— Una delle librerie di deeplearning più facili da usare. Keras corre sopra
K
P
Keras ne f lui asiest o se eep guadagnare ibrari epoche uns n operazione
f Pagina 36
TensorFlow funziona con GPU (unità di elaborazione grafica) o TPU personalizzate di Google
(Unità di elaborazione tensoriale) per le prestazioni. TensorFlow è importante nell'IA e grande
analisi dei dati, dove le richieste di elaborazione sono enormi. Userai la versione di Keras
che è integrato in TensorFlow.
NLTK (Natural Language Toolkit) : utilizzato per l'elaborazione del linguaggio naturale (NLP)
compiti.
TextBlob: una libreria di elaborazione del testo NLP orientata agli oggetti costruita su NLTK e
librerie di pattern NLP. TextBlob semplifica molte attività di NLP.
Gensim: simile a NLTK. Comunemente utilizzato per creare un indice per una raccolta di
documenti, quindi determina quanto è simile un altro documento a ciascuno di quelli nel file
indice.
9
Prima di leggere questa sezione, seguire le istruzioni nella sezione Prima di iniziare per l'installazione
la distribuzione Anaconda Python, che contiene l'interprete IPython.
In modalità script , eseguirai il codice caricato da un file con estensione .py (short
l-rotleudO
.K
1T
per Python). Tali file sono chiamati script o programmi e generalmente sono più lunghi di
Pagina 37
Quindi, imparerai come utilizzare l'ambiente basato su browser noto come Jupyter Notebook
0
per scrivere ed eseguire codice Python.
0
Jupyter supporta molti linguaggi di programmazione installando i loro "kernel". Per più
informazioni vedere TTP: //github.com/jupyter/jupyter/wiki/Jupyterkernels .
Su Linux, apri il terminale o la shell del tuo sistema (questo varia a seconda della distribuzione Linux).
Nella finestra di comando, tipo ipython, quindi premere Invio (o Return ). Vedrai il testo
In 1]:
Il testo "In [1]:" è un prompt , che indica che IPython è in attesa del tuo input. Puoi
genere ? per chiedere aiuto o inizia a inserire snippet, come farai momentaneamente.
Valutazione delle espressioni
In modalità interattiva, puoi valutare espressioni:
In [1]: 45 + 72
Uscita [1]: 117
In 2]:
hC
2
Dopo aver digitato 45 + 72 e premuto Invio , IPython legge lo snippet, lo valuta e lo stampa
Pagina 38
1
il suo risultato in Out [1]. Quindi IPython visualizza il prompt In [2] per mostrare che sta aspettando
per inserire il secondo snippet. Per ogni nuovo snippet, IPython aggiunge 1 al numero nel file
parentesi quadre. Ogni prompt In [1] nel libro indica che abbiamo iniziato un nuovo
1
Nel prossimo capitolo, vedrai che ci sono alcuni casi in cui Out [] non è visualizzato.
In [2]: 5 * ( 12.7 4 ) / 2
Uscita [2]: 21,75
Python usa l'asterisco (*) per la moltiplicazione e la barra (/) per la divisione. Come in
matematica, le parentesi forzano l'ordine di valutazione, quindi l'espressione tra parentesi (12.7
4) valuta per primo, dando 8.7. Successivamente, 5 * 8,7 valuta dando 43,5. Quindi, 43,5 / 2
valuta, dando il risultato 21.75, che IPython mostra in Out [2]. Numeri interi, tipo
5, 4 e 2, sono chiamati numeri interi . Numeri con punti decimali, come 12,7, 43,5 e 21,75,
sono chiamati numeri in virgola mobile .
subito.
Digita la sequenza di tasti <Ctrl> + d (o <control> + d ). Verrà visualizzato il prompt "Do you
vuoi davvero uscire ([y] / n)? ". Le parentesi quadre intorno a y indicano che è
la risposta predefinita: premendo Invio si invia la risposta predefinita e si esce.
capitolo 6 . L' estensione .py indica che il file contiene codice sorgente Python. Il copione
visualizzazione che rappresenta graficamente dinamicamente le frequenze di ciascuna faccia della matrice.
Troverai lo script nella cartella del codice sorgente ch01 del libro. Nella sezione Prima di iniziare
hai estratto la cartella degli esempi nella cartella Documenti del tuo account utente. Ogni capitolo
2C
ha una cartella contenente il codice sorgente di quel capitolo. La cartella si chiama ch ##, dove ## è un file
Pagina 39
numero del capitolo a due cifre da 01 a 17. Per prima cosa, apri la finestra della riga di comando del tuo sistema.
Quindi, usa il comando cd ("cambia directory") per passare alla cartella ch01:
premere Invio .
Per eseguire lo script, digita il seguente comando nella riga di comando, quindi premi Invio :
Lo script mostra una finestra che mostra la visualizzazione. I numeri 6000 e 1 lo dicono
scrivi il numero di volte in cui tirare i dadi e quanti dadi lanciare ogni volta. In questo caso, lo faremo
aggiorna la tabella 6000 volte per 1 dado alla volta.
Per un dado a sei facce, i valori da 1 a 6 dovrebbero ciascuno presentarsi con "uguale probabilità": il
th
la probabilità di ciascuno è 1/6 o circa il 16,667%. Se tiriamo un dado 6000 volte, ce lo aspetteremmo
1000 di ogni faccia. Come il lancio di una moneta, il lancio del dado è casuale , quindi potrebbero esserci delle facce con
meno di 1000, alcuni con 1000 e altri con più di 1000. Abbiamo preso lo schermo
acquisisce di seguito durante l'esecuzione dello script. Questo script utilizza valori di fustella generati casualmente,
quindi i tuoi risultati saranno diversi. Sperimenta con lo script cambiando il valore da 1 a 100, 1000
e 10000. Notare che all'aumentare del numero di tiri di dado, le frequenze si azzerano
16,667%. Questo è un fenomeno del " aw di numeri grandi. "
Creazione di script
In genere, crei il tuo codice sorgente Python in un editor che ti consente di digitare il testo. Utilizzando
l'editor, digiti un programma, apporti le correzioni necessarie e lo salvi sul tuo computer.
Gli ambienti di sviluppo integrati (IDE) forniscono strumenti che supportano l'intero
processo di sviluppo software, come editor, debugger per individuare errori logici che causano
Pagina 40
programmi da eseguire in modo errato e altro ancora. Alcuni popolari IDE Python includono Spyder (che
viene fornito con Anaconda), PyCharm e Visual Studio Code.
dividere per zero (un'operazione illegale in Python). Ciò causerebbe la visualizzazione di un file
messaggio di errore. Se ciò si è verificato in uno script, dovresti tornare all'editor, fare il necessario
Errori come la divisione per zero si verificano durante l'esecuzione di un programma, quindi vengono chiamati errori di runtime o
errori di esecuzione . Errori irreversibili di runtime causano la chiusura immediata dei programmi
senza aver svolto con successo il proprio lavoro. Gli errori di runtime non irreversibili consentono
programmi da eseguire fino al completamento, producendo spesso risultati errati.
Arriva la distribuzione di Anaconda Python che hai installato nella sezione Prima di iniziare
con Jupyter Notebook, un ambiente interattivo basato su browser in cui puoi farlo
scrivere ed eseguire codice e mescolare il codice con testo, immagini e video. Quaderni Jupyter
sono ampiamente utilizzati nella comunità di datascience in particolare e nella più ampia scienza
comunità in generale. Sono il mezzo preferito per eseguire analisi dei dati basate su Python
Per tua comodità, tutto il codice sorgente del libro è fornito anche in Jupyter Notebooks
che puoi semplicemente caricare ed eseguire. In questa sezione utilizzerai l' interfaccia JupyterLab ,
che ti consente di gestire i file del tuo taccuino e altri file usati dai tuoi taccuini (come
immagini e video). Come vedrai, JupyterLab rende anche conveniente scrivere codice, eseguire
Vedrai che la codifica in un notebook Jupyter è simile a lavorare con IPython, infatti,
I notebook Jupyter utilizzano IPython per impostazione predefinita. In questa sezione creerai un taccuino, aggiungi il file
Per aprire JupyterLab, passa alla cartella degli esempi ch01 nel tuo Terminale, shell o
Prompt dei comandi di Anaconda (come in ezione 1.5.2), digita il seguente comando, quindi premi
Invio (o ritorno ):
jupyter lab
Questo esegue il server Jupyter Notebook sul tuo computer e apre JupyterLab nel tuo file
browser web predefinito, che mostra il contenuto della cartella ch01 nella scheda Browser file
Pagina 41
Il server Jupyter Notebook ti consente di caricare ed eseguire Jupyter Notebooks nel tuo web
browser. Dalla scheda File JupyterLab, puoi fare doppio clic sui file per aprirli a destra
lato della finestra in cui è attualmente visualizzata la scheda Launcher. Ogni file che apri
appare come una scheda separata in questa parte della finestra. Se chiudi accidentalmente il browser,
puoi riaprire JupyterLab inserendo il seguente indirizzo nel tuo browser web
Nella scheda Launcher sotto Notebook, fai clic sul pulsante Python 3 per creare un nuovo Jupyter
Notebook denominato Untitled.ipynb in cui è possibile inserire ed eseguire il codice Python 3. Il
l'estensione file .ipynb è l'abbreviazione di IPython Notebook, il nome originale di Jupyter
Taccuino.
Rinominare il notebook
Rinomina Untitled.ipynb come TestDrive.ipynb:
1. Fare clic con il pulsante destro del mouse sulla scheda Untitled.ipynb e selezionare Rinomina blocco note.
Pagina 42
Valutazione di un'espressione
L'unità di lavoro in un taccuino è una cella in cui puoi inserire frammenti di codice. Per impostazione predefinita, un file
il nuovo taccuino contiene una cella, il rettangolo nel taccuino TestDrive.ipynb, ma tu
può aggiungere altro. A sinistra della cella, la notazione []: è dove verrà visualizzato il Jupyter Notebook
il numero dello snippet della cella dopo aver eseguito la cella. Fare clic nella cella, quindi digitare l'espressione
45 + 72
Per eseguire il codice della cella corrente, digita Ctrl + Invio (o control + Invio ). JupyterLab viene eseguito
il codice in IPython, quindi visualizza i risultati sotto la cella:
prima cella del taccuino: aggiunge una nuova cella sotto quella corrente:
5 * (12,7 4) / 2
Pagina 43
il notebook, seleziona il menu File in JupyterLab (non nella parte superiore della finestra del browser),
quindi selezionare Salva blocco appunti.
Affinché possiamo mostrarti come caricare un notebook esistente ed eseguire le sue celle, resettiamo il file
pulsante. Il comando precedente è utile anche ogni volta che desideri rieseguire un blocco note
frammenti. Il notebook dovrebbe ora apparire come segue:
Dal menu File, seleziona Salva blocco appunti, quindi fai clic sulla X della scheda TestDrive.ipynb
Quando avvii JupyterLab dalla cartella degli esempi di un determinato capitolo, sarai in grado di aprire
taccuini da quella cartella o da una delle sue sottocartelle. Una volta individuato un taccuino specifico,
fare doppio clic per aprirlo. Apri di nuovo il notebook TestDrive.ipynb ora. Una volta a
notebook è aperto, puoi eseguire ogni cella individualmente, come hai fatto in precedenza in questa sezione, o
puoi eseguire l'intero taccuino in una volta. A tale scopo, dal menu Esegui selezionare Esegui tutto
Cellule. Il notebook eseguirà le celle in ordine, visualizzando l'output di ciascuna cella al di sotto di quello
Pagina 44
cellula.
Chiusura di JupyterLab
Quando hai finito con JupyterLab, puoi chiudere la sua scheda del browser, quindi nel Terminale, shell
o Prompt dei comandi di Anaconda da cui hai avviato JupyterLab, digita Ctrl + c (o
control + c ) due volte.
Suggerimenti JupyterLab
Mentre lavori in JupyterLab, potresti trovare utili questi suggerimenti:
Se devi inserire ed eseguire molti snippet, puoi eseguire la cella corrente e aggiungere
uno nuovo sotto di esso digitando Maiusc + Invio , invece di Ctrl + Invio (o control + Invio ).
Man mano che entri nei capitoli successivi, alcuni degli snippet che inserirai in Jupyter Notebooks
conterrà molte righe di codice. Per visualizzare i numeri di riga all'interno di ogni cella, selezionare Mostra
ttps: //jupyterlab.readthedocs.io/en/stable/index.html
Per una rapida panoramica, fare clic su Panoramica in PER INIZIARE. Inoltre, sotto USER
GUIDA leggi le introduzioni a The JupyterLab Interface, Working with Files, Text
1.6.1 Il cloud
Sempre più computer oggi vengono eseguiti "nel cloud", ovvero distribuiti in tutto il
Internet in tutto il mondo. Molte app che usi quotidianamente dipendono dai servizi basati su cloud che
utilizzare enormi cluster di risorse informatiche (computer, processori, memoria, unità disco,
ecc.) e database che comunicano tra loro su Internet e con le app che utilizzi.
Un servizio che fornisce l'accesso a se stesso su Internet è noto come servizio web . Come te
vedete, l'utilizzo di servizi basati su cloud in Python spesso è semplice come creare un oggetto software e
interagendo con esso. Quell'oggetto utilizza quindi i servizi Web che si connettono al cloud sul tuo
per conto.
1C
h
Nel hapters 12 e 6 , utilizzerai i servizi web di Twitter (tramite la libreria Python Tweepy) per
Pagina 45
ottenere informazioni su utenti Twitter specifici, cercare i tweet degli ultimi sette giorni
Nel hapters 11 e 2 , utilizzerai la libreria Python TextBlob per tradurre il testo tra
le lingue. Dietro le quinte, TextBlob utilizza il servizio web di Google Translate per eseguire
quelle traduzioni.
Nel Nel capitolo 13 , utilizzerai Text to Speech, Speech to Text e Translate di IBM Watson
Servizi. Implementerai un'app di traduzione per assistente di viaggio che ti consente di parlare
una domanda in inglese, trascrive il discorso in testo, traduce il testo in spagnolo e
parla il testo spagnolo. L'app ti consente quindi di pronunciare una risposta in spagnolo (nel caso tu
non parlo spagnolo, forniamo un file audio che puoi utilizzare), trascrive il discorso in testo,
traduce il testo in inglese e parla la risposta in inglese. Tramite demo IBM Watson,
sperimenterai anche molti altri servizi basati su cloud Watson in formato capitolo 13 .
Nel al capitolo 16 , lavorerai con il servizio HDInsight di Microsoft Azure e altri servizi Web di Azure
servizi mentre si implementano applicazioni bigdata utilizzando Apache Hadoop e Spark. Azzurro
Nel al capitolo 16 , utilizzerai il servizio web Dweet.io per simulare una connessione a Internet
termostato che pubblica online le letture della temperatura. Utilizzerai anche un file webbased
servizio per creare un “cruscotto” che visualizzi le letture di temperatura nel tempo e
ti avverte se la temperatura diventa troppo bassa o troppo alta.
Nel al capitolo 16 , utilizzerai una dashboard basata sul web per visualizzare un flusso simulato di live
dati del sensore dal servizio web PubNub. Creerai anche un'app Python che visualizza un file
PubNub simulava il flusso di variazioni del prezzo delle azioni in tempo reale.
Nella maggior parte dei casi, creerai oggetti Python che interagiscono con i servizi web per tuo conto,
Mashup
La metodologia di sviluppo delle applicazioni dei mashup consente di sviluppare rapidamente
1
hC
ouTube.
Pagina 46
Internet non è più solo una rete di computer , è un Internet of Things (IoT) . UN
cosa è qualsiasi oggetto con un indirizzo IP e la capacità di inviare, e in alcuni casi ricevere, dati
automaticamente su Internet. Queste cose includono:
rilevatori di radiazioni,
termostati intelligenti che regolano la temperatura della stanza in base alle previsioni meteorologiche e all'attività
in casa e
elettrodomestici intelligenti.
Secondo statista.com, oggi sono già in uso oltre 23 miliardi di dispositivi IoT e
2
potrebbero esserci oltre 75 miliardi di dispositivi IoT nel 2025.
2
ttps: //www.statista.com/statistics/471264/iotnumberofconnected
evicesworldwide / .
Secondo IBM, vengono creati circa 2,5 quintilioni di byte (2,5 exabyte ) di dati
3 4
ogni giorno e il 90% dei dati mondiali è stato creato negli ultimi due anni. Secondo IDC, il
la fornitura globale di dati raggiungerà i 175 zettabyte (pari a 175 trilioni di gigabyte o 175 miliardi
5
terabyte) all'anno entro il 2025. Considera i seguenti esempi di vari dati popolari
le misure.
3
ttps: //www.ibm.com/blogs/watson/2016/06/welcometotheworldofa
/.
hdY
2io
4 Pagina 47
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
rl12345usen20170719.pdf .
5
ttps: //www.networkworld.com/article/3325397/storage/idcexpect
75zettabytesofdataworldwideby2025.html .
egabyte (MB)
20
Un megabyte equivale a circa un milione (in realtà 2) byte. Molti dei file che usiamo quotidianamente
6
File audio MP3: gli MP3 di alta qualità vanno da 1 a 2,4 MB al minuto.
6
ttps: //www.audiomountain.com/tech/audiofilesize.html .
Foto: le foto in formato JPEG scattate con una fotocamera digitale possono richiedere circa 8-10 MB ciascuna
foto.
Video: le fotocamere degli smartphone possono registrare video a varie risoluzioni. Ogni minuto di
il video può richiedere molti megabyte di spazio di archiviazione. Ad esempio, su uno dei nostri iPhone, il file
L'app per le impostazioni della fotocamera segnala che richiede un video 1080p a 30 framespersecond (FPS)
Gigabyte (GB)
30
Un gigabyte corrisponde a circa 1000 megabyte (in realtà 2 byte). Un DVD duallayer può memorizzare fino a
7
8,5 GB , che si traduce in:
7
ttps: //en.wikipedia.org/wiki/DVD .
8
Gli attuali dischi Ultra HD Bluray con la più alta capacità possono memorizzare fino a 100 GB di video.
Lo streaming di un film 4K può utilizzare tra 7 e 10 GB all'ora (altamente compresso).
8
TTP: //en.wikipedia.org/wiki/Ultra_HD_Bluray .
Terabyte (TB)
40
Un terabyte è di circa 1000 gigabyte (in realtà 2 byte). Unità disco recenti per desktop
M
9
2h
1
w
9
I computer sono disponibili in dimensioni fino a 15 TB, che è equivalente a:
Pagina 48
9
ttps: //www.zdnet.com/article/worldsbiggestharddrivemeet
esterndigitals15tbmonster / .
Nimbus Data ora ha la più grande unità a stato solido (SSD) a 100 TB, che può memorizzare 6,67
0
volte i 15 TB di esempi di audio, foto e video sopra elencati.
0
ttps: //www.cinema5d.com/nimbusdata100tbssdworldslargestssd/ .
cinque anni ci saranno oltre 50 miliardi di dispositivi connessi a Internet (la maggior parte
attraverso l'Internet of Things, di cui discutiamo in ezioni 1.6.2 e 6.8 ) ed entro il 2020
2
produrremo 1,7 megabyte di nuovi dati ogni secondo per ogni persona sul pianeta .
3
Con i numeri di oggi (circa 7,7 miliardi di persone ) , questo è circa
1
ttps: //public.dhe.ibm.com/common/ssi/ecm/wr/en/wrl12345usen/watson
rl12345usen20170719.pdf .
2
ttps: //analyticsweek.com/content/bigdatafacts/ .
3
ttps: //en.wikipedia.org/wiki/World_population .
1.123 exabyte al giorno, ovvero 1,123 zettabyte (ZB) al giorno (ogni zettabyte corrisponde a circa 1000
exabyte).
È l'equivalente di oltre 5,5 milioni di ore (oltre 600 anni) di video 4K ogni giorno o
c132hw
S
Per un divertente senso in tempo reale dei big data, dai un'occhiata
Ricerche su Google.
Tweets.
È possibile fare clic su ciascuna statistica per visualizzare in dettaglio e ottenere ulteriori informazioni. Ad esempio, dicono finita
Nel 2018 sono stati inviati 250 miliardi di tweet.
Ogni ora, gli utenti di YouTube caricano 24.000 ore di video e quasi 1 miliardo di ore
4
i video vengono guardati su YouTube ogni giorno.
4
ttps: //www.brandwatch.com/blog/youtubestats/ .
Ogni secondo, ci sono 51.773 GB (o 51.773 TB) di traffico Internet, 7894 tweet inviati,
5
64.332 ricerche su Google e 72.029 video di YouTube visualizzati.
5
TTP: //www.internetlivestats.com/onesecond .
6 7
Su Facebook ogni giorno ci sono 800 milioni di " Mi piace", vengono inviati 60 milioni di emoji e
ci sono oltre due miliardi di ricerche degli oltre 2,5 trilioni di post di Facebook da quando il
8
inizio del sito.
6
ttps: //newsroom.fb.com/news/2017/06/twobillionpeoplecoming
ogetheronfacebook .
7 ttps: //mashable.com/2017/07/17/facebookworldemojiday/ .
8
ttps: //techcrunch.com/2016/07/27/facebookwillmakeyoutalk/ .
Nel giugno 2017, Will Marshall, CEO di Planet, ha affermato che la società ha 142 satelliti
immagine la massa terrestre dell'intero pianeta una volta al giorno. Aggiungono un milione di immagini e sette
TB di nuovi dati ogni giorno. Insieme ai loro partner, stanno utilizzando l'apprendimento automatico
quei dati per migliorare i raccolti, vedere quante navi ci sono in un dato porto e seguire
tun'
3h
eforestazione. Per quanto riguarda la deforestazione dell'Amazzonia, ha detto: "Una volta ci svegliavamo
Pagina 50
dopo pochi anni e in Amazzonia c'è un grosso buco. Ora possiamo letteralmente contare ogni
9
albero del pianeta ogni giorno. "
9
ttps: //www.bloomberg.com/news/videos/20170630/learningfrom
Domo, Inc. ha una bella infografica chiamata "I dati non dormono mai 6.0" che mostra la quantità di dati
0
generato ogni minuto , inclusi:
0
TTP: //www.domo.com/learn/dataneversleeps6 .
operazioni al secondo) . Nella prima metà degli anni '90, le velocità dei supercomputer più elevate erano
9 12
misurata in gigaflop (10 FLOP). Alla fine degli anni '90, Intel ha prodotto il primo teraflop (10
FLOPS) supercomputer. All'inizio degli anni 2000, le velocità raggiunsero centinaia di teraflop,
15
poi, nel 2008, IBM ha rilasciato il primo supercomputer petaflop (10 FLOPS). Attualmente, il
supercomputer più veloce: l'IBM Summit, situato presso il Dipartimento dell'Energia (DOE) Oak
1
Ridge National Laboratory (ORNL): è in grado di eseguire 122,3 petaflop.
1
ttps: //en.wikipedia.org/wiki/FLOPS .
L'elaborazione distribuita può collegare migliaia di personal computer tramite Internet per la produzione
ancora più FLOP. Alla fine del 2016, la rete Folding @ home, una rete distribuita in cui
le persone offrono volontariamente le risorse dei loro personal computer per l'uso nella ricerca sulle malattie e sui farmaci
2 43
pd
43h
2 3
esign — era capace di oltre 100 petaflop. Aziende come IBM stanno ora lavorando
Pagina 51
18 4
supercomputer in grado di eseguire exaflops (10 FLOPS).
2
ttps: //en.wikipedia.org/wiki/Folding@home .
3 ttps: //en.wikipedia.org/wiki/FLOPS .
4
ttps: //www.ibm.com/blogs/research/2017/06/supercomputingweather
odelexascale / .
numero è così straordinario che in un secondo, teoricamente, un computer quantistico potrebbe farlo
incredibilmente più calcoli rispetto al totale che sono stati fatti da tutti i computer dopo il
apparve il primo computer al mondo. Questa potenza di calcolo quasi inimmaginabile potrebbe provocare
caos con criptovalute basate su blockchain come Bitcoin. Gli ingegneri stanno già ripensando
6
blockchain per prepararsi a tali massicci aumenti della potenza di calcolo.
5
ttps: //medium.com/@n.biedrzycki/onlygodcancountthatfastthe
orldofquantumcomputing406a0a91fcf4 .
6
ttps: //singularityhub.com/2017/11/05/isquantumcomputingan
xistentialthreattoblockchaintechnology / .
La storia del potere del supercalcolo è che alla fine si fa strada dalla ricerca
laboratori, dove sono state spese straordinarie somme di denaro per ottenere tali prestazioni
Il costo della potenza di elaborazione continua a diminuire, soprattutto con il cloud computing. Persone usate
per porre la domanda: "Di quanta potenza di calcolo ho bisogno sul mio sistema per gestire il mio
esigenze di elaborazione di picco ? " Oggi, quel pensiero si è spostato su "Posso ritagliarmi rapidamente sul
cloud ciò di cui ho bisogno temporaneamente per le mie faccende informatiche più impegnative? " Paghi solo
I dati provenienti dai dispositivi connessi a Internet di tutto il mondo stanno esplodendo e stanno elaborando tali dati
richiede enormi quantità di energia. Secondo un recente articolo, l'uso di energia per
l'elaborazione dei dati nel 2015 cresceva del 20% all'anno e consumava circa tre a
cinque per cento della potenza mondiale. L'articolo dice che il potere totale di elaborazione dei dati
7
il consumo potrebbe raggiungere il 20% entro il 2025.
7
ttps: //www.theguardian.com/environment/2017/dec/11/tsunamiof
atacouldconsumefifthglobalelectricityby2025 .
4d
m
hew
L'elaborazione di una sola transazione Bitcoin utilizza approssimativamente la stessa quantità di energia di
alimentare la casa americana media per una settimana! Il consumo di energia deriva dal processo
8
I "minatori" di Bitcoin usano per dimostrare che i dati delle transazioni sono validi.
8
ttps: //motherboard.vice.com/en_us/article/ywbbpm/bitcoinmining
lectricityconsumptionethereumenergyclimatechange .
9
TTP: //digiconomist.net/bitcoinenergyconsumption .
0
TTP: //digiconomist.net/ethereumenergyconsumption .
Morgan Stanley ha previsto nel 2018 che "il consumo di elettricità necessario per creare
Le criptovalute quest'anno potrebbero effettivamente superare il veicolo elettrico globale previsto dall'azienda
1
domanda, nel 2025 ". Questa situazione è insostenibile, soprattutto visto l'enorme interesse per
applicazioni basate su blockchain, anche oltre l'esplosione della criptovaluta. La blockchain
2, 3
la comunità sta lavorando alle correzioni.
1
ttps: //www.morganstanley.com/ideas/cryptocurrenciesglobal
capacità .
2
ttps: //www.technologyreview.com/s/609480/bitcoinusesmassive
mountsofenergybuttheresaplantofixit / .
3
ttp: //mashable.com/2017/12/01/bitcoinenergy/ .
È probabile che l'esplosione dei bigdata continui in modo esponenziale negli anni a venire. Con 50 miliardi
dispositivi informatici all'orizzonte, possiamo solo immaginare quanti altri ce ne saranno nel corso del
nei prossimi decenni. È fondamentale per le aziende, i governi, i militari e persino gli individui
per avere un controllo su tutti questi dati.
È interessante notare che alcuni dei migliori scritti su big data, data science, artificiale
intelligenza e altro ancora da distinte organizzazioni imprenditoriali, come JP
Morgan, McKinsey e altri ancora. Il fascino dei big data per le grandi imprese è innegabile dato il
risultati in rapida accelerazione. Molte aziende stanno facendo investimenti significativi
e ottenere risultati preziosi attraverso le tecnologie di questo libro, come big data, machine
apprendimento, apprendimento profondo ed elaborazione del linguaggio naturale. Questo costringe i concorrenti a investire
L'analisi dei dati è una disciplina accademica e professionale matura e ben sviluppata. Il termine
4
"Analisi dei dati" è stata coniata nel 1962, anche se le persone hanno analizzato i dati utilizzando le statistiche
5
per migliaia di anni risalendo agli antichi egizi. L'analisi dei big data è qualcosa di più
6
fenomeno recente: il termine "big data" è stato coniato intorno al 2000.
4
ttps: //www.forbes.com/sites/gilpress/2013/05/28/averyshort
istoryofdatascience / .
5
ttps: //www.flydata.com/blog/abriefhistoryofdataanalysis/ .
6
ttps: //bits.blogs.nytimes.com/2013/02/01/theoriginsofbigdata
netymologicaldetectivestory / .
7, 8
Considera quattro delle V dei big data :
7
TTP: //www.ibmbigdatahub.com/infographic/fourvsbigdata .
8
Ci sono molti articoli e documenti che aggiungono molti altri Vwords a questo elenco.
1. Volume: la quantità di dati che il mondo sta producendo sta crescendo in modo esponenziale.
2. Velocità: la velocità con cui vengono prodotti i dati, la velocità con cui si muovono
0
9,, 1
attraverso le organizzazioni e la velocità con cui i dati cambiano stanno crescendo rapidamente.
9
ttps: //www.zdnet.com/article/volumevelocityandvariety
nderstandingthreevsofbigdata / .
0
ttps: //whatis.techtarget.com/definition/3Vs .
1
ttps: //www.forbes.com/sites/brentdykes/2017/06/28/bigdata
orgetvolumeandvarietyfocusonvelocity .
punteggiatura e alcuni caratteri speciali): oggi include anche immagini, audio, video
e dati da un numero sempre maggiore di sensori Internet of Things nelle nostre case,
La maggior parte dei dati viene ora creata digitalmente in una varietà di tipi, in volumi straordinari e
muovendosi a velocità sorprendenti . La legge di Moore e le relative osservazioni ci hanno permesso di farlo
archiviare i dati in modo economico e elaborarli e spostarli più velocemente, e il tutto a velocità in crescita
esponenzialmente nel tempo. L'archiviazione dei dati digitali è diventata così vasta in termini di capacità, economica e piccola
1
2
566h
uf n'
che ora possiamo conservare comodamente ed economicamente tutti i dati digitali che stiamo creando.
2 Pagina 54
2
ttp: //www.lesk.com/mlesk/ksg97/ksg.html . [Il seguente articolo ci ha indicato
questo articolo di Michael Lesk:
ttps: //www.forbes.com/sites/gilpress/2013/05/28/averyshort
istoryofdatascience / .]
La seguente citazione di Richard W. Hamming, sebbene del 1962, dà il tono per il resto
questo libro:
3
"Lo scopo del calcolo è la comprensione, non i numeri."
3
Hamming, R. W., Numerical Methods for Scientists and Engineers (New York, NY.,
McGraw Hill, 1962). [Il seguente articolo ci ha indicato il libro di Hamming e la sua citazione
horthistoryofdatascience / .]
La scienza dei dati sta producendo informazioni nuove, più profonde, più sottili e più preziose a un livello straordinario
ritmo. Sta davvero facendo la differenza. L'analisi dei big data è parte integrante della risposta. Noi
affrontare l'infrastruttura di big data in capitolo 16 con casi di studio handson su NoSQL
database, programmazione Hadoop MapReduce, Spark, Internet of Things (IoT) in tempo reale
programmazione del flusso e altro ancora.
Per avere un'idea della portata dei big data nell'industria, nel governo e nel mondo accademico, dai un'occhiata agli alti
4
grafica di risoluzione. Puoi fare clic per ingrandire per una più facile leggibilità:
4
Turck, M. e J. Hao, Great Power, Great Responsibility: The 2018 Big Data & AI
Paesaggio, ttp: //mattturck.com/bigdata2018/ .
.7.2 Scienza dei dati e Big Data fanno la differenza: casi d'uso
Il campo di datascience sta crescendo rapidamente perché sta producendo risultati significativi
Fare la differenza. Enumeriamo i casi di utilizzo di datascience e big data nella tabella seguente.
migliori relazioni con i clienti e persino squadre sportive che vincono più partite e campionati
6
5,, 7
spendendo meno per i giocatori.
5
Sawchik, T., Big Data Baseball: matematica, miracoli e la fine di una serie di perdite di 20 anni
(New York, Flat Iron Books, 2015).
1
6
hC
66h
S
6
Ayres, I., Super Crunchers (Bantam Books, 2007), pagg.7 10.
Pagina 55
7
Lewis, M., Moneyball: The Art of Winning an Unfair Game (W. W. Norton & Company,
2004).
uso atascience
casi
assistere le persone
con disabilità
rischio di autoassicurazione
predizione
chiuso automatizzato
sottotitoli
immagine automatizzata
prevedere il tempo
didascalie
vendite di prodotti sensibili
navi autonome
monitoraggio del fitness medicina preventiva
ride sharing
visione computerizzata riduzione della riammissione ospedaliera
6D
recidività
prezzi assicurativi analisi del sentiment
crimine: predittivo
polizia assistenti intelligenti sharing economy
visualizzazione dati
assistenti personali telemedicina
rilevamento di nuovi
medicina personalizzata attacco terroristico
virus
prevenzione
acquisti personalizzati
diagnosi del seno
prevenzione dei furti
cancro eliminazione del phishing
consigli di viaggio
diagnosi del cuore riduzione dell'inquinamento
patologia individuazione delle tendenze
medicina di precisione
medicina diagnostica ricerca visiva del prodotto
prevedere la sopravvivenza al cancro
identificazione
prevedere i risultati di salute ricerca vocale
droni
prevedere le iscrizioni degli studenti previsioni del tempo
guida dinamica
itinerari
prezzi dinamici
salute elettronica
record
energia
consumo
riduzione
app bigdata di maggior successo. I primi dispositivi e app di navigazione GPS si basavano su mappe statiche
e coordinate GPS per determinare il percorso migliore verso la destinazione. Non potevano adattarsi
8
ttps: //www.waze.com/brands/drivers/ .
Waze elabora enormi quantità di dati in crowdsourcing , ovvero i dati che sono
continuamente forniti dai loro utenti e dai dispositivi dei loro utenti in tutto il mondo. Lo analizzano
dati man mano che arrivano per determinare il percorso migliore per arrivare a destinazione nel minimo
quantità di tempo. Per farlo, Waze si affida alla connessione Internet del tuo smartphone.
L'app invia automaticamente gli aggiornamenti della posizione ai propri server (supponendo che tu lo consenta).
Usano questi dati per reindirizzarti dinamicamente in base alle condizioni del traffico correnti e a
sintonizza le loro mappe. Gli utenti segnalano altre informazioni, come blocchi stradali, lavori in corso, ostacoli,
veicoli in corsie di emergenza, posizioni della polizia, prezzi del gas e altro ancora. Waze quindi avvisa gli altri
conducenti in quelle località.
Waze utilizza molte tecnologie per fornire i suoi servizi. Non siamo al corrente di come sia Waze
implementato, ma deduciamo di seguito un elenco di tecnologie che probabilmente utilizzano. Userai molti di
C
61
h
La maggior parte delle app create oggi utilizza almeno alcuni software opensource. Ne approfitterai Pagina 58
Waze utilizza la sintesi vocale per pronunciare le indicazioni stradali, gli avvisi e la voce
riconoscimento per comprendere i tuoi comandi vocali. Usiamo il discorso di IBM Watson
Una volta che Waze converte in testo un comando parlato in naturallanguage, deve determinare il
azione corretta da eseguire, che richiede l'elaborazione del linguaggio naturale (PNL). Noi presentiamo
PNL in capitolo 11 e utilizzarlo in diversi capitoli successivi.
Waze mostra visualizzazioni aggiornate dinamicamente come avvisi e mappe. Anche Waze
ti consente di interagire con le mappe spostandole o ingrandendole e riducendole. Noi creiamo
Waze utilizza il tuo telefono come dispositivo Internet of Things (IoT) in streaming. Ogni telefono è un file
Sensore GPS che trasmette continuamente dati su Internet a Waze. Nel capitolo 16 , noi
Waze riceve flussi IoT da milioni di telefoni contemporaneamente. Deve elaborare, archiviare e
analizza immediatamente quei dati per aggiornare le mappe del tuo dispositivo, per visualizzare e parlare in modo pertinente
avvisi ed eventualmente per aggiornare le indicazioni stradali. Ciò richiede un enorme parallelismo
capacità di elaborazione implementate con cluster di computer nel cloud. Nel hapter
Waze utilizza funzionalità di intelligenza artificiale per eseguire le attività di analisi dei dati che abilitano
prevedere i percorsi migliori in base alle informazioni che riceve. Nel hapters 14 e 5 noi
utilizzare rispettivamente il machine learning e il deep learning per analizzare enormi quantità di dati
Waze probabilmente memorizza le sue informazioni di instradamento in un database a grafo. Tali database possono
calcolare in modo efficiente i percorsi più brevi. Introduciamo database a grafo, come Neo4J, in
capitolo 16 .
Molte auto sono ora dotate di dispositivi che consentono loro di "vedere" auto e ostacoli
intorno a loro. Questi vengono utilizzati, ad esempio, per aiutare a implementare sistemi di frenatura automatizzati
e sono una parte fondamentale della tecnologia delle auto a guida autonoma. Piuttosto che affidarsi agli utenti per la segnalazione
1
C
ostacoli e auto ferme sul ciglio della strada, le app di navigazione potrebbero trarne vantaggio Pagina 59
nozione di cosa sia una faccia, o anche di cosa sia una forma semplice? I bambini devono "imparare" il mondo
intorno a loro. Questo è ciò che sta facendo l'intelligenza artificiale (AI) oggi. Sembra enorme
quantità di dati e imparare da essi. L'intelligenza artificiale viene utilizzata per giocare, implementare una vasta gamma
delle applicazioni di computervision, abilitano le auto che si guidano da sole, consentono ai robot di imparare a eseguire
nuove attività, diagnosticare condizioni mediche, tradurre discorsi in altre lingue quasi in tempo reale,
creare chatbot in grado di rispondere a domande arbitrarie utilizzando enormi database di
conoscenza e molto altro ancora. Chi l'avrebbe immaginato solo pochi anni fa artificialmente
auto intelligenti a guida autonoma sarebbero consentite sulle nostre strade o addirittura diventerebbero comuni? Ancora,
questa è ora un'area altamente competitiva. L'obiettivo finale di tutto questo apprendimento è artificiale
intelligenza generale: un'intelligenza artificiale in grado di eseguire compiti di intelligenza oltre agli esseri umani. Questo è un
In una partita del 1997 tra il sistema informatico DeepBlue di IBM e il Gran Maestro di scacchi
Gary Kasparov, DeepBlue è diventato il primo computer a battere gli scacchi in tutto il mondo
9
campione in condizioni di torneo. IBM ha caricato DeepBlue con centinaia di file
0
migliaia di partite di scacchi da gran maestro. DeepBlue era in grado di usare la forza bruta per
1
valuta fino a 200 milioni di mosse al secondo! Questi sono i big data al lavoro. IBM ha ricevuto il
Carnegie Mellon University Fredkin Prize, che nel 1980 ha offerto $ 100.000 ai creatori
2
del primo computer a battere un campione del mondo di scacchi.
9
ttps: //en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov .
0
ttps: //en.wikipedia.org/wiki/Deep_Blue_ (chess_computer) .
1
ttps: //en.wikipedia.org/wiki/Deep_Blue_ (chess_computer) .
2
TTP: //articles.latimes.com/1997/jul/30/news/mn17696 .
Nel 2011, Watson di IBM ha battuto i due migliori Jeopardy umani! giocatori in un milione di dollari
incontro. Watson ha utilizzato contemporaneamente centinaia di tecniche di analisi delle lingue per localizzarlo
oC
76h
orrect risposte in 200 milioni di pagine di contenuto (inclusa tutta Wikipedia) che richiedono Pagina 60
3, 4
quattro terabyte di spazio di archiviazione.
Watson è stato addestrato con l'apprendimento automatico e
5
tecniche di rinforzo dell'apprendimento. il capitolo 13 discute IBM Watson e
3
ttps: //www.techrepublic.com/article/ibmwatsontheinside
hatitwantstodonext / .
4
ttps: //en.wikipedia.org/wiki/Watson_ (computer) .
5
ttps: //www.aaai.org/Magazine/Watson/watson.php , AI Magazine , autunno
2010.
6
Go, un gioco da tavolo creato in Cina migliaia di anni fa , è ampiamente considerato
170 7
uno dei giochi più complessi mai inventati con 10 possibili configurazioni del tabellone.
Per darti un'idea di quanto sia grande un numero, si ritiene che ci siano (solo)
78 87 8, 9
tra 10 e 10 atomi nell'universo conosciuto! Nel 2015, AlphaGo , creato da
Il gruppo DeepMind di Google ha utilizzato il deep learning con due reti neurali per battere il
6
TTP: //www.usgo.org/briefhistorygo .
7
ttps: //www.pbs.org/newshour/science/googleartificial
intelligencebeatschampionatworldsmostcomplicatedboard
ame .
8
ttps: //www.universetoday.com/36302/atomsintheuniverse/ .
9
ttps: //en.wikipedia.org/wiki/Observable_universe#Matter_content .
Più recentemente, Google ha generalizzato la sua AI AlphaGo per creare AlphaZero, un gameplay
AI che insegna a se stessa a giocare ad altri giochi . Nel dicembre 2017, AlphaZero ha imparato le regole
di e ha imparato a giocare a scacchi in meno di quattro ore utilizzando l'apprendimento per rinforzo. It
poi ha battuto il programma di scacchi campione del mondo, Stockfish 8, in una partita di 100 partite, vincendo
o disegnare ogni partita. Dopo essersi allenato in Go per sole otto ore, AlphaZero è stato in grado
0
per giocare a Go contro il suo predecessore AlphaGo, vincendo 60 su 100 giochi.
0
ttps: //www.theguardian.com/technology/2017/dec/07/alphazero
googledeepmindaibeatschampionprogramteachingitselftoplay
ourhours .
Un aneddoto personale
Quando uno degli autori, Harvey Deitel, era uno studente universitario al MIT a metà
c
C
87fh
gw
Anni 960, ha seguito un corso di intelligenza artificiale a livello di laurea con Marvin Minsky (a cui Pagina 61
questo libro è dedicato), uno dei fondatori dell'intelligenza artificiale (AI). Harvey:
Il professor Minsky ha richiesto un importante progetto a termine. Ci ha detto di pensare a quale intelligenza
è e per fare in modo che un computer faccia qualcosa di intelligente. Il nostro voto nel corso sarebbe
Ho studiato i test del QI standardizzati che le scuole amministrano per aiutarli a valutarli
lunghezza e complessità arbitrarie. Ho usato Lisp interattivo in esecuzione su uno dei primi Digital
Equipment Corporation PDP1 ed è stato in grado di far funzionare il mio predittore di sequenza su alcuni
roba piuttosto complessa, gestire sfide ben oltre ciò che ricordavo di aver visto nei test del QI.
La capacità di Lisp di manipolare elenchi arbitrariamente lunghi in modo ricorsivo era esattamente ciò di cui avevo bisogno
soddisfare i requisiti del progetto. Python offre la ricorsione e l'elaborazione di elenchi generalizzati
( capitolo 5 ).
Ho provato il predittore di sequenza su molti dei miei compagni di classe del MIT. Avrebbero inventato il numero
sequenze e digitarle nel mio predittore. Il PDP1 "pensava" per un po ', spesso a
Poi ho avuto un intoppo. Uno dei miei compagni di classe ha digitato la sequenza 14, 23, 34 e 42. My
predittore è andato a lavorare su di esso, e il PDP1 ha soffocato per molto tempo, non riuscendo a prevedere
il numero successivo. Neanche io sono riuscito a capirlo. Il mio compagno di classe mi ha detto di pensarci durante la notte,
e avrebbe rivelato la risposta il giorno successivo, sostenendo che si trattava di una semplice sequenza. I miei sforzi
furono inutili.
Il giorno dopo mi ha detto che il numero successivo era 57, ma non ho capito perché. Così lui
mi ha detto di pensarci di nuovo dall'oggi al domani, e il giorno dopo ha detto il numero successivo
era 125. Questo non ha aiutato un po ': ero perplesso. Ha detto che la sequenza erano i numeri
delle due vie trasversali di Manhattan. Ho gridato, "fallo", ma ha detto che ha incontrato il mio
criterio di previsione del numero successivo in una sequenza numerica. La mia visione del mondo era
matematica: la sua era più ampia.
pochi che hanno trascorso del tempo a Manhattan lo hanno capito bene. Il mio predittore di sequenza aveva bisogno di molto di più
della semplice conoscenza matematica per gestire problemi come questo, richiedendo (possibilmente vasta)
Quando Paul e io abbiamo iniziato a lavorare a questo libro di Python, ne siamo stati immediatamente attratti
Watson di IBM utilizza big data e tecniche di intelligenza artificiale come il linguaggio naturale
elaborazione (PNL) e apprendimento automatico per battere due dei migliori rischi umani al mondo!
Giocatori. Ci siamo resi conto che Watson potrebbe probabilmente gestire problemi come la sequenza
predittore perché era caricato con le mappe stradali del mondo e molto altro ancora. Quello
1C
stimola la nostra voglia di scavare a fondo sui big data e sull'intelligenza artificiale di oggi Pagina 62
È interessante notare che tutti i casi di studio sull'implementazione della fascicolazione dei dati hapters
in 11 - 6 neanche
sono radicati nelle tecnologie di intelligenza artificiale o discutono di hardware e software per big data
perché una volta risolto un problema particolare, la gente dice: “Beh, questa non è intelligenza, è solo
un programma per computer che dice al computer esattamente cosa fare. " Tuttavia, con machine
apprendimentocapitolo
( 14 ) e deep learning ( capitolo 15 ) non stiamo preprogrammando soluzioni
a problemi specifici . Invece, stiamo permettendo ai nostri computer di risolvere i problemi imparando da
dati e, in genere, molti di essi.
1
ttp: //theweek.com/speedreads/654463/googlemorethan1000
rtificialintelligenceprojectsworks .
2
ttps: //www.zdnet.com/article/googlesaysexponentialgrowthofai
schangingnatureofcompute / .
1.10 WRAP-UP
In questo capitolo abbiamo introdotto la terminologia e i concetti che gettano le basi per
Programmazione Python in cui imparerai hapters 2 - 0 e il bigdata, intelligenza artificiale
Abbiamo esaminato i concetti di programmazione orientata agli oggetti e discusso perché Python è diventato
così popolare. Abbiamo introdotto la Python Standard Library e varie librerie di datascience
che ti aiutano a evitare di "reinventare la ruota". Nei capitoli successivi userete queste librerie
per creare oggetti software con cui interagirai per eseguire compiti significativi con modesto
numero di istruzioni.
Hai lavorato su tre testdrive che mostrano come eseguire codice Python con IPython
1- 6.
Abbiamo discusso di quanto siano grandi i "big data" e di quanto velocemente stanno diventando ancora più grandi, e
w
1C
8io
hun'
ha risentito un caso di studio bigdata sull'app di navigazione mobile Waze, che utilizza molti file Pagina 63
tecnologie per fornire indicazioni stradali dinamiche che ti portino a destinazione il più rapidamente possibile
e nel modo più sicuro possibile. Abbiamo menzionato dove in questo libro ne userete molti
tecnologie. Il capitolo si è chiuso con la nostra prima sezione Intro to Data Science in cui abbiamo
ha discusso un'intersezione chiave tra informatica e scienza dei dati: artificiale
intelligenza.
https://avxhm.se/blogs/hill0
p
Pagina 64
Playlist
Obiettivi
opiche
Continua a utilizzare la modalità interattiva IPython per inserire frammenti di codice e vedere i risultati
ffers & Dea
subito.
ighlights
Scrivi semplici istruzioni e script Python.
Disconnessione
Usa operatori aritmetici e operatori di confronto e comprendi i loro
precedenza.
Utilizzare l'input della funzione incorporata per richiedere all'utente di immettere i dati sulla tastiera e ottenere
quei dati da utilizzare nel programma.
Contorno
1
Pagina 65
.1 Introduzione
.3 Aritmetica
.4 Stampa delle funzioni e un'introduzione alle stringhe con virgolette singole e doppie
.10 WrapUp
2.1 INTRODUZIONE
In questo capitolo, introduciamo la programmazione Python e presentiamo esempi illustrativi
caratteristiche linguistiche chiave. Si presume che tu abbia letto IPython TestDrive in capitolo 1 ,
che ha introdotto l'interprete IPython e lo ha utilizzato per valutare semplici operazioni aritmetiche
espressioni.
In [1]: 45 + 72
Uscita [1]: 117
In [2]: x = 7
Lo snippet [2] è una dichiarazione . Ogni istruzione specifica un'attività da eseguire. Il precedente
L'istruzione crea x e utilizza il simbolo di assegnazione (=) per dare a x un valore. Maggior parte
2C
Pagina 66
le istruzioni si fermano alla fine della riga, sebbene sia possibile che le istruzioni si estendano di più
più di una riga. La seguente istruzione crea la variabile y e le assegna il valore
3:
In [3]: y = 3
In [4]: x + y
Uscita [4]: 10
In [5]: totale = x + y
In [6]: totale
Uscita [6]: 10
Il simbolo = non è un operatore. Il lato destro del simbolo = viene sempre eseguito per primo,
quindi il risultato viene assegnato alla variabile sul lato sinistro del simbolo.
Stile Python
1
La Guida allo stile per il codice Python ti aiuta a scrivere codice conforme a Python
convenzioni di codifica. La guida allo stile consiglia di inserire uno spazio su ciascun lato di
il simbolo di assegnazione = e gli operatori binari come + per rendere i programmi più leggibili.
1
ttps: //www.python.org/dev/peps/pep0008/ .
Nomi variabili
Un nome di variabile, come x, è un identificatore . Ogni identificatore può essere composto da lettere,
cifre e trattini bassi (_) ma non possono iniziare con una cifra. Python fa distinzione tra maiuscole e minuscole , quindi
number e Number sono identificatori diversi perché uno inizia con una lettera minuscola
e l'altro inizia con una lettera maiuscola.
Tipi
h
Pagina 67
Ogni valore in Python ha un tipo che indica il tipo di dati rappresentato dal valore.
Puoi visualizzare il tipo di un valore con la funzione di tipo incorporata di Python , come in:
In [7]: digitare (x)
Out [7]: int
La variabile x contiene il valore intero 7 (dallo snippet [2]), quindi Python mostra int
(abbreviazione di intero). Il valore 10.5 è un numero in virgola mobile, quindi viene visualizzato Python
galleggiante.
2.3 ARITMETICA
La tabella seguente riassume gli operatori aritmetici , che ne includono alcuni
simboli non usati in algebra.
Sottrazione - p-c pc
Moltiplicazione * b · m b*m
Esponenziazione ** X x ** y
E
Pagina 68
o o
Resto
% r mod s r% s
(modulo)
Moltiplicazione (*)
Esponenziazione (**)
In [2]: 2 ** 10
Uscita [2]: 1024
Per calcolare la radice quadrata, puoi usare l'esponente 1/2 (ovvero 0,5):
In [3]: 9 ** ( 1 / 2 )
Uscita [3]: 3.0
La vera divisione (/) divide un numeratore per un denominatore e restituisce un virgola mobile
numero con punto decimale, come in:
In [4]: 7 / 4
Uscita [4]: 1,75
Pagina 69
La divisione del piano (//) divide un numeratore per un denominatore, ottenendo il più alto
numero intero non maggiore del risultato. Python tronca (scarta) il frazionario
parte:
In [5]: 7 // 4
Fuori [5]: 1
In [6]: 3 // 5
Uscita [6]: 0
In [7]: 14 // 7
Fuori [7]: 2
In [8]: 13 / 4
Uscita [8]: 3.25
La divisione del piano fornisce il numero intero più vicino che non è maggiore di 3,25, ovvero 4:
In [9]: 13 // 4
Fuori [9]: 4
Eccezioni e tracce
La divisione per zero con / o // non è consentita e genera un'eccezione: un segno che a
si è verificato un problema:
In [10]: 123 / 0
ZeroDivisionError Traceback (la chiamata più recente per ultima
ipythoninput10cd759d3fcf39> in <module> ()
> 1 123 / 0
Python segnala un'eccezione con un traceback . Questo traceback indica che un file
si è verificata un'eccezione di tipo ZeroDivisionError: la maggior parte dei nomi di eccezioni termina con
Errore. In modalità interattiva, viene specificato il numero di frammento che ha causato l'eccezione
C
<
Pagina 70
dal 10 in linea
<ipythoninput10cd759d3fcf39> in <module> ()
La riga che inizia con> mostra il codice che ha causato l'eccezione. Qualche volta
gli snippet hanno più di una riga di codice: l'1 a destra di> lo indica
la riga 1 all'interno dello snippet ha causato l'eccezione. L'ultima riga mostra l'eccezione che
, seguito da due punti (:) e un messaggio di errore con ulteriori informazioni su
l'eccezione:
Si verifica un'eccezione anche se si tenta di utilizzare una variabile che non è stata ancora creata. Il
Il frammento di codice seguente tenta di aggiungere 7 alla variabile non definita z, risultando in un NameError:
In [11]: z + 7
Operatore resto
L' operatore resto di Python (%) restituisce il resto dopo l'operando di sinistra è
diviso per l'operando di destra:
In [12]: 17 % 5
Fuori [12]: 2
C
<
Pagina 71
Forma lineare
Notazioni algebriche come
generalmente non sono accettabili per compilatori o interpreti. Per questo motivo algebrico
le espressioni devono essere digitate in forma lineare utilizzando gli operatori di Python. Il
l'espressione sopra deve essere scritta come a / b (o a // b per la divisione del piano) in modo che all
operatori e operandi vengono visualizzati su una linea retta orizzontale.
In [14]: 10 * ( 5 + 3 )
Uscita [14]: 80
In [15]: 10 * 5 + 3
Out [15]: 53
Python applica gli operatori nelle espressioni aritmetiche secondo le seguenti regole
di precedenza degli operatori . Questi sono generalmente gli stessi di quelli in algebra:
1. Le espressioni tra parentesi vengono valutate per prime, quindi le parentesi possono forzare l'ordine di
valutazione che si verifichi in qualsiasi sequenza si desideri. Le parentesi hanno il livello più alto di
precedenza. Nelle espressioni con parentesi nidificate , come (a / (b c)),
l'espressione tra le parentesi più interne (cioè b c) viene valutata per prima.
Pagina 72
contiene diverse moltiplicazioni, truedivision, floordivision e moduli
operazioni, Python le applica da sinistra a destra. Moltiplicazione, divisione e
modulo sono "sullo stesso livello di precedenza".
4. Le operazioni di addizione e sottrazione valutano per ultime. Se un'espressione contiene diversi file
operazioni di addizione e sottrazione, Python le applica da sinistra a destra.
Anche l'addizione e la sottrazione hanno lo stesso livello di precedenza.
Per l'elenco completo degli operatori e la loro precedenza (nell'ordine dal più basso al più alto), vedere
ttps: //docs.python.org/3/reference/expressions.html#operatorprecedence
Raggruppamento di operatori
Quando diciamo che Python applica determinati operatori da sinistra a destra, ci riferiamo a
il raggruppamento degli operatori . Ad esempio, nell'espressione
a+b+c
gli operatori di addizione (+) si raggruppano da sinistra a destra come se tra parentesi l'espressione fosse stata inserita
come (a + b) + c. Tutti gli operatori Python dello stesso gruppo di precedenza sono rimasti a destra
ad eccezione dell'operatore di esponenziazione (**), che raggruppa righttoleft.
Parentesi ridondanti
È possibile utilizzare parentesi ridondanti per raggruppare sottoespressioni per creare l'espressione
più chiaro. Ad esempio, il polinomio di secondo grado
y = a * x ** 2 + b * x + c
y = (a * (x ** 2)) + (b * x) + c
Rompere un'espressione complessa in una sequenza di affermazioni con più brevi, più semplici
le espressioni possono anche promuovere la chiarezza.
Tipi di operandi
h
C
Pagina 73
Ogni operatore aritmetico può essere utilizzato con numeri interi e numeri in virgola mobile. Se entrambi
gli operandi sono numeri interi, il risultato è un numero intero, ad eccezione dell'operatore truedivision (/),
che restituisce sempre un numero in virgola mobile. Se entrambi gli operandi sono in virgola mobile
numeri, il risultato è un numero in virgola mobile. Espressioni contenenti un numero intero e un file
i numeri in virgola mobile sono espressioni di tipo misto, che producono sempre il virgola mobile
risultati puntuali.
print non mostra le virgolette di una stringa, anche se presto mostreremo come visualizzare le virgolette
in stringhe.
Puoi anche racchiudere una stringa tra virgolette doppie ("), come in:
I programmatori Python generalmente preferiscono virgolette singole. Quando la stampa completa il suo compito, esso
posiziona il cursore del video all'inizio della riga successiva.
La funzione di stampa può ricevere un elenco di argomenti separati da virgole, come in:
C
Pagina 74
t mostra ogni argomento separato dal successivo da uno spazio, producendo lo stesso
output come nei due frammenti precedenti. Qui abbiamo mostrato un elenco separato da virgole di
stringhe, ma i valori possono essere di qualsiasi tipo. Mostreremo nel prossimo capitolo come prevenire
spaziatura automatica tra i valori o utilizzare un separatore diverso dallo spazio.
Quando una barra rovesciata (\) appare in una stringa, è nota come carattere di escape . Il
la barra rovesciata e il carattere immediatamente successivo formano una sequenza di escape . Per
esempio, \ n rappresenta la sequenza di escape del carattere di nuova riga , che dice a print to
sposta il cursore di output sulla riga successiva. Il frammento di codice seguente utilizza tre nuove righe
caratteri per creare diverse righe di output: i
Pitone!
Fuga
Descrizione
sequenza
Inserisci una tabulazione orizzontale. Quando viene visualizzata la stringa, per ciascuna scheda,
\t
spostare il cursore del video al successivo punto di tabulazione.
io
C
Pagina 75
\" Inserisce una virgoletta doppia in una stringa.
Puoi anche dividere una stringa lunga (o un'istruzione lunga) su più righe usando il \
carattere di continuazione come ultimo carattere su una riga per ignorare l'interruzione di riga:
L'interprete riassembla le parti della stringa in una singola stringa senza interruzioni di riga.
Sebbene il carattere barra rovesciata nello snippet precedente sia all'interno di una stringa, non è il
carattere di escape perché un altro personaggio non lo segue.
tre virgolette singole ('' '). La Guida allo stile per il codice Python consiglia tre doppie
virgolette ("" "). Utilizzale per creare:
C
Pagina 76
stringhe multilinea,
docstrings , che sono il modo consigliato per documentare gli scopi di alcuni file
componenti del programma.
In una stringa delimitata da virgolette singole, puoi includere caratteri virgolette doppie:
Lo snippet [2] mostrava un errore di sintassi dovuto a virgolette singole all'interno di una stringa con virgolette singole.
IPython visualizza le informazioni sulla riga di codice che ha causato l'errore di sintassi e
indica l'errore con un simbolo ^. Visualizza anche il messaggio SyntaxError:
ma non virgolette doppie, a meno che non utilizzi la sequenza di escape \ ":
Per evitare di utilizzare \ 'e \ "all'interno di stringhe, puoi racchiudere tali stringhe tra virgolette triple:
In [6]: print ( "" "Mostra" ciao "e" ciao "tra virgolette" "" )
Mostra "ciao" e "ciao" tra virgolette
Stringhe multilinea
Il frammento di codice seguente assegna una stringa a più righe con virgolette triple
triple_quoted_string:
IPython sa che la stringa è incompleta perché non abbiamo digitato la chiusura "" "
prima di premere Invio . Quindi, IPython mostra un prompt di continuazione ...: al quale
è possibile inserire la riga successiva della stringa multilinea. Questo continua fino a quando non inserisci il finale
"" "e premere Invio . Di seguito viene visualizzato triple_quoted_string:
lecca qui per visualizzare l'immagine del codice
Python memorizza stringhe multilinea con caratteri di nuova riga incorporati. Quando valutiamo
triple_quoted_string invece di stamparlo, IPython lo visualizza tra virgolette singole
C
Pagina 78
con un carattere \ n dove hai premuto Invio nello snippet [7]. Le virgolette IPython
i display indicano che triple_quoted_string è una stringa, non fanno parte del
contenuto della stringa:
In [9]: triple_quoted_string
Out [9]: "Questa è una stringa con virgolette triple che si estende su due righe"
In [2]: nome
Uscita [2]: "Paul"
Innanzitutto, l'input mostra il suo argomento stringa, un prompt, per dire all'utente cosa digitare
e attende che l'utente risponda. Abbiamo digitato Paul e premuto Invio . Usiamo il grassetto
text per distinguere l'input dell'utente dal testo del prompt visualizzato dall'input.
L'input della funzione restituisce quindi quei caratteri come una stringa che il programma può utilizzare.
Qui abbiamo assegnato quella stringa al nome della variabile.
Lo snippet [2] mostra il valore del nome. La valutazione del nome mostra il suo valore tra virgolette singole come
"Paul" perché è una stringa. Il nome di stampa (nello snippet [3]) mostra la stringa senza
le virgolette. Se inserisci virgolette, fanno parte della stringa, come in:
C
Pagina 79
In [5]: nome
Uscita [5]: "'Paul'"
In [6]: print (nome)
'Paolo'
Invece di aggiungere gli interi 7 e 3 per produrre 10, Python "aggiunge" i valori di stringa
"7" e "3", producendo la stringa "73". Questo è noto come concatenazione di stringhe . It
crea una nuova stringa contenente il valore dell'operando sinistro seguito da quello dell'operando destro
valore.
Se hai bisogno di un numero intero, converti la stringa in un numero intero utilizzando la funzione incorporata int :
In [12]: valore
Uscita [12]: 7
C
Pagina 80
In [13]: another_value = int (input ( 'Enter another integer:' ))
Immettere un altro numero intero: 13
In [14]: another_value
Uscita [14]: 13
Il valore delle variabili e un altro_valore ora contengono numeri interi. Aggiungendoli si ottiene un file
risultato intero (invece di concatenarli):
Se la stringa passata a int non può essere convertita in un numero intero, si verifica un'eccezione ValueError:
ValueError : valore letterale non valido per int () con base 10: 'hello'
Per convertire le stringhe in numeri in virgola mobile, usa la funzione float incorporata .
In [1]: 7 > 4
Out [1]: vero
C
<
Vero e Falso sono parole chiave Python. L'uso di una parola chiave come identificatore causa un
Errore di sintassi. Vero e Falso sono ciascuno in maiuscolo.
x è maggiore di o
≥ >= x> = y
uguale a y
x è minore o uguale
≤ <= x <= y
ay
= == x == y x è uguale a y
≠ != x! = y x non è uguale a y
Gli operatori>, <,> = e <= hanno tutti la stessa precedenza. Operatori == e! = Entrambi
hanno la stessa precedenza, che è inferiore a quella di>, <,> = e <=. Un errore di sintassi
si verifica quando uno degli operatori ==,! =,> = e <= contiene spazi tra la sua coppia di
simboli:
Pagina 82
lecca qui per visualizzare l'immagine del codice
In [3]: 7 > = 4
File "<ipythoninput35c6e2897f3b3>", riga 1
7> = 4
^
SyntaxError : sintassi non valida
Un altro errore di sintassi si verifica se si invertono i simboli negli operatori! = , > = E <=
Ora presentiamo una semplice versione del se dichiarazione , che utilizza una condizione di
decidere se eseguire un'istruzione (o un gruppo di istruzioni). Qui ne leggeremo due
numeri interi dell'utente e confrontarli utilizzando sei istruzioni if consecutive, una per
ogni operatore di confronto. Se la condizione in una determinata istruzione if è True, il
viene eseguita l'istruzione print corrispondente; in caso contrario, viene ignorata.
La modalità interattiva IPython è utile per eseguire brevi frammenti di codice e vedere
risultati immediati. Quando hai molte istruzioni da eseguire come gruppo, in genere
scriverli come uno script memorizzato in un file con l'estensione .py (abbreviazione di Python), come
come fig02_01.py per lo script di questo esempio. Gli script sono anche chiamati programmi. Per
istruzioni su come individuare ed eseguire gli script in questo libro, vedere apo 1 ‘s IPython
Test di guida.
Ogni volta che esegui questo script, tre delle sei condizioni sono True. Per dimostrarlo, noi
eseguire lo script tre volte: una volta con il primo intero inferiore al secondo, una volta
con lo stesso valore per entrambi interi e una volta con il primo intero maggiore la
secondo. Le tre esecuzioni di esempio vengono visualizzate dopo lo script
Ogni volta che presentiamo uno script come quello qui sotto, lo introduciamo prima della figura, poi
spiegare il codice dello script dopo la figura. Mostriamo i numeri di riga per tua comodità—
questi non fanno parte di Python. Gli IDE ti consentono di scegliere se visualizzare la linea
numeri. Per eseguire questo esempio, passare alla cartella degli esempi ch02 di questo capitolo, quindi
accedere:
ipython fig02_01.py
C
Pagina 83
eseguire fig02_01.py
lecca qui per visualizzare l'immagine del codice
1 # fig02_01.py
2 "" "Confronto di numeri interi utilizzando istruzioni if e operatori di confronto." "
3
4 print ( 'Inserisci due numeri interi e te lo dirò' ,
5 "le relazioni che soddisfano." )
6
7 # legge il primo numero intero
8 number1 = int (input ( 'Enter first integer:' ))
9
10 # legge il secondo numero intero
11 number2 = int (input ( 'Enter second integer:' ))
12
13 se numero1 == numero2:
14 print (numero1, 'è uguale a' , numero2)
15
16 se numero1! = Numero2:
17 print (numero1, 'non è uguale a' , numero2)
18
19 se numero1 <numero2:
20 print (numero1, 'è minore di' , numero2)
21
22 se numero1> numero2:
23 print (numero1, 'è maggiore di' , numero2)
24
25 se numero1 <= numero2:
26 print (numero1, "è minore o uguale a" , numero2)
27
28 se numero1> = numero2:
29 print (numero1, "è maggiore o uguale a" , numero2)
C
Pagina 84
Inserisci due numeri interi e ti dirò le relazioni che soddisfano.
Immettere il primo numero intero: 7
Immettere il secondo numero intero: 7
7 è uguale a 7
7 è minore o uguale a 7
7 è maggiore o uguale a 7
La riga 1 inizia con il carattere cancelletto ( # ), che indica che il resto della riga è un
commento :
# fig02_01.py
Per una facile consultazione, iniziamo ogni script con un commento che indica il file dello script
nome. Un commento può anche iniziare a destra del codice su una determinata riga e continuare
fino alla fine di quella riga.
Docstrings
La Guida allo stile per il codice Python afferma che ogni script dovrebbe iniziare con una docstring
che spiega lo scopo dello script, come quello nella riga 2:
Per script più complessi, la docstring si estende spesso su molte righe. Nei capitoli successivi, lo farai
usa docstrings per descrivere i componenti dello script che definisci, come nuove funzioni e
nuovi tipi chiamati classi. Discuteremo anche come accedere alle docstring con IPython
meccanismo di aiuto.
B
C Linee dinamiche
La riga 3 è una riga vuota. Si utilizzano righe vuote e caratteri spazio per semplificare il codice
leggere. Insieme, le righe vuote, i caratteri di spazio ei caratteri di tabulazione sono noti come bianchi
spazio . Python ignora la maggior parte degli spazi bianchi: vedrai che è richiesta una certa indentazione.
Righe 4–5
visualizzare le istruzioni per l'utente. Questi sono troppo lunghi per stare su una riga, quindi li abbiamo interrotti
in due stringhe. Ricorda che puoi visualizzare diversi valori passando per stampare un file
elenco separato da virgole: print separa ogni valore dal successivo con uno spazio.
In genere, scrivi le dichiarazioni su una riga. Puoi diffondere una lunga dichiarazione
diverse righe con il carattere \ continuation. Python ti consente anche di dividere a lungo
righe di codice tra parentesi senza utilizzare caratteri di continuazione (come nelle righe 4-5). Questo
è il modo preferito per interrompere lunghe righe di codice secondo la Guida allo stile per Python
Codice . Scegli sempre i punti di interruzione che abbiano senso, ad esempio dopo una virgola nel file
precedente chiamata a print o prima di un operatore in un'espressione lunga.
Successivamente, le righe 8 e 11 utilizzano le funzioni incorporate input e int per richiedere e leggere
due valori interi dall'utente.
se Dichiarazioni
L'istruzione if nelle righe 13-14
se numero1 == numero2:
print (numero1, 'è uguale a' , numero2)
numero1 e numero2 sono uguali. In tal caso, la condizione è True e la riga 14 visualizza a
C
Pagina 86
ine di testo che indica che i valori sono uguali. Se una delle restanti dichiarazioni if '
le condizioni sono Vere (righe 16, 19, 22, 25 e 28), la stampa corrispondente visualizza a
riga di testo.
Ogni istruzione if è composta dalla parola chiave if, dalla condizione da testare e da due punti (:)
seguito da un corpo rientrato chiamato suite . Ogni suite deve contenere uno o più
dichiarazioni. Dimenticare i due punti (:) dopo la condizione è un errore di sintassi comune.
Python richiede di indentare le istruzioni nelle suite. La guida allo stile per Python
Il codice raccomanda quattro rientri di spazio: usiamo questa convenzione in tutto il libro.
Vedrai nel prossimo capitolo che un rientro errato può causare errori.
Confondere == e =
la condizione dell'istruzione è un errore di sintassi comune. Per evitare questo problema, leggi == come "è uguale
a "e = come" è assegnato ". Vedrai nel prossimo capitolo che l'uso di == al posto di = in un file
la dichiarazione di incarico può portare a problemi sottili.
Concatenamento di confronti
In [1]: x = 3
In [3]: x = 10
l
Pagina 87
lasciato a
() parentesi
giusto
giusto per
** esponenziazione
sinistra
lasciato a
+- addizione, sottrazione
giusto
> <= < lasciato a minore di, minore o uguale, maggiore di, maggiore
lasciato a
==! = uguale, non uguale
giusto
La tabella elenca gli operatori dall'alto in basso in ordine decrescente di precedenza. quando
scrivendo espressioni contenenti più operatori, confermare che valutino nel file
ordine previsto facendo riferimento alla tabella delle priorità degli operatori all'indirizzo
ttps: //docs.python.org/3/reference/expressions.html#operatorprecedence
In [1]: tipo ( 7 )
Out [1]: int
Il valore di un oggetto sono i dati memorizzati nell'oggetto. Gli snippet sopra mostrano oggetti di
tipi incorporati int (per interi), float (per numeri in virgola mobile) e str (per
stringhe).
Assegnare un oggetto a una variabile lega (associa) il nome di quella variabile all'oggetto.
Come hai visto, puoi quindi utilizzare la variabile nel codice per accedere al valore dell'oggetto:
In [4]: x = 7
In [5]: x + 10
Fuori [5]: 17
In [6]: x
Fuori [6]: 7
Dopo l'assegnazione dello snippet [4], la variabile x si riferisce all'oggetto intero che contiene
7. Come mostrato nello snippet [6], lo snippet [5] non cambia il valore di x. Puoi modificare x
come segue:
In [7]: x = x + 10
In [8]: x
Uscita [8]: 17
Digitazione dinamica
Python utilizza la digitazione dinamica: determina il tipo di oggetto a cui fa riferimento una variabile
durante l'esecuzione del codice. Possiamo dimostrarlo riassociando la variabile x a differente
oggetti e verificandone la tipologia:
In [10]: x = 4.1
Pagina 89
In [12]: x = "dog"
C
Pagina 90
1 # fig02_02.py
2 "" "Trova il minimo di tre valori." ""
3
4 numero1 = int (input ( 'Inserisci il primo numero intero:' ))
5 numero2 = int (input ( 'Inserisci il secondo intero:' ))
6 number3 = int (input ( 'Enter third integer:' ))
7
8 minimo = numero1
9
10 se numero2 <minimo:
11 minimo = numero2
12
13 se numero3 <minimo:
14 minimo = numero 3
15
16 print ( "Il valore minimo è" , minimo)
Innanzitutto, assumiamo che numero1 contenga il valore più piccolo, quindi la riga 8 lo assegna a
il minimo variabile. Naturalmente, è possibile che il numero2 o il numero3 contenga
C
Pagina 91
il valore più piccolo effettivo, quindi dobbiamo ancora confrontare ciascuno di questi con il minimo.
La prima istruzione if (righe 10-11) quindi verifica numero2 <minimo e if this
la condizione è True assegna il numero2 al minimo.
Ora, il minimo contiene il valore più piccolo, quindi lo visualizziamo. Abbiamo eseguito lo script
tre volte per mostrare che trova sempre il valore più piccolo indipendentemente dal fatto che il
l'utente lo inserisce per primo, secondo o terzo.
In [1]: min ( 36 , 27 , 12 )
Uscita [1]: 12
In [2]: max ( 36 , 27 , 12 )
Fuori [2]: 36
L' intervallo di valori è semplicemente il valore minimo attraverso il valore massimo. In questo caso,
l'intervallo è compreso tra 12 e 36. Gran parte della scienza dei dati è dedicata alla conoscenza dei dati.
Le statistiche descrittive sono una parte cruciale di questo, ma devi anche capire come farlo
interpretare le statistiche. Ad esempio, se hai 100 numeri con un intervallo di 12
fino a 36, quei numeri potrebbero essere distribuiti uniformemente su quell'intervallo. Al contrario
estremo, potresti avere un raggruppamento con 99 valori di 12 e uno di 36 o uno di 12 e 99
valori di 36.
Pagina 92
concetto di programmazione in stile funzionale chiamato riduzione . Riducono una raccolta di
valori in un singolo valore. Altre riduzioni che vedrai includono la somma, la media, la varianza
e deviazione standard di una raccolta di valori. Vedrai anche come definire personalizzato
riduzioni.
Nei prossimi due capitoli, continueremo la nostra discussione sulle statistiche descrittive di base
con misure di tendenza centrale , inclusi media , mediana e modo , e misure
di dispersione , compresa la varianza e la deviazione standard .
2.10 WRAP-UP
Questo capitolo ha continuato la nostra discussione sull'aritmetica. Hai utilizzato le variabili per memorizzare i valori
per un uso successivo. Abbiamo introdotto gli operatori aritmetici di Python e abbiamo dimostrato che è necessario
scrivi tutte le espressioni in forma lineare. Hai usato la funzione incorporata per stampare
visualizza dati. Abbiamo creato stringhe con virgolette singole, doppie e triple. Hai usato il triplo
stringhe tra virgolette per creare stringhe multilinea e per incorporare virgolette singole o doppie in
stringhe.
tastiera. Abbiamo usato le funzioni int e float per convertire le stringhe in valori numerici.
Abbiamo presentato gli operatori di confronto di Python. Quindi, li hai usati in uno script che leggeva
due numeri interi dall'utente e confrontato i loro valori utilizzando una serie di istruzioni if.
Abbiamo discusso della digitazione dinamica di Python e utilizzato il tipo di funzione incorporata per visualizzare
il tipo di un oggetto. Infine, abbiamo introdotto le statistiche descrittive di base minime e
massimo e li ha utilizzati per calcolare l'intervallo di una raccolta di valori. Nel prossimo
capitolo, presentiamo le istruzioni di controllo di Python.
un'
Pagina 93
elenchi
3. Dichiarazioni di controllo
storia
Obiettivi
foto
Usa l'istruzione for e la funzione di intervallo incorporata per ripetere le azioni per un file
Supporto
sequenza di valori.
Disconnessione
Esegui l'iterazione controllata dalla sentinella con while.
Crea condizioni composte con gli operatori booleani and, or and not.
Utilizza le funzionalità di programmazione in stile funzionale per scrivere script più concisi,
più chiaro, più facile da eseguire il debug e più facile da parallelizzare.
Contorno
3.3
Controllo
3.2
introduzione
3.1
ent
Dichiarazioni
e3.4
elif
S
Se
altroifStatem
Pagina 94
.5 Istruzione while
.6 per Statement
.7 Incarichi aumentati
.14 Introduzione alla scienza dei dati: misure della tendenza centrale: media, mediana e modo
.15 WrapUp
3.1 INTRODUZIONE
In questo capitolo, presentiamo le istruzioni di controllo di Python: if, if else, if elif else,
mentre, per, rompere e continuare. Userai l'istruzione for per eseguire la sequenza
iterazione controllata: vedrai che il numero di elementi in una sequenza di elementi
determina il numero di iterazioni dell'istruzione for. Userai la funzione incorporata
Mostreremo l'iterazione controllata dalla sentinella con l'istruzione while. Userai il file
Tipo decimale della libreria standard Python per calcoli monetari precisi. Bene
formattare i dati in fstrings (ovvero, formattare le stringhe) utilizzando vari identificatori di formato. Bene
mostra anche gli operatori booleani e, o e non per la creazione di condizioni composte. Nel
nella sezione Introduzione alla scienza dei dati, prenderemo in considerazione le misure della tendenza centrale: media,
mediana e modalità, utilizzando il modulo delle statistiche della libreria standard di Python.
33 .2 DICHIARAZIONI DI CONTROLLO
Pagina 95
.2 DICHIARAZIONI DI CONTROLLO
Python fornisce tre istruzioni di selezione che eseguono il codice in base a una condizione che
restituisce True o False:
condizione è False.
L' istruzione if ... else esegue un'azione se una condizione è True o esegue
L' istruzione if ... elif ... else esegue una delle tante azioni diverse,
a seconda della verità o falsità di diverse condizioni.
Ovunque sia possibile posizionare una singola azione, è possibile posizionare un gruppo di azioni.
L' istruzione for ripete un'azione (o un gruppo di azioni) per ogni elemento in un file
sequenza di elementi.
Parole chiave
Le parole if, elif, else, while, for, True e False sono parole chiave Python. Utilizzando
una parola chiave come identificatore come il nome di una variabile è un errore di sintassi. La tabella seguente
elenca le parole chiave di Python.
3
Pagina 96
elif altro tranne Falso finalmente
In [1]: voto = 85
In [2]: se voto> = 60 :
...: print ( 'Superato' )
...:
Passato
È richiesto il rientro di una suite; in caso contrario, si verifica un errore di sintassi di IndentationError:
In [3]: se voto> = 60 :
...: l' istruzione print ( 'Passed' ) # non è rientrata correttamente
File "<ipythoninput3f42783904220>", riga 2
L'istruzione print ('Passed') # non è rientrata correttamente
^ Pagina 97
IndentationError : previsto un blocco rientrato
In [4]: se voto> = 60 :
...: print ( 'Passed' ) # rientrato di 4 spazi
...: print ( 'Ottimo lavoro! ) # ha rientrato in modo errato solo due spazi
File <ipythoninput48c0d75c127bf>, riga 3
print ('Ottimo lavoro!) # ha rientrato in modo errato solo due spazi
^
IndentationError : unindent non corrisponde a nessun livello di rientro esterno
A volte i messaggi di errore potrebbero non essere chiari. Il fatto che Python richiami l'attenzione su
di solito è sufficiente per capire cosa c'è che non va. Applica il rientro
convenzioni in modo uniforme in tutto il codice, programmi che non sono uniformi
indentati sono difficili da leggere.
Puoi basare le decisioni su qualsiasi espressione. Un valore diverso da zero è True. Zero è falso:
In [5]: se 1 :
...: print ( 'I valori diversi da zero sono veri, quindi verrà stampato')
...:
I valori diversi da zero sono veri, quindi verrà stampato
In [6]: se 0 :
...: print ( 'Zero è falso, quindi non verrà stampato' )
In [7]:
Le stringhe contenenti caratteri sono True, mentre le stringhe vuote ('', "" o "" "" "") lo sono
Falso.
Confondere == e =
C
Pagina 98
Incarico:
grado = 85
grado == 85
allora il grado sarebbe indefinito e avremmo un'eccezione NameError. Se il grado fosse stato definito
prima dell'affermazione precedente, quindi voto == 85 restituirebbe semplicemente True o
o Falso:
In [1]: voto = 85
In [2]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Passato
La condizione sopra è True, quindi la suite if mostra "Superato". Nota che quando
premere Invio dopo aver digitato print ("Passed"), IPython fa rientrare la riga successiva di quattro spazi.
È necessario eliminare questi quattro spazi in modo che else: suite si allinei correttamente sotto i
in se.
ancora una volta per dimostrare che solo la suite else viene eseguita quando la condizione è
Falso:
In [3]: voto = 57
Utilizzare i tasti freccia su e giù per spostarsi avanti e indietro nel file
frammenti di sessione interattiva corrente. Premendo Invio viene eseguito nuovamente lo snippet
visualizzato. Impostiamo il grado su 99, premi due volte il tasto freccia su per richiamare il codice da
snippet [4], quindi premi Invio per rieseguire il codice come snippet [6]. Ogni richiamato
lo snippet che esegui ottiene un nuovo ID:
In [5]: voto = 99
In [6]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Passato
Espressioni condizionali
In [7]: voto = 87
In [8]: se voto> = 60 :
...: risultato = 'Superato'
...: altro :
...: result = 'Failed'
...:
In [9]: risultato
Out [9]: "Passed"
C
Pagina 100
Puoi scrivere istruzioni come snippet [8] usando un'espressione condizionale concisa :
In [11]: risultato
Out [11]: "Passed"
> = 60:
In modalità interattiva, puoi anche valutare direttamente l'espressione condizionale, come in:
Il codice seguente mostra due istruzioni nella suite else di un if ... else
dichiarazione:
In [13]: voto = 49
In [14]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...: print ( 'Devi ripetere questo corso' )
...:
Fallito
Devi ripetere questo corso
C
Pagina 101
In questo caso, il voto è inferiore a 60, quindi vengono eseguite entrambe le istruzioni nella suite else.
Se non indenti la seconda stampa, non è nella suite dell'altro. Così che
l'istruzione viene eseguita sempre , creando forse uno strano output errato:
In [16]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...: print ( 'Devi ripetere questo corso' )
...:
Passato
Devi ripetere questo corso
Puoi testare per molti casi usando l' istruzione if ... elif ... else . Il
Il codice seguente visualizza "A" per i voti maggiori o uguali a 90, "B" per i voti in
intervallo 80-89, "C" per i gradi 70-79, "D" per i gradi 60-69 e "F" per tutti gli altri gradi.
Viene eseguita solo l'azione per la prima condizione True. Lo snippet [18] mostra C, perché
il voto è 77:
In [17]: voto = 77
In [18]: se voto> = 90 :
...: print ( 'A' )
...: grado elif > = 80 :
...: print ( 'B' )
...: grado elif > = 70 :
...: print ( 'C' )
...: grado elif > = 60 :
...: print ( 'D' )
...: altro :
...: print ( 'F' )
...:
C
La prima condizione, voto> = 90, è False, quindi la stampa ("A") viene saltata. Il secondo
anche la condizione — grado> = 80 — è False, quindi la stampa ("B") viene saltata. Il terzo
condition — grade> = 70 — is True, quindi print ('C') viene eseguito. Poi tutto il resto
C
Pagina 102
il codice nell'istruzione if ... elif ... else viene ignorato. Un if ... elif ... else lo è
più veloce delle istruzioni if separate, perché il test delle condizioni si ferma non appena a
la condizione è vera.
altro è facoltativo
Errori logici
Il segmento di codice rientrato in modo errato nello snippet [16] è un esempio di non irreversibile
errore logico . Il codice viene eseguito, ma produce risultati errati. Per un errore logico fatale
in uno script , si verifica un'eccezione (come ZeroDivisionError da un tentativo di
dividere per 0), quindi Python visualizza un traceback, quindi termina lo script. Un errore fatale in
la modalità interattiva termina solo lo snippet corrente, quindi IPython attende il tuo prossimo
ingresso.
rimane vero. Usiamo un'istruzione while per trovare la prima potenza di 3 maggiore di 50:
In [1]: prodotto = 3
In [3]: prodotto
Uscita [3]: 81
Lo snippet [3] valuta il prodotto per vedere il suo valore, 81, che è la prima potenza di 3 più grande
di 50.
Qualcosa nella suite dell'istruzione while deve cambiare il valore del prodotto, quindi il file
C
Pagina 103
la condizione alla fine diventa Falso. In caso contrario, si verifica un ciclo infinito. Nel
applicazioni eseguite da Terminale, Prompt dei comandi di Anaconda o shell, digita Ctrl
+ c o control + c per terminare un ciclo infinito. Gli IDE hanno in genere un pulsante della barra degli strumenti o
opzione di menu per interrompere l'esecuzione di un programma.
Successivamente, viene eseguita l'istruzione nella suite, visualizzando il valore del carattere seguito da
due spazi: ne parleremo tra poco.
Dopo aver eseguito la suite, Python assegna al personaggio l'elemento successivo nel file
sequenza (cioè la "r" in "Programmazione"), quindi esegue nuovamente la suite.
Questo continua finché ci sono più elementi nella sequenza da elaborare. In questo caso,
l'istruzione termina dopo aver visualizzato la lettera "g", seguita da due spazi.
L'uso della variabile target nella suite, come abbiamo fatto qui per visualizzarne il valore, è comune ma
non richiesto.
Argomento della parola chiave della fine della stampa della funzione
La funzione incorporata print mostra i suoi argomenti, quindi sposta il cursore al successivo
linea. Puoi cambiare questo comportamento con l'argomento end , come in
C
Pagina 104
print (carattere, fine = '' )
che mostra il valore del carattere seguito da due spazi. Quindi, tutti i personaggi
visualizzare orizzontalmente sulla stessa riga. Le chiamate Python terminano un argomento di parola chiave , ma
fine in sé non è una parola chiave Python. Gli argomenti delle parole chiave sono talvolta chiamati named
argomenti . L'argomento della parola chiave end è facoltativo. Se non lo includi, stampa
utilizza una nuova riga ('\ n') per impostazione predefinita. La Guida allo stile per il codice Python consiglia
non inserire spazi attorno al =.
È possibile utilizzare l'argomento della parola chiave sep (abbreviazione di separator) per specificare la stringa that
appare tra gli elementi visualizzati per la stampa. Quando non lo specifichi
argomento, print utilizza uno spazio per impostazione predefinita. Visualizziamo tre numeri, ciascuno
separato dal successivo da una virgola e uno spazio, anziché solo uno spazio:
Per rimuovere gli spazi predefiniti, utilizzare sep = '' (ovvero una stringa vuota).
In [3]: totale = 0
In [5]: totale
Uscita [5]: 25
C
Pagina 105
Ogni sequenza ha un iteratore . L'istruzione for utilizza l'iteratore "dietro
scene "per ottenere ogni elemento consecutivo fino a quando non ce ne sono più da elaborare. L'iteratore è
come un segnalibro: sa sempre dove si trova nella sequenza, quindi può restituire il successivo
oggetto quando è chiamato a farlo. Copriamo gli elenchi in dettaglio nella sezione "Sequenze: elenchi e
Capitolo Tuple ". Lì, vedrai che l'ordine degli elementi in un elenco è importante e che a
gli elementi della lista sono mutabili (cioè modificabili).
La chiamata di funzione range (10) crea un oggetto iterabile che rappresenta una sequenza di
interi consecutivi che iniziano da 0 e continuano fino a, ma non includendo, il
valore argomento (10): in questo caso, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. L'istruzione for termina
quando termina l'elaborazione dell'ultimo numero intero che l'intervallo produce. Iteratori e iterabili
gli oggetti sono due delle caratteristiche di programmazione in stile funzionale di Python . Ti presenteremo
più di questi in tutto il libro.
Errori off-by-one
per numero in [ 1 , 2 , 3 , 4 , 5 ]:
dichiarazione :
In [1]: totale = 0
In [3]: totale
Uscita [3]: 15
L'espressione + = nello snippet [2] prima aggiunge il valore di number al totale corrente, quindi
memorizza il nuovo valore in totale. La tabella seguente mostra le assegnazioni aumentate di esempio:
Aumentato Campione
Spiegazione Assegna
Incarico espressione
Supponiamo: c = 3, d = 5, e = 4, f = 2, g = 9, h = 12
+= c+=7 c=c+7 Da 10 a c
= d=4 d=d4 Da 1 a d
*= e*=5 e=e*5 20 a e
** = f ** = 3 f = f ** 3 Da 8 a f
C
Pagina 107
// = g // = 2 g = g // 2 4ag
%= h% = 9 h = h% 9 3 alle h
Una classe di dieci studenti ha risposto a un quiz. I loro voti (numeri interi nell'intervallo 0-100) sono 98,
76, 71, 87, 83, 90, 57, 79, 82, 94. Determina la media della classe durante il quiz.
Il seguente script per risolvere questo problema mantiene un totale parziale dei voti,
calcola la media e visualizza il risultato. Abbiamo inserito i 10 voti in una lista, ma tu
potrebbe inserire i voti di un utente alla tastiera (come faremo nel prossimo esempio) o
leggerli da un file (come vedrai come fare nel capitolo "File ed eccezioni"). Noi
mostra come leggere i dati dai database SQL e NoSQL in formato capitolo 16 .
1 # class_average.py
2 "" "Programma medio di classe con iterazione controllata dalla sequenza." ""
3
4 # fase di inizializzazione
5 totale = 0 # somma dei voti
6 grade_counter = 0
7 voti = [ 98 , 76 , 71 , 87 , 83 , 90 , 57 , 79 , 82 , 94 ] # elenco di 10 voti
8
9 # fase di elaborazione
10 per voto in gradi:
11 totale + = voto # aggiunge il voto attuale al totale parziale
12 grade_counter + = 1 # indica che è stato elaborato un altro voto d
13
14 # fase di terminazione
15 media = total / grade_counter
16 print (f 'La media della classe è {media} ' )
C
Pagina 108
lecca qui per visualizzare l'immagine del codice
L'istruzione for elabora ogni voto nell'elenco dei voti. La riga 11 aggiunge la corrente
voto sul totale. Quindi, la riga 12 aggiunge 1 alla variabile grade_counter da mantenere
traccia del numero di voti elaborati finora. L'iterazione termina quando tutti i 10 voti
nell'elenco sono stati elaborati. La Guida allo stile per il codice Python consiglia di inserire un file
riga vuota sopra e sotto ogni istruzione di controllo (come nelle righe 8 e 13). Quando il for
l'istruzione termina, la riga 15 calcola la media e la riga 16 la visualizza. Più avanti in questo
capitolo, usiamo la programmazione in stile funzionale per calcolare la media degli elementi di una lista
in modo più conciso.
Linea 16 utilizza la seguente semplice fstring (abbreviazione di stringa formattata ) per formattare questo
risultato dello script inserendo il valore di media in una stringa:
La lettera f prima dell'apice della stringa indica che si tratta di una stringa. Tu specifichi
dove inserire i valori utilizzando segnaposto delimitati da parentesi graffe ({e}). Il
segnaposto
{media}
converte il valore della media variabile in una rappresentazione di stringa, quindi lo sostituisce
C
Pagina 109
{average} con quel testo sostitutivo . Le espressioni di testo sostitutivo possono contenere
valori, variabili o altre espressioni, come calcoli o chiamate di funzioni. Nella riga 16,
avremmo potuto usare total / grade_counter al posto della media, eliminando il
è necessaria la riga 15.
Sviluppa un programma di valutazione della classe che elabori un numero arbitrario di voti
ogni volta che il programma viene eseguito.
La dichiarazione dei requisiti non indica quali sono i voti o quanti ce ne sono,
quindi faremo in modo che l'utente inserisca i voti. Il programma elabora un arbitrario
numero di voti. L'utente inserisce i voti uno alla volta finché tutti i voti sono stati
inserito, quindi immette un valore sentinella (chiamato anche valore del segnale , valore fittizio o un
valore flag ) per indicare che non ci sono più voti.
Il seguente script risolve il problema della media della classe con l'iterazione controllata dalla sentinella.
Si noti che testiamo la possibilità di divisione per zero. Se non viene rilevato, ciò causerebbe
un errore logico fatale. Nel capitolo "File ed eccezioni", scriviamo programmi che
riconoscere tali eccezioni e intraprendere azioni appropriate.
1 # class_average_sentinel.py
2 "" "Programma medio di classe con iterazione controllata da sentinella." ""
3
4 # fase di inizializzazione
5 totale = 0 # somma dei voti
6 grade_counter = 0 # numero di voti inseriti
7
8 # fase di elaborazione
9 grado = int (input ( 'Inserisci voto, 1 alla fine:' )) # ottieni un voto
10
11 mentre voto! = 1 :
12 totale + = voto
13 contatore_gradi + = 1
14 grado = int (input ( 'Inserisci voto, 1 alla fine:' ))
15
16 # fase di terminazione
17 if grade_counter! = 0 :
Nell'iterazione controllata dalla sentinella, il programma legge il primo valore (riga 9) prima
raggiungendo l'istruzione while. Il valore immesso nella riga 9 determina se il file
il flusso di controllo del programma dovrebbe entrare nella suite di while (righe 12-14). Se la condizione
nella riga 11 è False, l'utente ha inserito il valore sentinel (1), quindi la suite non lo fa
eseguire perché l'utente non ha inserito alcun voto. Se la condizione è True, la suite
grade_counter.
Successivamente, la riga 14 immette un altro grado dall'utente e la condizione (riga 11) viene verificata
ancora una volta, utilizzando il voto più recente inserito dall'utente. Il valore del voto è sempre
input immediatamente prima che il programma verifichi la condizione while, in modo che possiamo determinare
se il valore appena inserito è la sentinella prima di elaborare quel valore come un voto.
Quando viene immesso il valore sentinella, il ciclo termina e il programma non aggiunge –1
al totale. In un ciclo controllato da sentinel che esegue l'input dell'utente, qualsiasi prompt (righe 9
e 14) dovrebbe ricordare all'utente il valore sentinella.
Questo esempio ha formattato la media della classe con due cifre a destra del decimale
punto. In una fstring, puoi opzionalmente seguire un'espressione di testo sostitutivo con un
due punti (:) e un identificatore di formato che descrive come formattare il testo sostitutivo.
L'identificatore di formato .2f (riga 19) formatta la media come numero a virgola mobile (f)
con due cifre a destra del punto decimale (.2). In questo esempio, la somma di
i voti erano 257, che, quando diviso per 3, restituisce 85,666666666 .... Formattando il file
media con .2f lo arrotonda alla posizione dei centesimi, producendo la sostituzione
C
Pagina 111
testo 85.67. Sarebbe una media con solo una cifra a destra del punto decimale
formattato con uno zero finale (ad esempio, 85,50). Il capitolo "Stringhe: uno sguardo più profondo"
La versione a tre strumenti dell'intervallo di funzioni produce una sequenza di numeri interi dal primo
valore dell'argomento fino a, ma non incluso, il valore del secondo argomento, incrementando
dal valore del terzo argomento, che è noto come il passaggio :
sei nel settore bancario o in altri campi che richiedono una precisione "da un centesimo", dovresti
indagare in profondità le capacità di Decimal.
Per la maggior parte delle applicazioni scientifiche e matematiche che utilizzano numeri con decimale
punti, i numeri in virgola mobile incorporati di Python funzionano bene. Ad esempio, quando noi
parliamo di una temperatura corporea “normale” di 98,6, non abbiamo bisogno di essere precisi alla grande
numero di cifre. Quando osserviamo la temperatura su un termometro e la leggiamo come 98,6,
il valore effettivo può essere 98,5999473210643. Il punto qui è che chiamare questo numero
98.6 è adeguato per la maggior parte delle applicazioni a temperatura corporea.
I valori in virgola mobile sono memorizzati in formato binario (abbiamo introdotto binario nel primo
capitolo e discuterne in profondità nell'appendice in linea "Sistemi numerici"). Alcuni
i valori in virgola mobile vengono rappresentati solo approssimativamente quando vengono convertiti in
binario. Ad esempio, considera l'importo variabile con il valore di dollari e centesimi
112.31. Se visualizzi l'importo, sembra che abbia il valore esatto che gli hai assegnato:
Molte applicazioni richiedono una rappresentazione precisa di numeri con punti decimali.
Istituzioni come le banche che gestiscono milioni o addirittura miliardi di transazioni al giorno
devono legare le loro transazioni "al centesimo". I numeri in virgola mobile possono rappresentare
alcuni ma non tutti gli importi monetari con precisione in centesimi.
1
La libreria standard di Python fornisce molte funzionalità predefinite che puoi utilizzare
nel codice Python per evitare di "reinventare la ruota". Per calcoli monetari e
altre applicazioni che richiedono una rappresentazione e manipolazione precise dei numeri
C
Pagina 113
con punti decimali, la libreria standard Python fornisce il tipo Decimal , che utilizza un file
schema di codifica speciale per risolvere il problema della precisione del centesimo. Quello schema
richiede memoria aggiuntiva per contenere i numeri e tempo di elaborazione aggiuntivo
esegue calcoli ma fornisce la precisione richiesta per i calcoli monetari.
Le banche devono anche affrontare altri problemi come l'utilizzo di un algoritmo di arrotondamento equo quando
2
stanno calcolando l'interesse giornaliero sui conti. Il tipo Decimal offre tali funzionalità.
1
ttps: //docs.python.org/3.7/library/index.html .
2
Per ulteriori funzionalità del modulo decimale, visitare
ttps: //docs.python.org/3.7/library/decimal.html .
Abbiamo usato diversi tipi incorporati : int (per interi, come 10), float (per floatingpoint
numeri, come 7.5) e str (per stringhe come "Python"). Il tipo Decimal non viene creato
in Python. Piuttosto, fa parte della libreria standard Python, che è divisa in
gruppi di capacità correlate chiamate moduli . Il modulo decimale definisce il tipo
Per usare il tipo Decimal, devi prima importare l'intero modulo decimale, come in
importa decimale
e fare riferimento al tipo Decimal come decimal.Decimal, oppure è necessario indicare uno specifico
capacità di importare utilizzando from import , come facciamo qui:
Questo importa solo il tipo Decimal dal modulo decimal in modo che tu possa usarlo
nel codice. Discuteremo altre forme di importazione a partire dal prossimo capitolo.
Creazione di decimali
hC
Pagina 114
In [5]: principal = Decimal ( '1000.00' )
In [6]: principale
In uscita [6]: decimale ("1000,00")
In [8]: tasso
In uscita [8]: decimale ("0,05")
Aritmetica decimale
I decimali supportano gli operatori aritmetici standard +,, *, /, //, ** e%, oltre a
i corrispondenti incarichi aumentati:
In [11]: x + y
Fuori [11]: Decimale ('12,5 ')
In [12]: x // y
Fuori [12]: Decimale ("5")
In [13]: x + = y
In [14]: x
Fuori [14]: Decimale ('12,5 ')
Calcoliamo l'interesse composto utilizzando il tipo Decimale per un valore monetario preciso
calcoli. Considera la seguente dichiarazione dei requisiti:
Una persona investe $ 1000 in un conto di risparmio con un interesse del 5%. Supponendo che il file
persona lascia tutti gli interessi in deposito nel conto, calcola e visualizza l'importo
di denaro sul conto alla fine di ogni anno per 10 anni. Utilizza il seguente
formula per determinare queste quantità:
n Pagina 115
a = p (1 + r )
dove
n è il numero di anni e
Per risolvere questo problema, usiamo le variabili principal e rate che abbiamo definito in
frammenti [5] e [7] e un'istruzione for che esegue il calcolo degli interessi per
ciascuno dei 10 anni in cui il denaro rimane in deposito. Per ogni anno, il ciclo mostra un file
stringa formattata contenente il numero dell'anno e l'importo del deposito alla fine del
quell'anno:
n
L'espressione algebrica (1 + r) dalla dichiarazione dei requisiti è scritta come
( 1 + tariffa) ** anno
C
Pagina 116
La dichiarazione
usa una stringa con due segnaposto per formattare l'output del ciclo.
Il segnaposto
{anno:> 2}
utilizza l'identificatore di formato> 2 per indicare che il valore dell'anno deve essere allineato a destra (>)
in un campo di larghezza 2: la larghezza del campo specifica il numero di posizioni dei caratteri da utilizzare
durante la visualizzazione del valore. Per i valori dell'anno a una cifra da 1 a 9, l'identificatore di formato
> 2 visualizza uno spazio seguito dal valore, allineando così a destra gli anni nel
prima colonna. Il diagramma seguente mostra i numeri 1 e 10 ciascuno formattato in a
larghezza del campo di 2:
{importo:> 10.2f}
formatta la quantità come numero a virgola mobile (f) allineato a destra (>) in una larghezza di campo di 10
con un punto decimale e due cifre a destra del punto decimale (.2). Formattazione
gli importi in questo modo allineano verticalmente i loro punti decimali , come è tipico con monetario
importi. Nelle posizioni di 10 caratteri, i tre caratteri più a destra sono i numeri
punto decimale seguito dalle due cifre alla sua destra. I restanti sette caratteri
le posizioni sono gli spazi iniziali e le cifre a sinistra del punto decimale. In questo
Ad esempio, tutti gli importi in dollari hanno quattro cifre a sinistra del punto decimale, quindi ciascuno
il numero è formattato con tre spazi iniziali . Il diagramma seguente mostra il file
formattazione per il valore 1050.00:
C
Pagina 117
In uno script, l'esecuzione continuerà con l'istruzione successiva dopo il ciclo for. Il
Le istruzioni while e for hanno ciascuna una clausola else opzionale che viene eseguita solo se il
il ciclo termina normalmente, ovvero non come risultato di un'interruzione.
Operatore booleano e
Per garantire che due condizioni siano entrambe True prima di eseguire un'istruzione di controllo
suite, utilizza l' operatore booleano e per combinare le condizioni. Il codice seguente
definisce due variabili, quindi verifica una condizione che è vera se e solo se entrambe semplici
le condizioni sono Vere: se una delle condizioni semplici (o entrambe) è False, l'intera
e l'espressione è falsa:
In [2]: età = 70
C
combinazioni di valori False e True per expression1 e expression2: tali tabelle Pagina 119
sono chiamate tabelle di verità :
Operatore booleano o
Utilizzare l' operatore booleano o per verificare se una o entrambe le due condizioni sono vere.
Il codice seguente verifica una condizione True se una o entrambe le condizioni semplici lo sono
Vero: l'intera condizione è Falso solo se entrambe le condizioni semplici sono False:
In [4]: semester_average = 83
In [5]: final_exam = 95
C
Pagina 120
final_exam> = 90 determina se il voto finalexam di uno studente era un A.
C
Pagina 121
lecca qui per visualizzare l'immagine del codice
semester_average> = 90 o final_exam> = 90
Nelle espressioni che usano e, rendere la condizione che è più probabile sia False il
condizione più a sinistra. Nelle espressioni dell'operatore o, crea la condizione che è più probabile
essere True la condizione più a sinistra. Queste tecniche possono ridurre l'esecuzione di un programma
tempo.
Operatore booleano no
L' operatore booleano non "inverte" il significato di una condizione: True diventa
False and False diventa True. Questo è un operatore unario: ha un solo operando.
Metti l'operatore not prima di una condizione per scegliere un percorso di esecuzione se il file
la condizione originale (senza l'operatore not) è False, come nel codice seguente:
In [7]: voto = 87
In [9]: se voto! = 1 :
...: print ( 'Il voto successivo è' , voto)
...:
Il grado successivo è 87
C
Pagina 122
La tabella di verità di seguito riassume l'operatore not.
Falso Vero
Vero Falso
Operatori Raggruppamento
() da sinistra a destra
** da destra a sinistra
+ da sinistra a destra
T
e da sinistra a destra Pagina 123
o da sinistra a destra
mediana: il valore medio quando tutti i valori sono disposti in ordine ordinato .
Queste sono misure di tendenza centrale: ciascuna è un modo per produrre un singolo valore
che rappresenta un valore "centrale" in un insieme di valori, cioè un valore che è in un certo senso
tipico degli altri.
In [1]: voti = [ 85 , 93 , 45 , 89 , 85 ]
max (introdotto nel capitolo precedente), sum e len sono entrambi esempi di
riduzioni della programmazione in stile funzionale: riducono una raccolta di valori a
valore singolo: la somma di questi valori e il numero di valori, rispettivamente. Nel ezione
C
S
Pagina 124
Nell'esempio della media della classe .8 , avremmo potuto eliminare le righe 10-15 dello script e
ha sostituito la media nella riga 16 con il calcolo dello snippet [2].
Il modulo delle statistiche della libreria standard Python fornisce funzioni per
calcolare la media, la mediana e il modo: anche queste sono riduzioni. Per usarli
funzionalità, prima importa il modulo delle statistiche:
Quindi, puoi accedere alle funzioni del modulo con "statistiche". seguito dal
nome della funzione da chiamare. Quanto segue calcola la media dell'elenco dei voti, mediana
e modalità, utilizzando le funzioni media , mediana e modalità del modulo statistiche :
L'argomento di ciascuna funzione deve essere un iterabile, in questo caso l'elenco valuta. Per confermare
che la mediana e la modalità siano corrette, puoi usare la funzione ordinata incorporata per ottenere
una copia dei voti con i suoi valori disposti in ordine crescente:
L'elenco dei voti ha un numero dispari di valori (5), quindi la mediana restituisce il valore medio
(85). Se il numero di valori dell'elenco è pari, mediana restituisce la media dei due
valori medi. Studiando i valori ordinati, puoi vedere che 85 è la modalità perché
si verifica più frequentemente (due volte). La funzione mode causa un'eccezione StatisticsError per
elenchi come
[ 85 , 93 , 45 , 89 , 85 , 93 ]
in cui sono presenti due o più valori “più frequenti”. Si dice che un tale insieme di valori sia
3C
Pagina 125
imodal . Qui, sia 85 che 93 si verificano due volte.
3.15 WRAP-UP
In questo capitolo, abbiamo discusso le istruzioni di controllo di Python, incluso if, if ... else,
if ... elif ... else, while, for, break and continue. Hai visto che il per
l'istruzione esegue l'iterazione controllata dalla sequenza: elabora ogni elemento in un file
iterabile, come un intervallo di numeri interi, una stringa o un elenco. Hai usato la funzione incorporata
intervallo per generare sequenze di numeri interi da 0 fino a, ma escluso, il suo argomento,
e per determinare quante volte un'istruzione for itera.
Hai usato l'iterazione controllata da sentinella con l'istruzione while per creare un ciclo che
continua l'esecuzione fino a quando non viene rilevato un valore sentinella. Hai usato la funzione incorporata
la versione a due argomenti dell'intervallo per generare sequenze di numeri interi dal primo
il valore dell'argomento fino al valore del secondo argomento, ma escluso. Hai anche usato
la versione a tre documenti in cui il terzo argomento indicava il passaggio tra
numeri interi in un intervallo.
Abbiamo introdotto il tipo Decimale per calcoli monetari precisi e lo abbiamo utilizzato
calcolare l'interesse composto. Hai usato fstrings e vari specificatori di formato per creare
output formattato. Abbiamo introdotto le istruzioni break e continue per modificare il file
flusso di controllo in loop. Abbiamo discusso degli operatori booleani and, or and not for
creando condizioni che combinano condizioni semplici.
Infine, abbiamo continuato la nostra discussione sulle statistiche descrittive introducendo misure di
tendenza centrale - media, mediana e modo - e calcolandoli con funzioni da
il modulo delle statistiche della Python Standard Library.
Nel prossimo capitolo, creerai funzioni personalizzate e utilizzerai funzioni esistenti da
Matematica di Python e moduli casuali. Mostriamo diversi funzionali predefiniti
riduzioni della programmazione e vedrai una programmazione funzionale aggiuntiva
capacità.
https://avxhm.se/blogs/hill0
b
Pagina 126
laylist
storia . Funzioni
Obiettivi
opiche
In questo capitolo, tu
guadagnando Pat
Importa e utilizza i moduli della libreria standard Python, come random e math, in
ighlights
riutilizza il codice ed evita di "reinventare la ruota".
Supporto
Genera un intervallo di numeri casuali.
Disconnessione
Vedi le tecniche di simulazione che utilizzano la generazione di numeri casuali.
Comprendi come l'ambito di un identificatore determina dove puoi utilizzare nel tuo programma
esso.
4
Contorno Pagina 127
.1 Introduzione
.4 Generazione RandomNumber
.16 Ricorsione
.19 WrapUp
4.1 INTRODUZIONE
4
Pagina 128
In questo capitolo, continuiamo la nostra discussione sui fondamenti di Python con custom
funzioni e argomenti correlati. Useremo il modulo random della Python Standard Library
e la generazione di numeri casuali per simulare il lancio di un dado a sei facce. Ci uniremo
funzioni personalizzate e generazione di numeri casuali in uno script che implementa i dadi
gioco di dadi. In questo esempio, introdurremo anche il tipo e l'uso di sequenza di tupla di Python
tuple per restituire più di un valore da una funzione. Discuteremo di seeding del casuale
generatore di numeri per garantire la riproducibilità.
Importerai il modulo matematico della libreria standard Python, quindi lo userai per saperne di più
Completamento della scheda IPython, che accelera i processi di codifica e rilevamento. Tu
creare funzioni con valori di parametro predefiniti, chiamare funzioni con argomenti di parole chiave
e definire funzioni con elenchi di argomenti arbitrari. Mostreremo i metodi di chiamata
di oggetti. Discuteremo anche di come l'ambito di un identificatore determina dove nel tuo
programma puoi usarlo.
Daremo uno sguardo più approfondito all'importazione di moduli. Vedrai che gli argomenti sono passati
riferimento alle funzioni. Dimostreremo anche una funzione ricorsiva e inizieremo
presentando le capacità di programmazione in stile funzionale di Python.
Nella sezione Introduzione alla scienza dei dati, continueremo la nostra discussione sul descrittivo
statistiche introducendo misure di dispersione (varianza e deviazione standard) e
calcolandoli con funzioni tratte dalle statistiche della Python Standard Library
modulo.
Le istruzioni che definiscono la funzione nel primo frammento vengono scritte una sola volta, ma possono
essere chiamato "a fare il proprio lavoro" da molti punti durante il programma e tutte le volte che si
piace. La chiamata di square con un argomento non numerico come "hello" causa un'eccezione TypeError
perché l'operatore di esponenziazione (**) funziona solo con valori numerici.
Le parentesi obbligatorie contengono l' elenco dei parametri della funzione, separati da virgole
elenco di parametri che rappresentano i dati di cui la funzione ha bisogno per svolgere il proprio compito.
La funzione quadrato ha un solo parametro denominato numero: il valore da quadrare. Se
le parentesi sono vuote, la funzione non utilizza parametri per svolgere il proprio compito.
Le linee rientrate dopo i due punti (:) sono il blocco della funzione , che consiste in un
docstring facoltativo seguito dalle istruzioni che eseguono il compito della funzione. Bene
sottolinea subito la differenza tra il blocco di una funzione e la suite di un'istruzione di controllo.
La Guida allo stile per il codice Python dice che la prima riga in un blocco di funzione dovrebbe essere un file
docstring che spiega brevemente lo scopo della funzione:
Per fornire maggiori dettagli, puoi utilizzare una docstring su più righe, consigliato dalla guida allo stile
iniziando con una breve spiegazione, seguita da una riga vuota e dai dettagli aggiuntivi.
Quando una funzione termina l'esecuzione, restituisce il controllo al suo chiamante, ovvero la riga di
codice che ha chiamato la funzione. Nel blocco di square, l' istruzione return :
Pagina 130
numero di ritorno ** 2
Fuori [3].
Le chiamate di funzione possono anche essere incorporate nelle espressioni. Il codice seguente chiama square
prima, poi stampa mostra il risultato:
Esistono altri due modi per restituire il controllo da una funzione al suo chiamante:
Quando non c'è un'istruzione return in una funzione, restituisce implicitamente il valore
Nessuno dopo aver eseguito l'ultima istruzione nel blocco della funzione.
Variabili locali
Sebbene non abbiamo definito le variabili nel blocco di square, è possibile farlo. UN
i parametri e le variabili della funzione definiti nel suo blocco sono tutte variabili locali: esse
può essere utilizzato solo all'interno della funzione ed esiste solo mentre la funzione è in esecuzione.
Il tentativo di accedere a una variabile locale al di fuori del blocco della sua funzione provoca un NameError,
indicando che la variabile non è definita.
IPython può aiutarti a conoscere i moduli e le funzioni che intendi utilizzare nel tuo
codice, così come IPython stesso. Ad esempio, per visualizzare la docstring di una funzione per sapere come
per utilizzare la funzione, digita il nome della funzione seguito da un punto interrogativo (?) :
C
Pagina 131
In [5]: quadrato?
Firma: quadrato (numero)
Docstring: Calcola il quadrato del numero.
File: ~ / Documents / examples / ch04 / <ipythoninput17268c8ff93a9>
Tipo: funzione
Il nome del file contenente la definizione della funzione. Per una funzione in un file
sessione interattiva, questa riga mostra le informazioni per lo snippet che ha definito il file
funzione: l'1 in "<ipythoninput17268c8ff93a9>" significa snippet [1].
Il tipo di elemento per il quale si accede al meccanismo di aiuto di IPython, in questo caso,
una funzione.
Se il codice sorgente della funzione è accessibile da IPython, come una funzione definita in
la sessione corrente o importata nella sessione da un file .py: puoi utilizzare ?? per
visualizzare la definizione completa del codice sorgente della funzione:
In [6]: quadrato ??
Firma: quadrato (numero)
Fonte:
def quadrato (numero):
"" "Calcola il quadrato del numero." ""
numero di ritorno ** 2
File: ~ / Documents / examples / ch04 / <ipythoninput17268c8ff93a9>
Tipo: funzione
Se la docstring si adatta alla finestra, IPython visualizza il successivo prompt In []. Se una
docstring è troppo lungo per adattarsi, IPython indica che c'è di più visualizzando i due punti (:)
nella parte inferiore della finestra: premere il tasto Spazio per visualizzare la schermata successiva. Puoi
navigare avanti e indietro attraverso la docstring con la freccia su e giù
tasti, rispettivamente. IPython mostra (END) alla fine della docstring. Premere q (per
"Quit") in qualsiasi: o al prompt (END) per tornare al prompt In [] successivo. Prendere un
C
Pagina 132
senso delle caratteristiche di IPython, tipo? in qualsiasi prompt di In [], premere Invio , quindi leggere il file
guida panoramica della documentazione.
—La sessione seguente chiama la funzione tre volte con numeri interi, virgola mobile
rispettivamente numeri e stringhe.
In [2]: massimo ( 12 , 27 , 36 )
Fuori [2]: 36
Non abbiamo inserito righe vuote sopra e sotto le istruzioni if, perché premendo
ritorno su una riga vuota in modalità interattiva completa la definizione della funzione.
Puoi anche chiamare il massimo con tipi misti, come int e float:
La funzione massima specifica tre parametri in un elenco separato da virgole. Snippet [2]
C
Pagina 133
gli argomenti 12, 27 e 36 sono assegnati ai parametri valore1, valore2 e
valore3, rispettivamente.
Inizialmente, assumiamo che value1 contenga il valore più grande, quindi lo assegniamo a
variabile locale max_value. Naturalmente, è possibile che value2 o value3 contengano
il valore più grande effettivo, quindi dobbiamo ancora confrontare ciascuno di questi con max_value.
Ora, max_value contiene il valore più grande, quindi lo restituiamo. Quando il controllo ritorna a
il chiamante, i parametri value1, value2 e value3 e la variabile max_value
nel blocco della funzione, che sono tutte variabili locali, non esistono più.
Per molte attività comuni, le capacità di cui hai bisogno esistono già in Python. Per
esempio, le funzioni incorporate max e min sanno come determinare il valore più grande e
il più piccolo dei loro due o più argomenti, rispettivamente:
In [7]: min ( 15 , 9 , 27 , 14 )
Uscita [7]: 9
Ognuna di queste funzioni può anche ricevere un argomento iterabile, come un elenco o una stringa.
Utilizzo di funzioni incorporate o funzioni dai moduli della libreria standard di Python
piuttosto che scrivere il tuo può ridurre i tempi di sviluppo e aumentare il programma
affidabilità, portabilità e prestazioni. Per un elenco delle funzioni integrate di Python e
moduli, vedere
ttps: //docs.python.org/3/library/index.html
Produciamo 10 numeri interi casuali nell'intervallo 1-6 per simulare il lancio di un dado a sei facce:
Per prima cosa, importiamo random in modo da poter utilizzare le capacità del modulo. Il randrange
la funzione genera un numero intero dal primo valore dell'argomento fino al, ma non incluso, il
secondo valore di argomento. Usiamo quindi il tasto freccia su per richiamare l'istruzione for
premere Invio per rieseguirlo. Si noti che vengono visualizzati valori diversi :
Se randrange produce veramente numeri interi a caso, ogni numero nel suo intervallo ha un
uguale probabilità (o probabilità o probabilità ) di essere restituito ogni volta che lo chiamiamo. Per
mostrare che le facce 1–6 del dado si verificano con la stessa probabilità, simula il seguente script
6.000.000 di tiri di dado. Quando esegui lo script, ogni faccia della fustella dovrebbe apparire approssimativamente
1.000.000 di volte, come nell'output di esempio.
C
Pagina 135
lecca qui per visualizzare l'immagine del codice
1 # fig04_01.py
2 "" "Tira un dado a sei facce 6.000.000 di volte." ""
3 importazione casuale
4
5 # contatori di frequenza del viso
6 frequenza1 = 0
7 frequenza2 = 0
8 frequenza3 = 0
9 frequenza4 = 0
10 frequenza5 = 0
11 frequenza6 = 0
12
13 # 6.000.000 di dado
14 per roll in range ( 6_000_000 ): # nota i separatori di sottolineatura
15 face = random.randrange ( 1 , 7 )
16
17 # incrementa il contatore di volti appropriato
18 se faccia == 1 :
19 frequenza1 + = 1
20 elif face == 2:
21 frequenza2 + = 1
22 elif face == 3:
23 frequenza3 + = 1
24 elif face == 4:
25 frequenza4 + = 1
26 elif face == 5:
27 frequenza5 + = 1
28 elif face == 6:
29 frequenza6 + = 1
30
31 print (f 'Face { "Frequency" :> 13 } ' )
32 print (f ' { 1 :> 4 } {frequency1:> 13 } ' )
33 print (f ' { 2 :> 4 } {frequency2:> 13 } ' )
34 print (f ' { 3 :> 4 } {frequency3:> 13 } ' )
35 print (f ' { 4 :> 4 } {frequency4:> 13 } ' )
36 print (f ' { 5 :> 4 } {frequency5:> 13 } ' )
37 print (f ' { 6 :> 4 } {frequency6:> 13 } ' )
C
Pagina 136
Lo script utilizza istruzioni di controllo annidate (un'istruzione if elif annidata nel file for
dichiarazione) per determinare il numero di volte in cui ogni faccia del dado appare. L'istruzione for
itera 6.000.000 di volte. Abbiamo usato il separatore di cifre di sottolineatura (_) di Python per creare il file
valore 6000000 più leggibile. L'intervallo di espressioni (6.000.000) sarebbe
sbagliato. Le virgole separano gli argomenti nelle chiamate di funzione, quindi Python tratterebbe
range (6.000.000) come chiamata a range con i tre argomenti 6, 0 e 0.
Per ogni tiro di dado, lo script aggiunge 1 alla variabile contatore appropriata. Corri il
programma e osservare i risultati. Il completamento di questo programma potrebbe richiedere alcuni secondi
esecuzione. Come vedrai, ogni esecuzione produce risultati diversi . Nota che non l'abbiamo fatto
fornire una clausola else nell'istruzione if elif.
1
Secondo la documentazione, Python basa il valore seed sull'orologio di sistema o
una fonte di casualità dipendente dal sistema operativo. Per applicazioni che richiedono sicurezza
numeri casuali, come la crittografia, la documentazione consiglia di utilizzare l'estensione
modulo segreti, piuttosto che il modulo casuale.
In [4]: random.seed ( 32 )
Tiri due dadi a sei facce, ciascuna con facce contenenti uno, due, tre, quattro, cinque e
sei punti, rispettivamente. Quando i dadi si fermano, la somma dei punti sui due
vengono calcolate le facce verso l'alto. Se la somma è 7 o 11 al primo tiro, vinci. Se la somma è
2, 3 o 12 al primo lancio (chiamato "craps"), perdi (cioè, la "casa" vince). Se la somma è
4, 5, 6, 8, 9 o 10 al primo tiro, quella somma diventa il tuo "punto". Per vincere, devi
continuare a tirare i dadi fino a quando non "ottieni il tuo punto" (cioè, tira lo stesso valore in punti).
Perdi tirando un 7 prima di raggiungere il tuo punto.
1 # fig04_02.py
2 "" "Simula il gioco dei dadi Craps." ""
3 importazione casuale
4
5 def roll_dice ():
6 "" "Lancia due dadi e restituisci i loro valori nominali come una tupla." ""
7 die1 = random.randrange ( 1 , 7 )
8 die2 = random.randrange ( 1 , 7 )
9 return (die1, die2) # racchiude i valori nominali del dado in una tupla
10
11 def display_dice (dice):
12 "" "Mostra un lancio dei due dadi." ""
13 die1, die2 = dice # scompatta la tupla nelle variabili die1 e die2
14 print (f 'Player rolled {die1} + {die2} = {sum (dice)} ' )
15 Pagina 138
16 die_values = roll_dice () # primo lancio
17 display_dice (die_values)
18
19 # determina lo stato e il punteggio del gioco, in base al primo tiro
20 sum_of_dice = sum (die_values)
21
22 if sum_of_dice in ( 7 , 11 ): # win
23 game_status = ' VINTO '
24 elif sum_of_dice in ( 2 , 3 , 12 ): # perde
25 game_status = 'LOST'
26 else : # ricorda il punto
27 game_status = 'CONTINUA'
28 my_point = sum_of_dice
29 print ( 'Point is' , my_point)
30
31 # continua a tirare finché il giocatore non vince o perde
32 while game_status == 'CONTINUA' :
33 die_values = roll_dice ()
34 display_dice (die_values)
35 sum_of_dice = sum (die_values)
36
37 if sum_of_dice == my_point: # vinci guadagnando punti
38 game_status = ' VINTO '
39 elif sum_of_dice == 7: # perde tirando 7
40 game_status = 'LOST'
41
42 # visualizza il messaggio "vince" o "perde"
43 se game_status == 'WON':
44 print ( 'Il giocatore vince' )
45 altro :
46 print ( 'Player perde' )
Il giocatore ha ottenuto 2 + 5 = 7
Il giocatore vince
Il giocatore ha ottenuto 1 + 2 = 3
Il giocatore perde
C
Pagina 139
Il giocatore ha ottenuto 5 + 4 = 9
Il punto è 9
Il giocatore ha ottenuto 4 + 4 = 8
Il giocatore ha ottenuto 2 + 3 = 5
Il giocatore ha ottenuto 5 + 4 = 9
Il giocatore vince
Il giocatore ha ottenuto 1 + 5 = 6
Il punto è 6
Il giocatore ha ottenuto 1 + 6 = 7
Il giocatore perde
La funzione roll_dice (righe 5–9) simula il lancio di due dadi a ogni lancio. La funzione
viene definito una volta, quindi richiamato da più punti del programma (righe 16 e 33). Il
un elenco di parametri vuoto indica che roll_dice non richiede argomenti per l'esecuzione
il suo compito.
Le funzioni incorporate e personalizzate che hai chiamato finora restituiscono ciascuna un valore.
A volte è utile restituire più di un valore, come in roll_dice, che restituisce
entrambi i valori die (linea 9) come tupla -an immutabili (cioè non modificabili) sequenze
di valori. Per creare una tupla, separa i suoi valori con virgole, come nella riga 9:
(die1, die2)
Questo è noto come impacchettare una tupla . Le parentesi sono facoltative, ma consigliamo
usandoli per chiarezza. Discuteremo approfonditamente le tuple nel prossimo capitolo.
Funzione display_dice
Per utilizzare i valori di una tupla, puoi assegnarli a un elenco di variabili separato da virgole,
che decomprime la tupla. Per visualizzare ogni lancio di dadi, la funzione display_dice
(definito nelle righe 11-14 e chiamato nelle righe 17 e 34) decomprime l'argomento della tupla it
riceve (riga 13). Il numero di variabili a sinistra di = deve corrispondere al numero di
elementi nella tupla; in caso contrario, si verifica un'eccezione ValueError. La riga 14 stampa un file formattato
stringa contenente sia i valori del dado che la loro somma. Calcoliamo la somma dei dadi di
C
Pagina 140
passando la tupla alla funzione di somma incorporata: come una lista, una tupla è una sequenza.
Notare che le funzioni roll_dice e display_dice iniziano ciascuna i propri blocchi con un
docstring che indica cosa fa la funzione. Inoltre, entrambe le funzioni contengono variabili locali
die1 e die2. Queste variabili non "entrano in collisione", perché appartengono a differenti
blocchi di funzioni. Ogni variabile locale è accessibile solo nel blocco che l'ha definita.
Primo tiro
Quando lo script inizia l'esecuzione, le righe 16-17 lanciano i dadi e visualizzano i risultati. Linea
20 calcola la somma dei dadi da utilizzare nelle righe 22-29. Puoi vincere o perdere al primo
rotolo o qualsiasi rotolo successivo. La variabile game_status tiene traccia della vittoria / sconfitta
stato.
L' operatore in linea 22
sum_of_dice in ( 7 , 11 )
È vero, hai ottenuto un 7 o un 11. In questo caso, hai vinto al primo tiro, quindi il copione si imposta
game_status su "WON". L'operando destro dell'operatore può essere qualsiasi iterabile. C'è anche
un operatore non in per determinare se un valore non è in un iterabile. Il precedente
condizione concisa è equivalente a
(sum_of_dice == 7 ) o (sum_of_dice == 11 )
sum_of_dice in ( 2 , 3 , 12 )
verifica se la tupla (2, 3, 12) contiene il valore di sum_of_dice. Se è così, hai perso
il primo tiro, quindi lo script imposta game_status su "LOST".
C
Pagina 141
la riga 28 memorizza la somma dei dadi in my_point per tenere traccia di ciò che devi tirare
vincere e
Rotoli successivi
Se game_status è uguale a "CONTINUE" (riga 32), non hai vinto o perso, quindi il
while la suite dell'istruzione (righe 33–40) viene eseguita. Ogni iterazione del ciclo chiama roll_dice,
visualizza i valori della fustella e calcola la loro somma. Se sum_of_dice è uguale a my_point
(riga 37) o 7 (riga 39), lo script imposta game_status su "WON" o "LOST",
rispettivamente, e il ciclo termina. In caso contrario, il ciclo while continua l'esecuzione
con il prossimo tiro.
Un modulo è un file che raggruppa funzioni, dati e classi correlati. Il tipo Decimal
dal modulo decimale della libreria standard Python è in realtà una classe. Abbiamo introdotto
classi brevemente in capitolo 1 e discuterli in dettaglio in "ObjectOriented
Capitolo "Programmazione". Un pacchetto raggruppa i moduli correlati. In questo libro lavorerai
con molti moduli e pacchetti preesistenti e creerai i tuoi moduli - in formato
infatti, ogni file codice sorgente Python (.py) che crei è un modulo. La creazione di pacchetti è
oltre lo scopo di questo libro. Sono tipicamente usati per organizzare una grande biblioteca
funzionalità in sottoinsiemi più piccoli che sono più facili da mantenere e possono essere importati
separatamente per comodità. Ad esempio, la libreria di visualizzazione matplotlib che abbiamo
utilizzare in
la sezione 5.17 ha funzionalità estese (la sua documentazione è di oltre 2300 pagine),
quindi importeremo solo i sottoinsiemi di cui abbiamo bisogno nei nostri esempi (pyplot e animazione).
La libreria standard Python viene fornita con il linguaggio Python di base. I suoi pacchetti
2
ei moduli contengono funzionalità per un'ampia varietà di attività di programmazione quotidiane.
C
S
Pagina 142
Puoi vedere un elenco completo dei moduli della libreria standard su
2
Il tutorial di Python si riferisce a questo come l'approccio incluso nelle batterie.
ttps: //docs.python.org/3/library/
statistica: matematica
decimale: virgola fissa e virgola mobile
funzioni statistiche come media,
aritmetica dei punti, inclusa quella monetaria
mediana, modo e varianza.
calcoli.
Allo stesso modo, lo snippet seguente calcola il valore assoluto di 10 chiamando la matematica
la funzione fabs del modulo , che restituisce il risultato come valore float:
In [3]: math.fabs ( 10 )
Uscita [3]: 10.0
Alcune funzioni del modulo matematico sono riepilogate di seguito: è possibile visualizzare l'elenco completo all'indirizzo
Pagina 144
ttps: //docs.python.org/3/library/math.html
ceil (9.2) è
10.0
Arrotonda x al numero intero più piccolo non inferiore
ceil ( x )
di x
ceil (9.8) è
9.0
floor (9.2) è
9.0
Arrotonda x al numero intero più grande non maggiore
pavimento ( x )
di x
il pavimento (9.8) è
10.0
exp (1.0) è
2.718282
X
exp ( x ) Funzione esponenziale e
exp (2.0) è
7.389056
registro (2.718282)
è 1.0
Pagina 145
log ( x ) Logaritmo naturale di x (base e ) registro (7.389056)
è 2.0
log10 (10.0) è
1.0
log10 ( x ) Logaritmo di x (base 10)
log10 (100.0)
è 2.0
sqrt (900.0) è
30.0
sqrt ( x ) radice quadrata di x
sqrt (9.0) è
3.0
fabs (5.1) è
Valore assoluto di x: restituisce sempre un valore float.
5.1
Python ha anche la funzione incorporata abs,
fabs ( x )
che restituisce un int o un float, basato su
fabs (5.1) è
il suo argomento.
5.1
4
y .8 UTILIZZO DEL COMPLETAMENTO DELLA SCHEDA IPYTHON PER LA DISCOVERY
Pagina 146
4.8 UTILIZZO DEL COMPLETAMENTO DELLA SCHEDA IPYTHON PER LA DISCOVERY
È possibile visualizzare la documentazione di un modulo in modalità interattiva IPython tramite tab
completamento: una funzione di rilevamento che accelera i processi di codifica e rilevamento.
Dopo aver digitato una parte di un identificatore e premuto Tab , IPython completa l'identificatore
per te o fornisce un elenco di identificatori che iniziano con ciò che hai digitato finora. Questo
può variare in base alla piattaforma del sistema operativo e a ciò in cui è stato importato
la tua sessione IPython:
In [2]: ma <Tab>
map% macro %% markdown
math% magic% matplotlib
max ()% man
È possibile scorrere gli identificatori con i tasti freccia su e giù. Come fai tu,
IPython evidenzia un identificatore e lo mostra a destra del prompt In [].
Per visualizzare un elenco di identificatori definiti in un modulo, digitare il nome del modulo e un punto (.),
quindi premere Tab :
Se ci sono più identificatori da visualizzare rispetto a quelli attualmente mostrati, IPython mostra il>
simbolo (su alcune piattaforme) sul bordo destro, in questo caso a destra del fattoriale ().
È possibile utilizzare i tasti freccia su e giù per scorrere l'elenco. Nell'elenco di
identificatori:
Quelle seguite da parentesi sono funzioni (o metodi, come vedrai più avanti).
Identificatori di parole singole (come Employee) che iniziano con una lettera maiuscola e
C
Pagina 147
identificatori multiparola in cui ogni parola inizia con una lettera maiuscola (come
Identificatori minuscoli senza parentesi, come pi (non mostrato nel file precedente
list) ed e, sono variabili. L'identificatore pi restituisce 3,141592653589793 e
l'identificatore e restituisce 2,718281828459045. Nel modulo di matematica, pi ed e
rappresentano le costanti matematiche π ed e , rispettivamente.
In [4]: math.fabs?
Docstring:
fabs (x)
C
Pagina 148
Quando si definisce una funzione, è possibile specificare che un parametro ha un parametro predefinito
valore . Quando si chiama la funzione, se si omette l'argomento di un parametro con estensione
valore del parametro predefinito, il valore predefinito per quel parametro viene passato automaticamente.
Definiamo una funzione rectangle_area con i valori dei parametri predefiniti:
In [2]: rectangle_area ()
Fuori [2]: 6
passa il valore del parametro predefinito 3 per la larghezza come se avessi chiamato
In [3]: rectangle_area ( 10 )
Uscita [3]: 30
La seguente chiamata a rectangle_area ha argomenti sia per la lunghezza che per la larghezza, quindi
IPython ignora i valori dei parametri predefiniti:
In [4]: rectangle_area ( 10 , 5 )
Uscita [4]: 50
C
Pagina 149
Quando si chiamano funzioni, è possibile utilizzare argomenti di parole chiave per passare argomenti in any
ordine. Per dimostrare gli argomenti delle parole chiave, ridefiniamo rectangle_area
funzione, questa volta senza i valori dei parametri predefiniti:
Ogni argomento della parola chiave in una chiamata ha la forma parametername = value . Il seguente
call mostra che l'ordine degli argomenti delle parole chiave non ha importanza, non è necessario
abbinare le posizioni dei parametri corrispondenti nella definizione della funzione:
In ogni chiamata di funzione, è necessario inserire gli argomenti delle parole chiave dopo il posizionamento di una funzione
argomenti, ovvero qualsiasi argomento per il quale non si specifica il nome del parametro.
Tali argomenti vengono assegnati ai parametri della funzione lefttoright, in base a
posizioni dell'argomento nell'elenco degli argomenti. Gli argomenti delle parole chiave sono utili anche per
migliorare la leggibilità delle chiamate di funzione, specialmente per le funzioni con molti
argomenti.
4.11 ELENCHI ARBITRALI ARBITRALI
Funzioni con elenchi di argomenti arbitrari , come le funzioni incorporate min e max,
può ricevere un numero qualsiasi di argomenti. Considera la seguente chiamata min:
min ( 88 , 75 , 96 , 55 , 83 )
La documentazione della funzione afferma che min ha due parametri obbligatori (denominati
arg1 e arg2) e un terzo parametro facoltativo nella forma * args , che lo indica
la funzione può ricevere un numero qualsiasi di argomenti aggiuntivi. Il * prima del
nome parametro dice a Python di comprimere tutti gli argomenti rimanenti in una tupla che è
passato al parametro args. Nella chiamata precedente, il parametro arg1 riceve 88,
C
Pagina 150
il parametro arg2 riceve 75 e il parametro args riceve la tupla (96, 55, 83).
Definiamo una funzione media che può ricevere un numero qualsiasi di argomenti:
Il nome del parametro args viene utilizzato per convenzione, ma è possibile utilizzare qualsiasi identificatore. Se la
ha più parametri, il parametro * args deve essere il più a destra
parametro.
Ora, chiamiamo media più volte con elenchi di argomenti arbitrari di diversa lunghezza:
In [2]: media ( 5 , 10 )
Uscita [2]: 7.5
In [3]: media ( 5 , 10 , 15 )
Uscita [3]: 10.0
In [4]: media ( 5 , 10 , 15 , 20 )
Fuori [4]: 12.5
Per calcolare la media, dividi la somma degli elementi della tupla args (restituita da
builtin function sum) dal numero di elementi della tupla (restituito dalla funzione builtin
In [5]: voti = [ 88 , 75 , 96 , 55 , 83 ]
La chiamata mostrata sopra è equivalente alla media (88, 75, 96, 55, 83).
In [1]: s = "Hello"
In [3]: s.upper ()
Uscita [3]: "CIAO"
In [4]: s
Uscita [4]: "Ciao"
ttps: //docs.python.org/3/library/index.html
descrive i metodi dei tipi incorporati e dei tipi nella libreria standard Python.
Nel capitolo "Programmazione ObjectOriented", creerai tipi personalizzati chiamati
classi e definire metodi personalizzati che è possibile chiamare su oggetti di tali classi.
Ambito locale
L'identificatore di una variabile locale ha un ambito locale . È "nell'ambito" solo dalla sua definizione a
la fine del blocco della funzione. “Esce dall'ambito” quando la funzione ritorna al suo
chiamante. Quindi, una variabile locale può essere utilizzata solo all'interno della funzione che la definisce.
Ambito globale
Gli identificatori definiti al di fuori di qualsiasi funzione (o classe) hanno un ambito globale: questi possono
includono funzioni, variabili e classi. Le variabili con ambito globale sono note come
variabili globali . Gli identificatori con ambito globale possono essere utilizzati in un file .py o interattivi
In [1]: x = 7
In [3]: access_global ()
x stampato da access_global: 7
Tuttavia, per impostazione predefinita, non è possibile modificare una variabile globale in una funzione, la prima volta
assegna un valore a una variabile nel blocco di una funzione, Python crea una nuova variabile locale:
In [5]: try_to_modify_global ()
x stampato da try_to_modify_global: 3.5
C
Pagina 153
In [6]: x
Fuori [6]: 7
Per modificare una variabile globale in un blocco funzione, è necessario utilizzare un'istruzione globale a
dichiarare che la variabile è definita nell'ambito globale:
In [8]: modify_global ()
x stampato da modify_global: hello
In [9]: x
Uscita [9]: "ciao"
Sono stati ora definiti blocchi funzione e suite di istruzioni di controllo . Quando crei un file
variabile in un blocco, è locale per quel blocco. Tuttavia, quando crei una variabile in un file
suite dell'istruzione di controllo, l'ambito della variabile dipende da dove si trova l'istruzione di controllo
è definito:
Se l'istruzione di controllo è nel blocco di una funzione, tutte le variabili definite nel file
le istruzioni di controllo hanno un ambito locale.
Funzioni di ombreggiatura
C
Pagina 154
Nei capitoli precedenti, durante la somma dei valori, abbiamo memorizzato la somma in una variabile
denominato totale. Il motivo per cui l'abbiamo fatto è che la somma è una funzione incorporata. Se definisci un file
variabile denominata sum, ombreggia la funzione incorporata, rendendola inaccessibile nel tuo file
codice. Quando si esegue la seguente assegnazione, Python associa la somma dell'identificatore a
l'oggetto int che contiene 15. A questo punto, l'identificatore sum non fa più riferimento al file
funzione incorporata. Quindi, quando provi a usare sum come funzione, si verifica un'eccezione TypeError:
In [10]: somma = 10 + 5
In [11]: sum
Uscita [11]: 15
In [12]: sum ([ 10 , 5 ])
Negli script che hai visto finora, abbiamo scritto alcune istruzioni al di fuori delle funzioni nel file
ambito globale e alcune istruzioni all'interno dei blocchi funzione. Dichiarazioni di script a livello globale
scope vengono eseguite non appena vengono incontrate dall'interprete, mentre le istruzioni in
un blocco viene eseguito solo quando viene chiamata la funzione.
import nome_modulo
quindi accedere alle loro funzionalità tramite il nome di ogni modulo e un punto (.). Inoltre, hai
ha importato un identificatore specifico da un modulo (come Decimal
type) con un'istruzione come:
Pagina 155
poi ha usato quell'identificatore senza doverlo precedere con il nome del modulo e un punto
(.).
Utilizzando l'istruzione from import è possibile importare un elenco di identificatori separati da virgole
da un modulo quindi usali nel tuo codice senza doverli precedere con il
nome del modulo e un punto (.):
Il tentativo di utilizzare una funzione non importata provoca un'eccezione NameError, che indica che il file
nome non è definito.
È possibile importare tutti gli identificatori definiti in un modulo con un'importazione di caratteri jolly del modulo
Ciò rende tutti gli identificatori del modulo disponibili per l'uso nel codice. Importazione di un file
gli identificatori del modulo con un'importazione di caratteri jolly possono portare a piccoli errori: è considerato un file
pratica pericolosa che dovresti evitare. Considera i seguenti frammenti:
In [4]: e = "hello"
In [6]: e
Uscita [6]: 2.718281828459045
Inizialmente, assegniamo la stringa "hello" a una variabile denominata e. Dopo aver eseguito snippet
[5] tuttavia, la variabile e viene sostituita, forse per caso, con il modulo di matematica
costante e, che rappresenta il valore matematico in virgola mobile e .
B
C inding nomi per moduli e identificatori di modulo
In [8]: voti = [ 85 , 93 , 45 , 87 , 93 ]
Come vedrai nei capitoli successivi, importa come viene spesso utilizzato per importare le librerie Python
con comode abbreviazioni, come le statistiche per il modulo delle statistiche. Come un altro
esempio, useremo il modulo numpy che tipicamente viene importato con
In genere, quando si importa un modulo, è necessario utilizzare import o import come istruzioni,
quindi accedere al modulo tramite il nome del modulo o l'abbreviazione che segue l'as
parola chiave, rispettivamente. Ciò garantisce di non importare accidentalmente un identificatore
che è in conflitto con uno nel codice.
Con passbyvalue, la funzione chiamata riceve una copia del valore dell'argomento e
funziona esclusivamente con quella copia. Le modifiche alla copia della funzione non influiscono sul file
valore della variabile originale nel chiamante.
C
S
Pagina 157
Con passbyreference, la funzione chiamata può accedere al valore dell'argomento nel file
chiamante direttamente e modificare il valore se è mutabile.
Gli argomenti Python vengono sempre passati per riferimento . Alcune persone chiamano questo passby
3
riferimento all'oggetto, perché "tutto in Python è un oggetto " . Quando una chiamata di funzione
fornisce un argomento, Python copia il riferimento all'oggetto dell'argomento, non l'oggetto
stesso - nel parametro corrispondente. Questo è importante per le prestazioni. Funzioni
manipolano spesso oggetti di grandi dimensioni: spesso copiarli ne consumerebbe grandi quantità
di memoria del computer e prestazioni del programma notevolmente lente.
3
Anche le funzioni che hai definito in questo capitolo e le classi (tipi personalizzati) che utilizzerai
definire nei capitoli successivi sono oggetti in Python.
x= 7
Consideriamo come passiamo argomenti alle funzioni. Per prima cosa, creiamo il numero intero
variabile x menzionata sopra: a breve useremo x come argomento della funzione:
In [1]: x = 7
Ora x si riferisce (o "punta a") l'oggetto intero contenente 7. Non ci sono due oggetti separati
può risiedere allo stesso indirizzo in memoria, quindi ogni oggetto in memoria ha un unico
indirizzo . Sebbene non possiamo vedere l'indirizzo di un oggetto, possiamo usare la funzione id incorporata
Pagina 158
per ottenere un valore int univoco che identifica solo quell'oggetto finché rimane in
memoria (probabilmente otterrai un valore diverso quando lo esegui sul tuo computer):
In [2]: id (x)
Uscita [2]: 4350477840
4
Il risultato intero della chiamata di id è noto come identità dell'oggetto . Non ci sono due oggetti in
la memoria può avere la stessa identità . Useremo le identità degli oggetti per dimostrarlo
gli oggetti vengono passati per riferimento.
4
Secondo la documentazione di Python, a seconda dell'implementazione di Python
che stai usando, l'identità di un oggetto può essere l'effettivo indirizzo di memoria dell'oggetto, ma questo è
non richiesto.
Quindi, chiamiamo cubo con l'argomento x, che si riferisce all'oggetto intero che contiene
7:
Quando una funzione riceve come argomento un riferimento a un immutabile (non modificabile)
oggetto, come int, float, stringa o tupla, anche se hai accesso diretto
all'oggetto originale nel chiamante, non è possibile modificare l'oggetto immutabile originale
valore. Per dimostrarlo, per prima cosa facciamo in modo che il cubo visualizzi l'id (numero) prima e dopo
assegnazione di un nuovo oggetto al numero di parametro tramite un'assegnazione aumentata:
Quando chiamiamo cube (x), la prima istruzione print mostra che id (numero) inizialmente è
lo stesso di id (x) nello snippet [2]. I valori numerici non sono modificabili, quindi l'istruzione
numero ** = 3
crea effettivamente un nuovo oggetto contenente il valore al cubo, quindi assegna il valore di quell'oggetto
riferimento al numero di parametro. Ricordiamo che se non ci sono più riferimenti al file
C
Pagina 160
oggetto originale , verrà raccolto dalla spazzatura . Seconda istruzione print del cubo funzione
mostra l' identità del nuovo oggetto. Le identità degli oggetti devono essere univoche, quindi il numero deve
fare riferimento a un oggetto diverso . Per mostrare che x non è stato modificato, visualizziamo il suo valore e
ancora identità:
4.16 RICURSIONE
Scriviamo un programma per eseguire un famoso calcolo matematico. Considera il
fattoriale di un intero positivo n , che si scrive n ! e pronunciato " n fattoriale". Questo
è il prodotto
n · ( n - 1) · ( n - 2) ··· 1
In [1]: fattoriale = 1
In [3]: fattoriale
Uscita [3]: 120
Il passaggio di ricorsione viene eseguito mentre la chiamata della funzione originale è ancora attiva (ovvero, non lo è
terminata l'esecuzione). Può provocare molte più chiamate ricorsive man mano che la funzione si divide
ogni nuovo sottoproblema in due pezzi concettuali. Per la ricorsione alla fine
terminare, ogni volta che la funzione chiama se stessa con una versione più semplice dell'originale
problema, la sequenza di problemi sempre più piccoli deve convergere su un caso base .
Quando la funzione riconosce il caso base, restituisce un risultato alla copia precedente di
la funzione. Segue una sequenza di ritorni fino a quando la chiamata di funzione originale non restituisce
risultato finale al chiamante.
Puoi arrivare a una rappresentazione fattoriale ricorsiva osservando che n ! può essere scritto
come:
n ! = n · ( n - 1)!
5! = 5 · 4 · 3 · 2 · 1
5! = 5 · (4 · 3 · 2 · 1)
5! = 5 · (4!)
La valutazione di 5! procederà come mostrato di seguito. La colonna di sinistra mostra come il file
la successione di chiamate ricorsive procede fino a 1! (il caso base) viene valutato come 1, che
termina la ricorsione. La colonna di destra mostra i valori dal basso verso l'alto
restituito da ogni chiamata ricorsiva al suo chiamante fino a quando non viene calcolato il valore finale e
Pagina 162
restituito.
problema più piccolo del calcolo originale, fattoriale (numero). Nota che
la funzione fattoriale deve ricevere un argomento non negativo . Non lo testiamo
Astuccio.
10. L'output mostra che i valori fattoriali crescono rapidamente. Python non limita le dimensioni
di un numero intero , a differenza di molti altri linguaggi di programmazione.
Ricorsione indiretta
Una funzione ricorsiva può chiamare un'altra funzione che, a sua volta, può richiamare
la funzione ricorsiva. Questo è noto come chiamata ricorsiva indiretta o indiretta
ricorsione . Ad esempio, la funzione A chiama la funzione B, che effettua una chiamata a
funzione A. Questa è ancora ricorsione perché la seconda chiamata alla funzione A viene effettuata mentre il
la prima chiamata alla funzione A è attiva. Cioè, la prima chiamata alla funzione A non è ancora terminata
in esecuzione (perché è in attesa che la funzione B restituisca un risultato) e non lo ha fatto
restituito al chiamante originale della funzione A.
Naturalmente, la quantità di memoria in un computer è limitata, quindi solo una certa quantità di
la memoria può essere utilizzata per memorizzare i record di attivazione nello stack di chiamate di funzione. Se di più
si verificano chiamate di funzione ricorsive che possono avere i loro record di attivazione memorizzati nello stack,
si verifica un errore irreversibile noto come overflow dello stack . Questo è tipicamente il risultato di infinito
ricorsione , che può essere causata dall'omissione del caso base o dalla scrittura del passaggio di ricorsione
in modo errato in modo che non converga sul case base. Questo errore è analogo a
problema di un ciclo infinito in una soluzione iterativa (non ricorsiva).
Pagina 164
processori multicore di oggi. Il grafico seguente elenca la maggior parte delle funzionalità chiave di Python
capacità di programmazione dello stile e mostra tra parentesi i capitoli in cui abbiamo
inizialmente ne coprono molti.
(4)
immutabilità (4) modulo operatore (5,
11, 16)
decoratori (10)
iterazione interna (4)
funzioni pure (4)
dizionario
iteratori (3)
comprensioni (6)
funzione range (3, 4)
modulo itertools
filtra / mappa / riduci (5)
(16) riduzioni (3, 5)
modulo functools
espressioni lambda impostare le comprensioni (6)
(5)
espressioni generatore (5)
Copriamo la maggior parte di queste funzionalità in tutto il libro, molte con esempi di codice e
altri da una prospettiva di alfabetizzazione. Hai già utilizzato lista, stringa e funzione incorporata
iteratori di intervallo con l'istruzione for e diverse riduzioni (funzioni sum, len,
min e max). Discutiamo di programmazione dichiarativa, immutabilità e interna
iterazione di seguito.
Man mano che le attività che svolgi diventano più complicate, il codice può diventare più difficile da leggere,
eseguire il debug e modificare e più probabile che contenga errori. Specificare come funziona il codice
può diventare complesso.
La programmazione in stile funzionale ti consente di dire semplicemente cosa vuoi fare. Ne nasconde molti
Pagina 165
dettagli su come eseguire ciascuna attività. In genere, il codice della libreria gestisce il come per te. Come
vedrai, questo può eliminare molti errori.
L'istruzione for e la funzione range di Python nascondono la maggior parte delle iterazioni controcontrollate
dettagli. Specificate quale intervallo di valori dovrebbe produrre e la variabile che dovrebbe
ricevere ogni valore così come viene prodotto. La gamma di funzioni sa come produrli
valori. Allo stesso modo, l'istruzione for sa come ottenere ogni valore da range e come
per interrompere l'iterazione quando non ci sono più valori. Specificare cosa , ma non come , è un file
aspetto importante dell'iterazione interna: un concetto chiave di programmazione in stile funzionale.
Le funzioni incorporate di Python sum, min e max usano ciascuna iterazione interna. Per totale
gli elementi della lista voti, dichiari semplicemente cosa vuoi fare, cioè
Funzioni pure
Nel linguaggio di programmazione funzionale puro ti concentri sulla scrittura di funzioni pure.Un puro
il risultato della funzione dipende solo dagli argomenti che le passi. Inoltre, dato un
argomento (o argomenti) particolare, una funzione pura produce sempre lo stesso risultato.
Ad esempio, il valore restituito dalla funzione incorporata sum dipende solo dall'iterabile passato
ad esso. Dato un elenco [1, 2, 3], sum restituisce sempre 6 indipendentemente da quante volte chiami
esso. Inoltre, una funzione pura non ha effetti collaterali . Ad esempio, anche se superi un
mutevole lista per pura funzione, l'elenco conterrà gli stessi valori prima e dopo la
chiamata di funzione. Quando chiami la funzione pura somma, non modifica il suo argomento.
d
C
Pagina 166
In [1]: valori = [ 1 , 2 , 3 ]
In [4]: valori
Uscita [5]: [1, 2, 3]
Nel prossimo capitolo continueremo a utilizzare i concetti di programmazione in stile funzionale. Anche,
vedrai che le funzioni sono oggetti che puoi passare ad altre funzioni come dati.
Per i nostri scopi, calcoleremo ogni misura di dispersione sia manualmente che con
funzioni dalle statistiche del modulo, utilizzando la seguente popolazione di 10 sixsided
rotoli di dado:
1, 3, 4, 2, 6, 5, 3, 4, 5, 2
V ariance
5
Per determinare la varianza , iniziamo con la media di questi valori: 3,5. tu
ottenere questo risultato dividendo la somma dei valori nominali, 35, per il numero di rotoli, 10.
Successivamente, sottraiamo la media da ogni valore di dado (questo produce alcuni risultati negativi):
5
Per semplicità, stiamo ricalcolando la varianza della popolazione . C'è una sottile differenza
tra la varianza della popolazione e la varianza del campione . Invece di dividere per n
(il numero di tiri di dado nel nostro esempio), la varianza del campione divide per n 1. La differenza
è pronunciato per piccoli campioni e diventa insignificante come la dimensione del campione
aumenta. Il modulo di statistica fornisce le funzioni pvariance e
varianza per calcolare rispettivamente la varianza della popolazione e la varianza del campione.
Allo stesso modo, il modulo delle statistiche fornisce le funzioni pstdev e stdev
calcolare la deviazione standard della popolazione e la deviazione standard del campione,
rispettivamente.
2,5, 0,5, 0,5, 1,5, 2,5, 1,5, 0,5, 0,5, 1,5, 1,5
6.25, 0.25, 0.25, 2.25, 6.25, 2.25, 0.25, 0.25, 2.25, 2.25
Infine, calcoliamo la media di questi quadrati, che è 2,25 (22,5 / 10): questo è
la varianza della popolazione . Il quadrato della differenza tra il valore di ogni dado e il valore
La media di tutti i valori del dado enfatizza i valori anomali: i valori più lontani da
significare. Man mano che approfondiamo l'analisi dei dati, a volte vorremo prestare attenzione
attenzione ai valori anomali ea volte vorremo ignorarli. Il codice seguente usa
la funzione pvariance del modulo delle statistiche per confermare il nostro risultato manuale:
In [2]: statistics.pvariance ([ 1 , 3 , 4 , 2 , 6 , 5 , 3 , 4 , 5 , 2 ])
Uscita [2]: 2.25
Deviazione standard
La deviazione standard è la radice quadrata della varianza (in questo caso, 1,5), che
attenua l'effetto dei valori anomali. Minore è la varianza e la deviazione standard
C
Pagina 168
sono, più i valori dei dati sono vicini alla media e minore è la dispersione complessiva (ovvero,
spread ) c'è tra i valori e la media. Il codice seguente calcola il
deviazione standard della popolazione con la funzione pstdev del modulo statistico ,
confermando il nostro risultato manuale:
In [3]: statistics.pstdev ([ 1 , 3 , 4 , 2 , 6 , 5 , 3 , 4 , 5 , 2 ])
Fuori [3]: 1.5
Il passaggio del risultato della funzione pvariance alla funzione sqrt del modulo matematico conferma
il nostro risultato di 1.5:
Vantaggio della deviazione standard della popolazione rispetto alla varianza della popolazione
Supponi di aver registrato le temperature di marzo Fahrenheit nella tua zona. Tu potresti
hanno 31 numeri come 19, 32, 28 e 35. Le unità di questi numeri sono gradi.
Quando si quadrano le temperature per calcolare la varianza della popolazione, le unità di
la varianza della popolazione diventa "gradi al quadrato". Quando prendi la radice quadrata di
la varianza della popolazione per calcolare la deviazione standard della popolazione, le unità una volta
di nuovo diventano gradi, che sono le stesse unità delle vostre temperature.
4.19 WRAP-UP
In questo capitolo abbiamo creato funzioni personalizzate. Abbiamo importato funzionalità da
moduli casuali e matematici. Abbiamo introdotto la generazione di numeri casuali e l'abbiamo usata per
simula il lancio di un dado a sei facce. Abbiamo impacchettato più valori in tuple per restituirne di più
di un valore da una funzione. Abbiamo anche decompresso una tupla per accedere ai suoi valori. Noi
discusso sull'uso dei moduli della libreria standard Python per evitare di “reinventare il
ruota."
Abbiamo creato funzioni con valori di parametro predefiniti e chiamate funzioni con parola chiave
argomenti. Abbiamo anche definito funzioni con elenchi di argomenti arbitrari. Abbiamo chiamato metodi
di oggetti. Abbiamo discusso di come l'ambito di un identificatore determina la posizione del tuo programma
C
Pagina 169
puoi usarlo.
Abbiamo presentato di più sull'importazione di moduli. Hai visto che gli argomenti sono passati
riferimento alle funzioni e come lo stack functioncall e gli stack frame supportano l'estensione
functioncallandreturn meccanismo. Abbiamo anche presentato una funzione ricorsiva e abbiamo iniziato
introducendo le capacità di programmazione in stile funzionale di Python. Abbiamo introdotto
elenco di base e funzionalità delle tuple negli ultimi due capitoli: nel prossimo capitolo, lo faremo
discuterli in dettaglio.
Infine, abbiamo continuato la nostra discussione sulle statistiche descrittive introducendo misure di
dispersione (varianza e deviazione standard) e calcolo con funzioni
dal modulo delle statistiche della Python Standard Library.
Per alcuni tipi di problemi, è utile che le funzioni chiamino se stesse. Un ricorsivo
funzione chiama se stessa, direttamente o indirettamente tramite un'altra funzione.
y
Pagina 170
le liste
Obiettivi
foto
Usa le comprensioni degli elenchi in stile funzionale per creare elenchi in modo rapido e semplice e utilizzarli
espressioni del generatore per generare valori su richiesta.
Contorno
.1 Introduzione
.2 Elenchi
.3 Tuple
5
Pagina 171
.4 Sequenze di disimballaggio
.5 Sequence Slicing
.6 del Statement
.9 Ricerca di sequenze
.18 WrapUp
5.1 INTRODUZIONE
Negli ultimi due capitoli, abbiamo introdotto brevemente l'elenco e i tipi di sequenza di tupla per
che rappresentano raccolte ordinate di oggetti. Le raccolte sono strutture di dati preconfezionate
costituito da elementi di dati correlati. Esempi di raccolte includono le tue canzoni preferite su
il tuo smartphone, la tua lista dei contatti, i libri di una biblioteca, le tue carte in un gioco di carte, il tuo
i giocatori della squadra sportiva preferita, le azioni in un portafoglio di investimenti, i malati di cancro
studio e lista della spesa. Le raccolte incorporate di Python ti consentono di archiviare e accedere
5
Pagina 172
dati in modo conveniente ed efficiente. In questo capitolo, discuteremo di elenchi e tuple in more
dettaglio.
Mostreremo liste comuni e manipolazioni di tuple. Vedrai che gli elenchi (che sono
modificabile) e le tuple (che non lo sono) hanno molte funzionalità comuni. Ciascuno può tenere
articoli dello stesso tipo o di diverso tipo. Gli elenchi possono essere ridimensionati dinamicamente secondo necessità,
in crescita e in contrazione al momento dell'esecuzione. Discutiamo monodimensionale e due
elenchi dimensionali.
5.2 ELENCHI
Qui, discutiamo gli elenchi in modo più dettagliato e spieghiamo come fare riferimento a un elenco particolare
elementi . Molte delle funzionalità mostrate in questa sezione si applicano a tutti i tipi di sequenza.
Creazione di un elenco
Gli elenchi in genere memorizzano dati omogenei , ovvero valori dello stesso tipo di dati.
Considera l'elenco c, che contiene cinque elementi interi:
In [1]: c = [ 45 , 6 , 0 , 72 , 1543 ]
In [2]: c
Uscita [2]: [45, 6, 0, 72, 1543]
Possono anche memorizzare dati eterogenei , ovvero dati di molti tipi diversi. Per
esempio, il seguente elenco contiene il nome di uno studente (una stringa), il cognome (a
stringa), media dei voti (un float) e anno di laurea (un int):
UN
C accesso agli elementi di un elenco
Si fa riferimento a un elemento della lista, scrivendo il nome della lista seguito dal dell'elemento dell'indice
(ovvero, il suo numero di posizione ) racchiuso tra parentesi quadre ([], noto come
operatore in abbonamento ). Il diagramma seguente mostra l'elenco c etichettato con il suo
nomi degli elementi:
Il primo elemento in una lista ha l'indice 0. Quindi, nella lista a cinque elementi c, il primo elemento
si chiama c [0] e l'ultimo è c [4]:
In [3]: c [ 0 ]
Uscita [3]: 45
In [4]: c [ 4 ]
Uscita [4]: 1543
Accesso agli elementi dalla fine della lista con indici negativi
È inoltre possibile accedere alle liste dalla fine utilizzando indici negativi :
Quindi, è possibile accedere all'ultimo elemento della lista c (c [4]) con c [1] e al suo primo elemento con
c [5]:
In [6]: c [ 1 ]
Uscita [6]: 1543
Pagina 174
In [7]: c [ 5 ]
Uscita [7]: 45
Un indice deve essere un'espressione intera o intera (o uno slice , come vedremo presto):
In [8]: a = 1
In [9]: b = 2
In [10]: c [a + b]
Fuori [10]: 72
In [11]: c [ 4 ] = 17
In [12]: c
Uscita [12]: [45, 6, 0, 72, 17]
Presto vedrai che puoi anche inserire ed eliminare elementi, modificando la lunghezza dell'elenco.
Le sequenze di stringhe e tuple di Python sono immutabili: non possono essere modificate. Puoi
ottenere i singoli caratteri in una stringa, ma tentando di assegnare un nuovo valore a uno di
i caratteri causano un TypeError:
n [13]: s = "ciao"
In [14]: s [ 0 ]
Fuori [14]: 'h'
In [15]: s [ 0 ] = "H"
C
TypeError Traceback (la chiamata più recente per ultima) Pagina 175
<ipythoninput15812ef2514689> in <module> ()
> 1 s [ 0 ] = "H"
L'uso di un elenco fuori intervallo, una tupla o un indice di stringa provoca un errore IndexError:
In [16]: c [ 100 ]
Gli elementi della lista possono essere usati come variabili nelle espressioni:
In [17]: c [ 0 ] + c [ 1 ] + c [ 2 ]
Fuori [17]: 39
Cominciamo con un elenco vuoto [], quindi usa un'istruzione for e + = per aggiungere i valori
Da 1 a 5 nell'elenco: l'elenco cresce dinamicamente per accogliere ogni elemento:
In [18]: a_list = []
In [20]: a_list
Fuori [20]: [1, 2, 3, 4, 5]
UN
C
<
Pagina 176
Quando l'operando sinistro di + = è un elenco, l'operando destro deve essere un iterabile ; in caso contrario, a
TypeError si verifica. Nella suite dello snippet [19], le parentesi quadre attorno al numero creano
un elenco di un elemento, che aggiungiamo a a_list. Se l'operando di destra contiene più file
elementi, + = li aggiunge tutti. Quanto segue aggiunge i caratteri di "Python" a
le lettere dell'elenco:
In [21]: lettere = []
Se l'operando di destra di + = è una tupla, anche i suoi elementi vengono aggiunti all'elenco. Più tardi in
nel capitolo, useremo il metodo list append per aggiungere elementi a un elenco.
È possibile concatenare due elenchi, due tuple o due stringhe utilizzando l'operatore +. Il
il risultato è una nuova sequenza dello stesso tipo contenente gli elementi dell'operando sinistro
seguito dagli elementi dell'operando destro. Le sequenze originali rimangono invariate:
In [24]: list1 = [ 10 , 20 , 30 ]
In [25]: list2 = [ 40 , 50 ]
In [27]: concatenated_list
Uscita [27]: [10, 20, 30, 40, 50]
Si verifica un'eccezione TypeError se gli operandi dell'operatore + sono tipi di sequenza di differenza, per
Ad esempio, concatenare un elenco e una tupla è un errore.
È inoltre possibile accedere agli elementi dell'elenco tramite i loro indici e l'operatore di abbonamento ([]):
C
Pagina 177
In [28]: for i in range (len (concatenated_list)):
...: print (f ' {i} : {concatenated_list [i]} ' )
...:
0:10
1:20
2:30
3:40
4:50
Operatori di confronto
Puoi confrontare interi elenchi elemento per elemento utilizzando gli operatori di confronto:
In [29]: a = [1, 2, 3]
In [30]: b = [1, 2, 3]
In [31]: c = [1, 2, 3, 4]
5.3 TUPLES
Come discusso nel capitolo precedente, le tuple sono immutabili e in genere vengono archiviate
dati eterogenei, ma i dati possono essere omogenei. La lunghezza di una tupla è il suo numero di
elementi e non possono cambiare durante l'esecuzione del programma.
Creazione di tuple
C
Creazione di tuple
Pagina 178
o crea una tupla vuota, usa parentesi vuote:
In [1]: student_tuple = ()
In [2]: student_tuple
Uscita [2]: ()
Ricorda che puoi comprimere una tupla separando i suoi valori con virgole:
In [5]: student_tuple
Uscita [5]: ('John', 'Green', 3.3)
Quando esegui l'output di una tupla, Python ne mostra sempre il contenuto tra parentesi. Potresti
racchiudere un elenco di valori separati da virgole di una tupla con parentesi opzionali:
In [8]: another_student_tuple
Uscita [8]: ('Mary', 'Red', 3.3)
In [10]: a_singleton_tuple
Fuori [10]: ('rosso',)
C
T
Pagina 179
essere ridondante e a_singleton_tuple farebbe semplicemente riferimento alla stringa 'red'
piuttosto che una tupla.
Gli elementi di una tupla, sebbene correlati, sono spesso di più tipi. Di solito non lo fai
iterare su di loro. Piuttosto, accedi a ciascuno individualmente. Come gli indici di lista, gli indici di tupla
inizia da 0. Il codice seguente crea time_tuple che rappresentano un'ora, un minuto e
secondo, visualizza la tupla, quindi utilizza i suoi elementi per calcolare il numero di secondi
da mezzanotte: si noti che eseguiamo un'operazione diversa con ogni valore nel file
tupla:
In [11]: time_tuple = ( 9 , 16 , 1 )
In [12]: time_tuple
Uscita [12]: (9, 16, 1)
Come con gli elenchi, l'istruzione di assegnazione aumentata + = può essere utilizzata con le stringhe e
tuple, anche se sono immutabili . Nel codice seguente, dopo i due
assegnazioni, tuple1 e tuple2 si riferiscono allo stesso oggetto tupla:
In [14]: tuple1 = ( 10 , 20 , 30 )
In [16]: tuple2
Uscita [16]: (10, 20, 30)
La concatenazione della tupla (40, 50) a tuple1 crea una nuova tupla, quindi assegna un file
riferimento ad esso alla variabile tuple1 — tuple2 si riferisce ancora alla tupla originale:
C
Pagina 180
In [18]: tuple1
Uscita [18]: (10, 20, 30, 40, 50)
In [19]: tuple2
Uscita [19]: (10, 20, 30)
Per una stringa o una tupla, l'elemento a destra di + = deve essere rispettivamente una stringa o una tupla—
la miscelazione dei tipi causa un TypeError.
In [20]: numeri = [ 1 , 2 , 3 , 4 , 5 ]
In [21]: numeri + = ( 6 , 7 )
In [22]: numeri
Fuori [22]: [1, 2, 3, 4, 5, 6, 7]
In [24]: student_tuple [ 2 ] [ 1 ] = 85
In [25]: student_tuple
Uscita [25]: ('Amanda', 'Blue', [98, 85, 87])
student_tuple [2] come elemento della tupla contenente l'elenco [98, 75, 87],
quindi utilizza [1] per accedere all'elemento dell'elenco contenente 75. L'assegnazione nello snippet [24]
C
Pagina 181
sostituisce quel grado con 85.
In [3]: first_name
Uscita [3]: "Amanda"
In [4]: voti
Uscita [4]: [98, 85, 87]
Il codice seguente decomprime una stringa, un elenco e una sequenza prodotta da intervallo:
C
Pagina 182
In [11]: numero1 = 99
In [12]: numero2 = 22
In precedenza, abbiamo chiamato range per produrre una sequenza di valori di indice, quindi abbiamo aperto l'elenco
elementi in un ciclo for utilizzando i valori di indice e l'operatore di sottoscrizione ([]). Questo
è soggetto a errori perché potresti passare gli argomenti sbagliati a range. Se qualsiasi valore
prodotto da intervallo è un indice in uscita, utilizzarlo come indice provoca un
IndexError.
Allo stesso modo la funzione incorporata tupla crea una tupla da una sequenza:
Il seguente ciclo for decomprime ogni tupla restituita da enumerate nelle variabili
Lo script seguente crea un grafico a barre primitivo di cui è composta la lunghezza di ciascuna barra
asterischi (*) ed è proporzionale al valore dell'elemento corrispondente della lista. Noi usiamo il
funzione enumerate per accedere in modo sicuro agli indici e ai valori dell'elenco. Per eseguire questo esempio,
passare alla cartella degli esempi ch05 di questo capitolo, quindi immettere:
ipython fig05_01.py
esegui fig05_01.py
1 # fig05_01.py
2 "" "Visualizzazione di un grafico a barre" ""
3 numeri = [ 19 , 3 , 15 , 7 , 11 ]
4
5 print ( '\ nCreazione di un grafico a barre da numeri:' )
6 print (f 'Indice { "Valore" :> 8 } Barra' )
7
8 per indice, valore in enumerate (numeri):
9 print (f ' {index:> 5 } {value:> 8 } { "*" * value} ' )
L'istruzione for usa enumerate per ottenere l'indice e il valore di ogni elemento, quindi
C
Pagina 184
visualizza una riga formattata contenente l'indice, il valore dell'elemento e il corrispondente
barra degli asterischi. L'espressione
"*" * valore
crea una stringa composta da asterischi di valore. Quando viene utilizzato con una sequenza, il file
L'operatore di moltiplicazione (*) ripete la sequenza, in questo caso la stringa "*" - valore
volte. Più avanti in questo capitolo, utilizzeremo le librerie opensource Seaborn e Matplotlib
per visualizzare una visualizzazione del grafico a barre di qualità della pubblicazione.
5.5 SEQUENCE SLICING
È possibile suddividere sequenze per creare nuove sequenze dello stesso tipo contenenti sottoinsiemi di
gli elementi originali. Le operazioni di slice possono modificare le sequenze mutabili, quelle che lo fanno
non modificare una sequenza funziona in modo identico per elenchi, tuple e stringhe.
In [1]: numeri = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ]
In [2]: numeri [ 2 : 6 ]
Uscita [2]: [5, 7, 11, 13]
La sezione copia gli elementi dall'indice iniziale a sinistra dei due punti (2) fino a, ma
escluso, l' indice finale a destra dei due punti (6). L'elenco originale non lo è
modificato.
Se ometti l'indice iniziale, viene assunto 0. Quindi, i numeri di slice [: 6] sono equivalenti a
i numeri di slice [0: 6]:
In [3]: numeri [: 6 ]
Uscita [3]: [2, 3, 5, 7, 11, 13]
In [4]: numeri [ 0 : 6 ]
Se ometti l'indice finale, Python assume la lunghezza della sequenza (8 qui), quindi snippet
In [5]: numeri [ 6 :]
Uscita [5]: [17, 19]
Sebbene le sezioni creino nuovi oggetti, le sezioni creano copie superficiali degli elementi, ovvero
copiano i riferimenti degli elementi ma non gli oggetti a cui puntano. Quindi, nello snippet
sopra, gli elementi della nuova lista si riferiscono agli stessi oggetti degli elementi della lista originale,
piuttosto che separare le copie. Nella "Programmazione ArrayOriented con NumPy"
capitolo, spiegheremo la copia profonda , che copia effettivamente gli oggetti referenziati
stessi e indicheremo quando è preferibile la copia profonda.
Il codice seguente usa un passaggio di 2 per creare una sezione con ogni altro elemento di
numeri:
Abbiamo omesso gli indici di inizio e di fine, quindi si assumono 0 e len (numeri),
rispettivamente.
S
C licing con indici e passaggi negativi
È possibile utilizzare un passaggio negativo per selezionare le sezioni in ordine inverso . Il codice seguente
crea in modo conciso un nuovo elenco in ordine inverso:
Questo è equivalente a:
In [10]: numeri [ 1 : 9 : 1 ]
Fuori [10]: [19, 17, 13, 11, 7, 5, 3, 2]
In [12]: numeri
Uscita [12]: ["due", "tre", "cinque", 7, 11, 13, 17, 19]
Quanto segue elimina solo i primi tre elementi di numeri assegnando un vuoto
list alla sezione a tre elementi:
In [13]: numeri [ 0 : 3 ] = []
In [14]: numeri
Uscita [14]: [7, 11, 13, 17, 19]
Quanto segue assegna gli elementi di una lista a una porzione di ogni altro elemento di numeri:
lecca qui per visualizzare l'immagine del codice
C
Pagina 187
In [15]: numeri = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ]
In [17]: numeri
Fuori [17]: [100, 3, 100, 7, 100, 13, 100, 19]
In [18]: id (numeri)
Uscita [18]: 4434456648
In [20]: numeri
Fuori [20]: []
In [21]: id (numeri)
Uscita [21]: 4434456648
Eliminare il contenuto dei numeri (frammento [19]) è diverso dall'assegnarne uno nuovo
elenco vuoto [] (snippet [22]). Per dimostrarlo, mostriamo l'identità dei numeri dopo ciascuno
operazione. Le identità sono diverse, quindi rappresentano oggetti separati in memoria:
In [22]: numeri = []
In [23]: numeri
Uscita [23]: []
In [24]: id (numeri)
Uscita [24]: 4406030920
Quando assegni un nuovo oggetto a una variabile (come nello snippet [21]), lo farà l'oggetto originale
essere raccolti nella spazzatura se nessun'altra variabile vi fa riferimento.
In [2]: numeri
Uscita [2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [4]: numeri
Uscita [4]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
In [6]: numeri
Fuori [6]: [2, 3, 4, 5, 6, 7, 8]
Di seguito viene utilizzato un passaggio nella sezione per eliminare ogni altro elemento dall'intero elenco:
In [8]: numeri
Uscita [8]: [3, 5, 7]
In [10]: numeri
Fuori [10]: []
C
L
Pagina 189
lecca qui per visualizzare l'immagine del codice
In [12]: numeri
In [2]: numeri = [ 10 , 3 , 7 , 1 , 9 ]
In [4]: numeri
Uscita [4]: [20, 6, 14, 2, 18]
C
<
Pagina 190
Quando si passa una tupla a una funzione, tentando di modificare l'immutabile della tupla
elementi risulta in un TypeError:
In [5]: numbers_tuple = ( 10 , 20 , 30 )
In [6]: numbers_tuple
Uscita [6]: (10, 20, 30)
Ricorda che le tuple possono contenere oggetti mutabili, come gli elenchi. Quegli oggetti possono ancora essere
modificato quando una tupla viene passata a una funzione.
Il traceback precedente mostra i due frammenti che hanno portato a TypeError. Il primo è
chiamata di funzione di snippet [7]. Il secondo è la definizione della funzione di snippet [1]. Linea
i numeri precedono il codice di ogni snippet. Abbiamo dimostrato per lo più frammenti di una singola riga.
Quando si verifica un'eccezione in uno snippet di questo tipo, è sempre preceduta da> 1,
indicando che la riga 1 (l'unica riga dello snippet) ha causato l'eccezione. Snippet multilinea
come la definizione di modify_elements mostra i numeri di riga consecutivi che iniziano da 1.
La notazione> 4 sopra indica che l'eccezione si è verificata nella riga 4 di
modificare_elementi. Non importa quanto sia lungo il traceback, l'ultima riga di codice con
S
C ortare un elenco in ordine crescente
<
Il metodo di ordinamento elenco modifica un elenco per disporre i suoi elementi in ordine crescente:
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [2]: numbers.sort ()
In [3]: numeri
Fuori [3]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Per ordinare un elenco in ordine decrescente, chiamare il metodo dell'elenco con la parola chiave opzionale
argomento inverso impostato su True (False è l'impostazione predefinita):
In [5]: numeri
Uscita [5]: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
La funzione incorporata ordinata restituisce un nuovo elenco contenente i suoi elementi ordinati
sequenza di argomenti: la sequenza originale non è modificata . Il codice seguente
mostra la funzione ordinata per un elenco, una stringa e una tupla:
In [6]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [8]: ascending_numbers
Fuori [8]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [9]: numeri
Fuori [9]: [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]
C
Pagina 192
In [12]: ascending_letters
Fuori [12]: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
In [13]: lettere
Uscita [13]: "fadgchjebi"
In [16]: ascending_colors
Uscita [16]: ["blu", "verde", "arancione", "rosso", "giallo"]
In [17]: colori
Fuori [17]: ("rosso", "arancione", "giallo", "verde", "blu")
Utilizzare l'argomento della parola chiave opzionale reverse con il valore True per ordinare gli elementi
in ordine decrescente.
L' indice del metodo elenco accetta come argomento una chiave di ricerca, il valore da individuare nell'elenco,
quindi cerca nell'elenco dall'indice 0 e restituisce l'indice del primo elemento
che corrisponde alla chiave di ricerca:
In [1]: numeri = [ 3 , 7 , 1 , 4 , 2 , 8 , 5 , 6 ]
In [2]: numbers.index ( 5 )
Fuori [2]: 6
Utilizzando gli argomenti facoltativi dell'indice del metodo, è possibile cercare un sottoinsieme di elementi di una lista.
Puoi usare * = per moltiplicare una sequenza , ovvero aggiungere una sequenza a se stessa multipla
C
Pagina 193
volte. Dopo il seguente frammento, i numeri contengono due copie dell'elenco originale
Contenuti:
In [3]: numeri * = 2
In [4]: numeri
Uscita [4]: [3, 7, 1, 4, 2, 8, 5, 6, 3, 7, 1, 4, 2, 8, 5, 6]
In [5]: numbers.index ( 5 , 7 )
Uscita [5]: 14
[5]:
numbers.index ( 5 , 7 )
assume la lunghezza dei numeri come terzo argomento opzionale ed è equivalente a:
In [6]: numbers.index ( 7 , 0 , 4 )
Fuori [6]: 1
Operatori in e non in
C
Pagina 194
In [7]: 1000 in numeri
Fuori [7]: Falso
In [8]: 5 in numeri
Out [8]: Vero
Allo stesso modo, operator not in verifica se l'iterabile dell'operando destro non contiene
il valore dell'operando sinistro:
È possibile utilizzare l'operatore in per assicurarsi che le chiamate all'indice del metodo non abbiano come risultato
ValueErrors per le chiavi di ricerca che non sono nella sequenza corrispondente:
se tutti gli elementi sono veri. La funzione incorporata any restituisce True se qualsiasi elemento in
il suo argomento iterabile è True. La funzione incorporata restituisce tutto True se tutti gli elementi nella sua
argomenti iterabili sono True. Ricorda che i valori diversi da zero sono True e 0 è False. Non
anche gli oggetti iterabili vuoti restituiscono True, mentre qualsiasi iterabile vuoto restituisce
Falso. Le funzioni any and all sono ulteriori esempi di iterazione interna in
programmazione in stile funzionale.
5
C .10 ALTRI METODI DI ELENCO
Pagina 195
5.10 ALTRI METODI DI ELENCO
Gli elenchi hanno anche metodi che aggiungono e rimuovono elementi. Considera l'elenco
color_names:
In [3]: color_names
Uscita [3]: ["rosso", "arancione", "giallo", "verde"]
Puoi aggiungere un nuovo elemento alla fine di un elenco con il metodo append :
In [5]: color_names
In uscita [5]: ["rosso", "arancione", "giallo", "verde", "blu"]
Usa il metodo list extended per aggiungere tutti gli elementi di un'altra sequenza alla fine di un elenco:
In [7]: color_names
Fuori [7]: ["rosso", "arancione", "giallo", "verde", "blu", "indaco", "viola"]
C
Pagina 196
Questo è l'equivalente dell'uso di + =. Il codice seguente aggiunge tutti i caratteri di una stringa
quindi tutti gli elementi di una tupla in una lista:
In [8]: sample_list = []
In [9]: s = "abc"
In [12]: t = ( 1 , 2 , 3 )
In [14]: sample_list
Uscita [14]: ['a', 'b', 'c', 1, 2, 3]
Piuttosto che creare una variabile temporanea, come t, per memorizzare una tupla prima di aggiungerla a
una lista, potresti voler passare direttamente una tupla da estendere. In questo caso, la tupla
le parentesi sono obbligatorie, perché extension si aspetta un argomento iterabile:
In [16]: sample_list
Fuori [16]: ['a', 'b', 'c', 1, 2, 3, 4, 5, 6]
In [18]: color_names
Fuori [18]: ["rosso", "arancione", "giallo", "blu", "indaco", "viola"]
C
Pagina 197
Svuotamento di un elenco
In [19]: color_names.clear ()
In [20]: color_names
Fuori [20]: []
color_names [:] = []
Il conteggio del metodo List cerca il suo argomento e restituisce il numero di volte che lo è
trovato:
In [21]: risposte = [ 1 , 2 , 5 , 4 , 3 , 5 , 2 , 1 , 3 , 3 ,
...: 1, 4, 3, 3, 3, 2, 3, 3, 2, 2]
...:
In [22]: per i in serie ( 1 , 6 ):
...: print (f ' {i} compare {responses.count (i)} volte in responses'
...:
1 appare 3 volte nelle risposte
2 appare 5 volte nelle risposte
3 appare 8 volte nelle risposte
4 appare 2 volte nelle risposte
5 appare 2 volte nelle risposte
Il metodo List reverse inverte il contenuto di un elenco in posizione, invece di creare un file
copia invertita, come abbiamo fatto con una fetta in precedenza:
In [25]: color_names
Fuori [25]: ["blu", "verde", "giallo", "arancione", "rosso"]
Copia di un elenco
La copia del metodo elenco restituisce un nuovo elenco contenente una copia superficiale dell'elenco originale:
In [27]: copied_list
Uscita [27]: ["blu", "verde", "giallo", "arancione", "rosso"]
Creiamo un elenco vuoto chiamato stack, inseriamo (aggiungici) due stringhe su di esso, quindi pop
le stringhe per confermare che sono state recuperate in ordine lastin, firstout (LIFO):
n [1]: stack = []
In [3]: stack
Fuori [3]: ["rosso"]
C
Pagina 199
In [6]: stack.pop ()
Uscita [6]: "verde"
In [7]: stack
Fuori [7]: ["rosso"]
In [8]: stack.pop ()
Fuori [8]: "rosso"
In [9]: stack
Fuori [9]: []
In [10]: stack.pop ()
o ogni frammento di pop, viene visualizzato il valore che pop rimuove e restituisce. Popping
da uno stack vuoto provoca un IndexError, proprio come accedere a un elenco inesistente
elemento con []. Per evitare un IndexError, assicurati che len (stack) sia maggiore di
0 prima di chiamare pop. Puoi esaurire la memoria se continui a spingere gli elementi più velocemente di
li fai scoppiare.
Puoi anche utilizzare un elenco per simulare un'altra raccolta popolare chiamata coda in cui
si inserisce sul retro e si cancella dal davanti. Gli elementi vengono recuperati dalle code in
ordine firstin, firstout (FIFO) .
In [1]: list1 = []
In [3]: list1
F
C
Possiamo eseguire la stessa operazione in una singola riga di codice con una comprensione dell'elenco:
Come l'istruzione for dello snippet [2], la clausola for della lista di comprensione
itera sulla sequenza prodotta da range (1, 6). Per ogni articolo, l'elenco
comprensione valuta l'espressione a sinistra della clausola for e inserisce il
il valore dell'espressione (in questo caso, l'elemento stesso) nel nuovo elenco. Particolare di Snippet [4]
la comprensione avrebbe potuto essere espressa in modo più conciso utilizzando l'elenco delle funzioni:
Un'espressione di comprensione dell'elenco può eseguire attività, come calcoli, quella mappa
elementi a nuovi valori (possibilmente di diverso tipo). La mappatura è una funzionalità comune
operazione di programmazione dello stile che produce un risultato con lo stesso numero di elementi
come i dati originali mappati. La seguente comprensione associa ogni valore al suo
cubo con l'espressione item ** 3:
In [7]: list3
Uscita [7]: [1, 8, 27, 64, 125]
C
Pagina 201
Un'altra operazione di programmazione in stile funzionale comune è il filtraggio degli elementi in
seleziona solo quelli che corrispondono a una condizione. Questo in genere produce un elenco con meno
elementi rispetto ai dati filtrati. Per eseguire questa operazione in una lista di comprensione, utilizzare if
clausola . Quanto segue include in list4 solo i valori pari prodotti da for
clausola:
In [9]: list4
Fuori [9]: [2, 4, 6, 8, 10]
comprensione dell'elenco per creare un nuovo elenco contenente le loro versioni maiuscole:
In [12]: colors2
In uscita [12]: ["ROSSO", "ARANCIONE", "GIALLO", "VERDE", "BLU"]
In [13]: colori
Uscita [13]: ["rosso", "arancione", "giallo", "verde", "blu"]
C
Pagina 202
lecca qui per visualizzare l'immagine del codice
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
Per mostrare che un'espressione del generatore non crea un elenco, assegniamo il precedente
l'espressione del generatore di snippet su una variabile e valuta la variabile:
In [3]: squares_of_odds
Uscita [3]: <oggetto generatore <genexpr> a 0x1085e84c0>
Usiamo il filtro della funzione incorporata per ottenere i valori dispari in numeri:
In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
Come i dati, le funzioni Python sono oggetti che puoi assegnare a variabili, passare ad altre
funzioni e ritorno dalle funzioni. Funzioni che ricevono altre funzioni come
gli argomenti sono una capacità di stile funzionale chiamata funzioni di ordine superiore . Per
Ad esempio, il primo argomento del filtro deve essere una funzione che riceve un argomento e
restituisce True se il valore deve essere incluso nel risultato. La funzione is_odd restituisce
Vero se il suo argomento è dispari. La funzione di filtro chiama is_odd una volta per ogni valore in
il suo secondo argomento è iterabile (numeri). Le funzioni di ordine superiore possono anche restituire un file
funzione di conseguenza.
Il filtro della funzione restituisce un iteratore, quindi i risultati del filtro non vengono prodotti fino a quando non lo fai
itera attraverso di loro. Questo è un altro esempio di valutazione pigra. Nello snippet [3],
elenco di funzioni itera i risultati e crea un elenco che li contiene. Noi possiamo
ottenere gli stessi risultati di cui sopra utilizzando una lista di comprensione con una clausola if:
Per funzioni semplici come is_odd che restituiscono solo il valore di una singola espressione , puoi farlo
usa un'espressione lambda (o semplicemente una lambda ) per definire la funzione inline where
è necessario, in genere quando viene passato a un'altra funzione:
Passiamo il valore di ritorno del filtro (un iteratore) all'elenco delle funzioni qui per convertire il file
Un'espressione lambda è una funzione anonima , ovvero una funzione senza nome . Nel
la chiamata del filtro
C
Pagina 204
filtro ( lambda x: x% 2 ! = 0 , numeri)
lambda x: x% 2 ! = 0
Un lambda inizia con la parola chiave lambda seguita da un parametro separato da virgole
elenco, due punti (:) e un'espressione. In questo caso, l'elenco dei parametri ha un parametro
denominato x. Un lambda restituisce implicitamente il valore della sua espressione. Quindi qualsiasi semplice funzione di
il modulo
Usiamo la funzione mappa incorporata con un lambda per quadrare ogni valore in numeri:
In [6]: numeri
Fuori [6]: [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]
Il primo argomento della mappa delle funzioni è una funzione che riceve un valore e ne restituisce uno nuovo
valore: in questo caso, un lambda che piazza il suo argomento. Il secondo argomento è un file
iterabile di valori da mappare. La mappa delle funzioni utilizza una valutazione lenta. Quindi, passiamo alla lista
funzione l'iteratore restituito dalla mappa. Questo ci consente di iterare e creare un file
elenco dei valori mappati. Ecco una comprensione dell'elenco equivalente:
C
Pagina 205
lecca qui per visualizzare l'immagine del codice
C'è molto da fare nello snippet [9], quindi diamo un'occhiata più da vicino. Innanzitutto, filtra
restituisce un iterabile che rappresenta solo i valori dispari dei numeri. Quindi la mappa restituisce un file
iterabile che rappresenta i quadrati dei valori filtrati. Infine, list utilizza l'iterabile di map
per creare l'elenco. Potresti preferire la seguente comprensione dell'elenco a quella precedente
frammento:
Come sapete, le riduzioni elaborano gli elementi di una sequenza in un unico valore. Hai
riduzioni eseguite con le funzioni integrate len, sum, min e max. Puoi anche farlo
creare riduzioni personalizzate utilizzando la funzione di riduzione del modulo functools. Vedere
Abbiamo precedentemente mostrato le funzioni di riduzione incorporate min e max usando argomenti,
come int o elenchi di int. A volte dovrai trovare il minimo e
massimo di oggetti più complessi, come le stringhe. Considera quanto segue
confronto:
La lettera "R" "viene dopo" "o" nell'alfabeto, quindi potresti aspettarti che "Rosso" sia inferiore
di "arancione" e la condizione precedente è False. Tuttavia, le stringhe vengono confrontate
dai valori numerici sottostanti dei loro caratteri e le lettere minuscole sono più alte
valori numerici rispetto alle lettere maiuscole. Puoi confermarlo con la funzione incorporata
ord , che restituisce il valore numerico di un carattere:
Considera i colori dell'elenco, che contiene stringhe con lettere maiuscole e minuscole:
puoi vedere che "Blu" è il minimo (cioè il più vicino all'inizio del file
C
Pagina 207
alfabeto) e "Giallo" è il massimo (cioè più vicino alla fine dell'alfabeto).
Poiché Python confronta le stringhe utilizzando valori numerici, devi prima convertirli
stringa in tutte le lettere minuscole o tutte maiuscole. Allora anche i loro valori numerici
rappresentano l' ordine alfabetico . I seguenti snippet abilitano min e max a
determinare le stringhe minime e massime in ordine alfabetico:
L'argomento della parola chiave chiave deve essere una funzione un parametro che restituisce un valore. Nel
in questo caso, è un lambda che chiama il metodo della stringa lower per ottenere le lettere minuscole di una stringa
versione. Le funzioni min e max chiamano la funzione dell'argomento chiave per ogni elemento e
utilizzare i risultati per confrontare gli elementi.
In [7]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]
In [8]: reversed_numbers
Uscita [8]: [36, 25, 64, 4, 16, 81, 1, 49, 9, 100]
C
Pagina 208
elenco, rispettivamente:
Spacchettiamo ogni tupla in name e gpa e le visualizziamo. Funzione zip più corta
argomento determina il numero di tuple prodotte. Qui entrambi hanno la stessa lunghezza.
Gli elenchi che richiedono due indici per identificare un elemento sono chiamati elenchi bidimensionali
(o elenchi con doppio indice o elenchi con doppio script ). Gli elenchi multidimensionali possono
avere più di due indici. Qui, introduciamo elenchi bidimensionali.
Considera un elenco bidimensionale con tre righe e quattro colonne (cioè un elenco 3by4)
che potrebbe rappresentare i voti di tre studenti che hanno sostenuto ciascuno quattro esami in un corso:
In [1]: a = [[ 77 , 68 , 86 , 73 ], [ 96 , 87 , 89 , 81 ], [ 70 , 90 , 86 , 81 ]]
Scrivere l'elenco come segue rende più chiara la sua struttura tabulare di righe e colonne:
C
Pagina 209
a = [[ 77 , 68 , 86 , 73 ], # voti del primo studente
[ 96 , 87 , 89 , 81 ], # voti del secondo studente
[ 70 , 90 , 86 , 81 ]] # voti del terzo studente
Il diagramma seguente mostra l'elenco a, con le sue righe e colonne di valori del voto d'esame:
Nell'elenco bidimensionale a:
77, 68, 86 e 73 inizializzano a [0] [0], a [0] [1], a [0] [2] e a [0] [3],
rispettivamente,
96, 87, 89 e 81 inizializzano a [1] [0], a [1] [1], a [1] [2] e a [1] [3],
Pagina 210
rispettivamente, e
70, 90, 86 e 81 inizializzano a [2] [0], a [2] [1], a [2] [2] e a [2] [3],
rispettivamente.
L'istruzione for esterna esegue un'iterazione sulle righe dell'elenco bidimensionale una riga alla volta
tempo. Durante ogni iterazione dell'istruzione for esterna, l'istruzione for interna
itera su ogni colonna nella riga corrente. Quindi nella prima iterazione del ciclo esterno,
la riga 0 è
[ 77 , 68 , 86 , 73 ]
C
Pagina 211
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [0] [0] = 77, a [0]
[ 96 , 87 , 89 , 81 ]
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [1] [0] = 96, a [1]
[ 70 , 90 , 86 , 81 ]
e il ciclo annidato itera attraverso i quattro elementi di questa lista a [2] [0] = 70, a [2]
Pagina 212
La schermata qui sotto mostra un grafico a barre verticali che riassume per 600 tiri di dado
le frequenze con cui appare ciascuna delle sei facce e le loro percentuali di
totale. Seaborn si riferisce a questo tipo di grafico come grafico a barre :
Qui ci aspettiamo circa 100 occorrenze di ciascuna faccia della matrice. Tuttavia, con un file così piccolo
numero di rotoli, nessuna delle frequenze è esattamente 100 (sebbene molte siano vicine) e
la maggior parte delle percentuali non è prossima al 16,667% (circa 1/6). Mentre eseguiamo il file
simulazione per 60.000 tiri di dado, le barre diventeranno di dimensioni molto più vicine. A 6.000.000
rotoli di dado, sembreranno avere esattamente le stesse dimensioni. Questo è il " aw di grandi numeri "a
lavoro. Il prossimo capitolo mostrerà le lunghezze delle barre che cambiano dinamicamente.
il titolo del grafico all'interno della finestra (Rolling a SixSided Die 600 Times),
le etichette descrittive Die valore per l' x l'asse e la frequenza per la y dell'asse,
lT
Pagina 213
Useremo varie opzioni predefinite di Seaborn. Ad esempio, Seaborn determina il testo
etichette lungo l' x asse dai valori faccia della filiera 1-6 e le etichette di testo lungo la y asse
dalle frequenze effettive del die. Dietro le quinte, Matplotlib determina le posizioni
e le dimensioni delle barre, in base alle dimensioni della finestra e alle magnitudini dei valori
le barre rappresentano. Posiziona anche le etichette numeriche dell'asse di frequenza in base a
le frequenze effettive dello stampo rappresentate dalle barre. Ci sono molte altre funzionalità che puoi
personalizzare. Dovresti modificare questi attributi in base alle tue preferenze personali.
La prima schermata qui sotto mostra i risultati di 60.000 tiri di dado: immagina di provarci
fallo a mano. In questo caso, ci aspettiamo circa 10.000 di ogni faccia. Il secondo schermo
l'acquisizione di seguito mostra i risultati per 6.000.000 di rotoli, sicuramente qualcosa che non faresti mai
a mano! In questo caso, ci aspettiamo circa 1.000.000 di ogni faccia e le barre della frequenza
sembrano essere identici in lunghezza (sono vicini ma non esattamente della stessa lunghezza). Nota
che con più tiri di dado, le percentuali di frequenza sono molto più vicine al previsto
16,667%.
5.17.2 Visualizzazione delle frequenze e delle percentuali dei dadi
In questa sezione, svilupperai interattivamente i grafici a barre mostrati nella sezione precedente.
ipython matplotlib
Pagina 214
lecca qui per visualizzare l'immagine del codice
4. Il modulo seaborn contiene le capacità grafiche della libreria Seaborn che utilizziamo.
Questo modulo in genere viene importato con il nome sns. Cerca perché questo curioso
è stata scelta l'abbreviazione.
Quindi, usiamo una comprensione dell'elenco per creare un elenco di 600 valori di dado casuali, quindi usiamo
La funzione unica di NumPy per determinare i valori di roll univoci (molto probabilmente tutti e sei
possibili valori nominali) e le loro frequenze:
1
Eseguiremo un confronto delle prestazioni in capitolo 7 in cui discutiamo di ndarray in
C
Pagina 215
profondità.
Specificando l'argomento della parola chiave return_counts = True indica a univoco di contare ciascuno
numero di occorrenze del valore univoco. In questo caso, unique restituisce una tupla di due uno
ndarrays dimensionali contenenti i valori univoci ordinati e il corrispondente
frequenze, rispettivamente. Spacchettiamo gli ndarrays della tupla nei valori delle variabili
e frequenze. Se return_counts è False, lo è solo l'elenco di valori univoci
restituito.
Creiamo il titolo del grafico a barre, impostiamo il suo stile, quindi rappresentiamo graficamente le facce e le frequenze del dado:
In [7]: title = f'Rolling a SixSided Die {len (rolls) :,} Times '
La stringa di snippet [7] include il numero di tiri di dado nel titolo del grafico a barre. La virgola
(,) identificatore di formato in
visualizza il numero con i separatori delle migliaia , quindi 60000 verrebbe visualizzato come
60.000.
Per impostazione predefinita, Seaborn traccia i grafici su uno sfondo bianco semplice, ma ne fornisce diversi
stili tra cui scegliere ('darkgrid', 'whitegrid', 'dark', 'white' e
"zecche"). Snippet [8] specifica lo stile "whitegrid", che mostra il grigio chiaro
linee orizzontali nel grafico a barre verticali. Questi ti aiutano a vedere più facilmente come è ogni barra
l'altezza corrisponde alle etichette numeriche di frequenza sul lato sinistro del grafico a barre.
Snippet [9] rappresenta graficamente le frequenze del dado utilizzando la funzione barplot di Seaborn . Quando tu
esegui questo frammento, appare la seguente finestra (perché hai avviato IPython con
l'opzione matplotlib):
C
Pagina 216
Seaborn interagisce con Matplotlib per visualizzare le barre creando un Matplotlib Axes
oggetto, che gestisce il contenuto che appare nella finestra. Dietro le quinte,
Seaborn utilizza un oggetto Matplotlib Figure per gestire la finestra in cui verranno visualizzati gli assi
apparire. I primi due argomenti della funzione barplot sono ndarrays contenenti l' asse x
e i valori dell'asse y , rispettivamente. Abbiamo utilizzato l'argomento della parola chiave della tavolozza opzionale per
scegliere la tavolozza dei colori predefinita di Seaborn "brillante". È possibile visualizzare le opzioni della tavolozza
a:
ttps: //seaborn.pydata.org/tutorial/color_palettes.html
che fai al grafico a barre dopo questo punto apparirà immediatamente quando esegui il
snippet corrispondente.
C
h
Pagina 217
In [11]: axes.set (xlabel = 'Die Value' , ylabel = 'Frequency' )
Uscita [11]: [Testo (92.6667,0.5, 'Frequenza'), Testo (0.5,58.7667, 'Valore matrice')]
Snippet [10] utilizza il metodo set_title dell'oggetto axes per visualizzare la stringa del titolo
centrato sopra la trama. Questo metodo restituisce un oggetto Text contenente il titolo e il relativo
posizione nella finestra, che IPython visualizza semplicemente come output per conferma. tu
può ignorare gli Out [] negli snippet sopra.
Lo snippet [11] aggiunge etichette a ciascun asse. Il metodo set riceve argomenti di parole chiave per
le proprietà dell'oggetto Axes da impostare. Il metodo visualizza il testo xlabel lungo la x
l'asse e il testo dell'etichetta lungo l' asse ye restituisce un elenco di oggetti di testo
contenente le etichette e le relative posizioni. Il grafico a barre ora appare come segue:
Finalizzazione del grafico a barre
I due snippet successivi completano il grafico facendo spazio per il testo sopra ogni barra,
quindi visualizzandolo:
Per fare spazio al testo sopra le barre, lo snippet [12] ridimensiona l' asse y del 10%. Noi
ha scelto questo valore tramite la sperimentazione. Il metodo set_ylim dell'oggetto Axes ne ha molti
argomenti di parole chiave opzionali. Qui, usiamo solo top per modificare il valore massimo
rappresentato dall'asse y . Abbiamo moltiplicato la frequenza massima per 1,10 per garantire che il file
L' asse y è più alto del 10% rispetto alla barra più alta.
Infine, lo snippet [13] mostra il valore di frequenza di ciascuna barra e la percentuale del totale
rotoli. La collezione di toppe dell'oggetto assi contiene forme colorate bidimensionali
che rappresentano le barre della trama. L'istruzione for usa zip per scorrere il file
La terza istruzione crea una stringa doppia contenente la frequenza di quella barra e il
percentuale corrispondente del totale dei tiri di dado.
L'ultima istruzione chiama il metodo di testo dell'oggetto Axes per visualizzare il testo sopra
bar. I primi due argomenti di questo metodo specificano la posizione x – y del testo e il terzo
argomento è il testo da visualizzare. L'argomento della parola chiave ha specifica l' orizzontale
allineamento: abbiamo centrato il testo orizzontalmente attorno alla coordinata x . La parola chiave
l'argomento va specifica l' allineamento verticale: abbiamo allineato la parte inferiore del testo
con alla coordinata y . Il grafico a barre finale è mostrato di seguito:
Pagina 219
Ora che hai creato un bel grafico a barre, probabilmente vorrai provare un numero diverso di file
rotoli di dado. Innanzitutto, cancella il grafico esistente chiamando la funzione cla (clear axes) di Matplotlib:
In [14]: plt.cla ()
In [15]:% richiama 5
Ora puoi modificare lo snippet per cambiare il numero di rotoli a 60000, quindi premere Invio
C
In [16]: rolls = [random.randrange ( 1 , 7 ) for i in range ( 60000 )] Pagina 220
Quindi, richiama gli snippet da [6] a [13]. Visualizza tutti gli snippet nel file
intervallo nel successivo prompt In []. Premi Invio per rieseguire questi snippet:
In [17]:% richiamare 6 13
In [18]: values, frequencies = np.unique (rolls, return_counts =True )
...: title = f 'Lanciare un dado a sei facce {len (rolls) :,} Times'
...: sns.set_style ( 'whitegrid' )
...: assi = sns. barplot (x = valori, y = frequenze, tavolozza ='luminoso' )
...: axes.set_title (titolo)
...: axes.set (xlabel = 'Die Value' , ylabel = 'Frequency' )
...: axes.set_ylim (top = max (frequenze) * 1.10 )
...: per bar, frequenza in zip (axes.patches, frequenze):
...: text_x = bar.get_x () + bar.get_width () / 2.0
...: text_y = bar.get_height ()
...: text = f ' {frequency :,} \ n {frequency / len (roll): .3 %}'
...: axes.text (text_x, text_y, text,
...: fontsize = 11 , ha = 'center' , va = 'bottom' )
...:
Dopo aver creato una trama in modo interattivo, potresti voler salvare il codice in un file così
può trasformarlo in uno script ed eseguirlo in futuro. Usiamo la % save magic per salvare
frammenti da 1 a 13 in un file denominato RollDie.py. IPython indica il file a cui
le righe sono state scritte, quindi visualizza le righe salvate:
Con gli esempi di questo capitolo viene fornita una versione modificata del file RollDie.py
salvato sopra. Abbiamo aggiunto commenti e due modifiche in modo da poter eseguire lo script
con un argomento che specifica il numero di tiri di dado, come in:
Il modulo sys della libreria standard Python consente a uno script di ricevere la riga di comando
argomenti passati al programma. Questi includono il nome dello script e qualsiasi file
valori che appaiono alla sua destra quando si esegue lo script. Il modulo sys's
La lista argv contiene gli argomenti. Nel comando precedente, argv [0] è la stringa
"RollDie.py" e argv [1] è la stringa "600". Per controllare il numero di tiri di dado
con il valore dell'argomento della riga di comando, abbiamo modificato l'istruzione che crea il file
elenco rotoli come segue:
C
Pagina 222
lecca qui per visualizzare l'immagine del codice
plt. mostra ()
5.18 WRAP-UP
Questo capitolo ha presentato maggiori dettagli sulla lista e le sequenze di tuple. Hai creato elenchi,
accedeva ai loro elementi e ne determinava la lunghezza. Hai visto che gli elenchi sono mutabili, quindi
puoi modificare il loro contenuto, inclusa la crescita e la riduzione degli elenchi come il tuo
i programmi vengono eseguiti. Hai visto che l'accesso a un elemento inesistente provoca un
IndexError. Hai usato le istruzioni per scorrere gli elementi dell'elenco.
Abbiamo discusso delle tuple, che come le liste sono sequenze, ma sono immutabili. Hai disimballato un file
elementi della tupla in variabili separate. Hai usato enumerate per creare un iterabile di
tuple, ciascuna con un indice di lista e il valore dell'elemento corrispondente.
Hai imparato che tutte le sequenze supportano lo slicing, che crea nuove sequenze con
sottoinsiemi degli elementi originali. Hai utilizzato l'istruzione del per rimuovere elementi da
elenca ed elimina le variabili dalle sessioni interattive. Abbiamo passato elenchi, elementi di elenco e
sezioni di elenchi a funzioni. Hai visto come cercare e ordinare gli elenchi e come cercare
tuple. Abbiamo utilizzato metodi di elenco per inserire, aggiungere e rimuovere elementi e per invertire un file
elementi della lista e liste di copia.
Abbiamo mostrato come simulare stack con elenchi. Abbiamo utilizzato l'elenco conciso comprensivo
notazione per creare nuovi elenchi. Abbiamo utilizzato metodi incorporati aggiuntivi per sommare gli elementi della lista,
scorrere all'indietro in un elenco, trovare i valori minimo e massimo, filtrare i valori
e mappare i valori su nuovi valori. Abbiamo mostrato come gli elenchi annidati possono rappresentarne due
tabelle dimensionali in cui i dati sono disposti in righe e colonne. Hai visto come sono nidificati
for loops elabora elenchi bidimensionali.
Il capitolo si è concluso con una sezione Intro to Data Science che ha presentato un dado
C
Pagina 223
simulazione di rollio e visualizzazioni statiche. Un esempio di codice dettagliato ha utilizzato Seaborn
e le librerie di visualizzazione Matplotlib per creare una visualizzazione statica del grafico a barre del file
risultati finali della simulazione. Nella prossima sezione Intro to Data Science, usiamo un dierolling
simulazione con una visualizzazione dinamica del grafico a barre per rendere la trama "viva".
2
Il nome del database è radicato nella parola humongous.
https://avxhm.se/blogs/hill0
r
B
Pagina 224
laylist
6. Dizionari e set
storia
Obiettivi
opiche
Utilizza gli operatori in e not in per determinare se un dizionario contiene una chiave o un insieme
contiene un valore.
Contorno
.1 Introduzione
.2 Dizionari
6
Pagina 225
.2.1 Creazione di un dizionario
.3 Insiemi
.5 WrapUp
6.1 INTRODUZIONE
Abbiamo discusso tre raccolte di sequenze incorporate: stringhe, elenchi e tuple. Ora noi
considera le raccolte incorporate non sequenze: dizionari e set. Un dizionario è
una raccolta non ordinata che memorizza le coppie chiave-valore a cui mappano le chiavi immutabili
valori, proprio come un dizionario convenzionale associa le parole alle definizioni. Un set è un file
6
Pagina 226
raccolta non ordinata di elementi immutabili unici .
6.2 DIZIONARI
Un dizionario associa le chiavi ai valori. Ogni chiave viene mappata a un valore specifico. Il
la tabella seguente contiene esempi di dizionari con le relative chiavi, tipi di chiave, valori e
tipi di valore:
Chiave
Chiavi Valori Tipo di valore
genere
Paese Internet
Nomi dei paesi str str
codici
Agricolo
stati str elenco di str
prodotti
tupla di int e
Pazienti ospedalieri str Segni vitali
galleggia
Metrico
str Abbreviazioni str
misurazioni
Codici inventario str Quantità in magazzino int
U nique Keys
Le chiavi di un dizionario devono essere immutabili (come stringhe, numeri o tuple) e univoche
(cioè, nessun duplicato). Più chiavi possono avere lo stesso valore, ad esempio due differenti
codici di inventario che hanno la stessa quantità in magazzino.
{}.
Creiamo un dizionario con le chiavi del paese di origine "Finlandia", "Sud Africa"
'np':
In [2]: country_codes
Uscita [2]: {'Finland': 'fi', 'South Africa': 'za', 'Nepal': 'np'}
Quando produci un dizionario, il suo elenco di coppie chiave-valore separato da virgole è sempre
racchiuso tra parentesi graffe. Poiché i dizionari sono raccolte non ordinate , il file display
order può differire dall'ordine in cui le coppie chiave-valore sono state aggiunte a
dizionario. Nell'output dello snippet [2] le coppie chiave-valore vengono visualizzate nell'ordine in cui sono
sono stati inseriti, ma non scrivere codice che dipende dall'ordine delle coppie chiave-valore.
Puoi usare un dizionario come condizione per determinare se è vuoto: una dizione non vuota
ary restituisce True:
U
C
Pagina 228
In [4]: if country_codes:
...: print ( 'country_codes non è vuoto' )
...: altro :
...: print ( 'country_codes è vuoto' )
...:
country_codes non è vuoto
Un dizionario vuoto restituisce False. Per dimostrarlo, nel codice seguente abbiamo
chiama il metodo clear per eliminare le coppie chiave-valore del dizionario, quindi nello snippet [6] we
richiama e riesegui lo snippet [4]:
In [5]: country_codes.clear ()
In [6]: if country_codes:
...: print ( 'country_codes non è vuoto' )
...: altro :
...: print ( 'country_codes è vuoto' )
...:
country_codes è vuoto
In [2]: days_per_month
Uscita [2]: {'Gennaio': 31, 'Febbraio': 28, 'Marzo': 31}
Anche in questo caso, la rappresentazione di stringa del dizionario mostra le coppie chiave-valore nel file
ordine di inserzione, ma questo non è garantito perché i dizionari non sono ordinati . Bene
mostra come elaborare le chiavi in ordine ordinato più avanti in questo capitolo.
Gli elementi del metodo Dictionary restituiscono ciascuna coppia chiave-valore come una tupla, che viene decompressa
mese e giorni:
C
Pagina 229
lecca qui per visualizzare l'immagine del codice
numeri romani. Forniamo intenzionalmente il valore errato 100 per la chiave "X",
che correggeremo a breve:
In [2]: roman_numerals
Fuori [2]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100}
Accesso al valore associato a una chiave
Otteniamo il valore associato alla chiave 'V':
In [5]: roman_numerals
Uscita [5]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 10}
In [7]: roman_numerals
Uscita [7]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 10, 'L': 50}
Le chiavi stringa fanno distinzione tra maiuscole e minuscole. L'assegnazione a una chiave inesistente inserisce un nuovo valore-chiave
paio. Questo potrebbe essere ciò che intendi o potrebbe essere un errore logico.
In [9]: roman_numerals
Fuori [9]: {'I': 1, 'II': 2, 'V': 5, 'X': 10, 'L': 50}
È inoltre possibile rimuovere una coppia chiave-valore con il metodo pop del dizionario , che restituisce
il valore per la chiave rimossa:
In [11]: roman_numerals
Fuori [11]: {'I': 1, 'II': 2, 'V': 5, 'L': 50}
KeyError : "III"
Puoi prevenire questo errore usando il metodo del dizionario get , che normalmente restituisce il suo
valore corrispondente dell'argomento. Se quella chiave non viene trovata, ottieni restituisce None. IPython
non mostra nulla quando None viene restituito nello snippet [13]. Se specifichi un file
secondo argomento da ottenere, restituisce quel valore se la chiave non viene trovata:
Gli operatori in e non in possono determinare se un dizionario contiene una chiave specificata:
In precedenza, abbiamo utilizzato gli elementi del metodo del dizionario per scorrere le tuple di un dizionario
coppie chiave-valore. Allo stesso modo, è possibile utilizzare chiavi e valori dei metodi per eseguire l'iterazione
solo le chiavi o i valori di un dizionario, rispettivamente:
Y
C
Pagina 232
In [1]: months = { 'January' : 1 , 'February' : 2 , 'March' : 3 }
Visualizzazioni dizionario
Gli elementi, le chiavi e i valori dei metodi del dizionario restituiscono ciascuno una visualizzazione dei dati di un dizionario.
Quando si iterazioni su una vista , si “vede” attuali contenuti-it del dizionario fa non
disporre di una propria copia dei dati.
Per mostrare che le viste non mantengono le proprie copie dei dati di un dizionario, iniziamo
salvare la vista restituita dalle chiavi nella variabile months_view, quindi scorrere
esso:
Successivamente, aggiungiamo una nuova coppia chiave-valore a mesi e visualizziamo il dizionario aggiornato:
In [7]: mesi
In uscita [7]: {'Gennaio': 1, 'Febbraio': 2, 'Marzo': 3, 'Dicembre': 12}
Ora, iteriamo di nuovo su months_view. La chiave che abbiamo aggiunto sopra è davvero
visualizzato:
C
Pagina 233
In [8]: per la chiave in months_view:
...: print (key, end = '' )
...:
Gennaio febbraio marzo dicembre
Non modificare un dizionario durante l'iterazione di una vista. Secondo la Sezione 4.10.1
1
della documentazione della libreria standard di Python, otterrai un RuntimeError o
il ciclo potrebbe non elaborare tutti i valori della vista.
1
ttps: //docs.python.org/3/library/stdtypes.html#dictionary
iewobjects .
Occasionalmente potresti aver bisogno di elenchi di chiavi, valori o coppie chiave-valore di un dizionario. Per
ottenere tale elenco, passare la vista restituita da chiavi, valori o elementi al builtin
Per elaborare le chiavi in ordine ordinato , è possibile utilizzare la funzione incorporata ordinata come segue:
P
C
hv
Pagina 234
Gli operatori di confronto == e! = Possono essere utilizzati per determinare se due
i dizionari hanno contenuti identici o diversi. Viene valutato un confronto uguale (==)