Il 0% ha trovato utile questo documento (0 voti)
988 visualizzazioni605 pagine

Python PDF

Caricato da

ensar
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
988 visualizzazioni605 pagine

Python PDF

Caricato da

ensar
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 605

Pagina 1

Testo originale
Contribuisci a una traduzione migliore

Pagina 2

tory

foto
Python per
® programmatori

arning Pat

fers & Dea

hlights

ttings

Supporto

Disconnessione

Pagina 3

Playlist
®
Deitel Developer Series
storia

Python per programmatori


opiche

guadagnando Pat
Paul Deitel
Harvey Deitel
ffers & Dea

ighlights

ettings

Supporto

Disconnessione

Pagina 4

Playlist

storia

Molte delle denominazioni utilizzate da produttori e venditori per distinguere i propri


opiche
i prodotti sono rivendicati come marchi. Dove appaiono queste designazioni in questo libro, e
l'editore era a conoscenza di una rivendicazione di marchio, le denominazioni sono state stampate
guadagnando Pat
lettere maiuscole iniziali o in tutte le maiuscole.

ffers & Dea


Gli autori e l'editore hanno curato la preparazione di questo libro, ma fanno no
garanzia espressa o implicita di qualsiasi tipo e non si assume alcuna responsabilità per errori o
ighlights
omissioni. Non si assume alcuna responsabilità per danni incidentali o consequenziali in
collegamento con o derivante dall'uso delle informazioni o dei programmi contenuti
ettings
qui.

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 richieste di informazioni sulle vendite governative, contattare


[email protected] .

Per domande sulle vendite al di fuori degli Stati Uniti, contattare [email protected] .

Visitateci sul Web: informit.com

Numero di controllo della Library of Congress: 2019933267

Copyright © 2019 Pearson Education, Inc.

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.

Logo Python per gentile concessione di Python Software Foundation.

Cover design di Paul Deitel, Harvey Deitel e Chuti Prasertsith


Cover art di Agsandrew / Shutterstock

ISBN13: 9780135224335
ISBN10: 0135224330

1 19
D
Pagina 6

le liste

ory
reface
1

" C'è dell'oro in quelle colline thar!"


ics

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.

LAVORI CHE RICHIEDONO COMPETENZE DI DATA SCIENCE


Nel 2011, il McKinsey Global Institute ha prodotto il rapporto "Big data: The next frontier for
innovazione, concorrenza e produttività. " In esso, hanno detto, "Gli Stati Uniti da soli devono affrontare un
carenza di 140.000-190.000 persone con capacità analitiche profonde e 1,5 milioni
. . 2
manager e analisti per analizzare i big data e prendere decisioni in base ai risultati ".
Questo continua ad essere il caso. Il "LinkedIn Workforce Report" dell'agosto 2018 afferma che gli Stati Uniti
3
States ha una carenza di oltre 150.000 persone con competenze di data science . Un rapporto del 2017 da
IBM, Burning Glass Technologies e BusinessHigher Education Forum, lo afferma da
Nel 2020 negli Stati Uniti ci saranno centinaia di migliaia di nuovi posti di lavoro che richiedono dati
4
abilità scientifiche.

ttps: //www.mckinsey.com/~/media/McKinsey/Business%20Functions/McKinsey%20Digital/Our%20I attrazioni / Bi


pagina 3).

3
ttps: //economicgraph.linkedin.com/resources/linkedinworkforce
eportaugust2018 .

4
ttps: //www.burningglass.com/wp

ontent / uploads / The_Quant_Crunch.pdf (pagina 3).

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

gestire porzioni significative dei casi di studio in hapters 11 - 6 . Il capitolo


La sezione Dipendenze "di questa Prefazione aiuterà i formatori a pianificare i loro corsi professionali in
contesto dell'architettura unica del libro.

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

KIS (Keep It Simple), KIS (Keep it Small), KIT (Keep it Topical)

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à.

Feedback immediato: esplorazione, scoperta e sperimentazione con IPython

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.

Fondamenti di programmazione Python

Innanzitutto, questo libro fornisce una ricca copertura di Python.

Discutiamo i modelli di programmazione di Python: programmazione procedurale, funzionale

1
C
S
programmazione del tipo e programmazione orientata agli oggetti. Pagina 8

Usiamo le migliori pratiche, sottolineando l'idioma corrente.

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.

538 Esempi di codici

Con 538 riceverai un'introduzione coinvolgente, stimolante e divertente a Python


esempi del mondo reale che vanno dai singoli frammenti al computer sostanziale
scienza, scienza dei dati, intelligenza artificiale e casi di studio sui big data.

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.

Evita la matematica pesante a favore delle spiegazioni in inglese

Catturiamo l'essenza concettuale della matematica e la mettiamo al lavoro nel nostro


esempi. Lo facciamo utilizzando librerie come statistiche, NumPy, SciPy, panda e
molti altri, che nascondono la complessità matematica. Quindi, è semplice per te
ottenere molti dei vantaggi delle tecniche matematiche come la regressione lineare senza
dover conoscere la matematica dietro di loro. Nell'apprendimento automatico e nel profondo
esempi di apprendimento, ci concentriamo sulla creazione di oggetti che fanno i conti per te "dietro il
scene. "

Visualizzazioni

67 visualizzazioni statiche, dinamiche, animate e interattive (grafici, grafici,


immagini, animazioni, ecc.) aiutano a comprendere i concetti.

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).

Utilizzerai una straordinaria gamma di Python e data science gratuiti e opensource


biblioteche e offerte gratuite, gratuite e freemium di software e servizi cloud.
Molte delle librerie sono ospitate su GitHub.

Cloud Computing pratico

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.

Database, Big Data e Infrastruttura Big Data

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/ .

Includiamo un trattamento di database relazionali e SQL con SQLite.

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.

Discutiamo di infrastrutture hardware e software per big data in capitolo 16 , " ig

1w
C
hB
ata: Hadoop, Spark, NoSQL e IoT (Internet of Things). " Pagina 10

Casi di studio sull'intelligenza artificiale

In caso di studio hapters 11 - 5 , presentiamo argomenti di intelligenza artificiale, tra cui


elaborazione del linguaggio naturale, estrazione di dati da Twitter per eseguire il sentiment
analisi, cognitive computing con IBM Watson, macchina supervisionata
learning, machine learning non supervisionato e deep learning. capitolo 16 regali
l'infrastruttura hardware e software per big data che consente agli scienziati informatici e
data scientist per implementare soluzioni all'avanguardia basate su IA.

Raccolte incorporate: elenchi, tuple, set, dizionari

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.

Programmazione orientata agli array con NumPy Arrays e Panda


Serie / DataFrames

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

panda, sono costruiti su NumPy. Le sezioni Intro to Data Science in hapters 7 - 9

introdurre panda Series e DataFrames, che insieme agli array NumPy sono quindi

utilizzato in tutti i capitoli rimanenti.

Elaborazione di file e serializzazione

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.

Programmazione basata su oggetti

Sottolineiamo l'utilizzo dell'enorme numero di classi preziose offerte dall'opensource di Python


community è stato impacchettato in librerie di classi standard del settore. Ti concentrerai sulla conoscenza
quali librerie ci sono, scegliere quelle che ti serviranno per le tue app, creare oggetti
dalle classi esistenti (di solito in una o due righe di codice) e facendole “saltare, ballare

e canta. " Questo oggetto base di programmazione consente di creare impressionante


applicazioni in modo rapido e conciso, il che è una parte significativa del fascino di Python.

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.

Programmazione orientata agli oggetti

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

Usiamo lo strumento di profilazione% timeit in diversi esempi per confrontare le prestazioni di


approcci diversi per eseguire le stesse attività. Altre prestazioni correlate
le discussioni includono espressioni del generatore, array NumPy e elenchi Python, prestazioni di
modelli di machine learning e deeplearning e Hadoop e Spark distribuiti
prestazioni di calcolo.

Big Data e parallelismo

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

estremità di hapters 1 - 0 e gli studi di casi in hapters 11 - 6 richiede solo hapters 1 - 5

e piccole porzioni di hapters 6 - 0 come discusso di seguito.

Parte 1: Guida introduttiva ai concetti fondamentali di Python

Ti consigliamo di leggere tutti i capitoli in ordine:

il capitolo 1 , Introduzione a computer e Python, introduce concetti che giacciono


le basi per la programmazione Python in hapters 2 - 0 e i big data,
intelligenza artificiale e casi di studio basati su cloud in hapters 11 - 6 . Anche il capitolo
include testdrive dell'interprete IPython e Jupyter Notebook.

il capitolo 2 , Introduzione alla programmazione Python, presenta la programmazione Python


fondamenti con esempi di codice che illustrano le caratteristiche chiave del linguaggio.

il capitolo 3 , Dichiarazioni di controllo, presenta le istruzioni di controllo di Python e


introduce l'elaborazione di base dell'elenco.

il capitolo 4 , Funzioni, introduce funzioni personalizzate, presenta la simulazione


tecniche con generazione di numeri casuali e introduce la tupla
fondamenti.

il capitolo 5 , Sequenze: elenchi e tuple, presenta l'elenco e la tupla incorporati di Python


collezioni in modo più dettagliato e inizia a introdurre la programmazione in stile funzionale.

arte 2: strutture dati, stringhe e file Python


P
1
C
arte 2: strutture dati, stringhe e file Python Pagina 12

Quanto segue riepiloga le dipendenze tra i capitoli per Python hapters 6 - 9 e

presume che tu abbia letto hapters 1 - 5 .

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

Caratteristiche di DataFrame da sezione 7.14 Introduzione alla scienza dei dati.

capitolo 9 , File ed eccezioni: per la serializzazione JSON, è utile capire


fondamenti del dizionario ( sezione 6.2 ). Inoltre, la sezione Introduzione alla scienza dei dati richiede l'estensione
funzione builtin open e l'istruzione with ( sezione 9.3 ) e panda DataFrame

caratteristiche da sezione 7.14 Introduzione alla scienza dei dati.

Parte 3: argomenti di fascia alta di Python

Quanto segue riepiloga le dipendenze tra i capitoli per Python capitolo 10 e assume

che hai letto hapters 1 - 5 .

capitolo 10 , Programmazione ObjectOriented: sezione Introduzione alla scienza dei dati


richiede le funzionalità DataFrame dei panda da Intro a Data Science ezione 7.14 . Formatori

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

Il seguente riepilogo delle dipendenze tra capitoli per hapters 11 - 6 lo presume

hai letto hapters 1 - 5 . La maggior partehapters 11 - 6 richiedono anche i fondamenti del dizionario

a partire dal
ezione 6.2 .

il capitolo 11 , Natural Language Processing (NLP), utilizza le funzionalità DataFrame di panda


a partire sezione
dal 7.14 Introduzione alla scienza dei dati.

il capitolo 12 , Data mining Twitter, utilizza le funzionalità DataFrame di panda da ezione


.14 's Intro to Data Science, string method join ( ezione 8.9 ), fondamenti di JSON
( sezione 9.5 ), TextBlob ( sezione 11.2 ) e Word cloud ( sezione 11.3 ). Diversi esempi

richiedono la definizione di una classe tramite ereditarietà


capitolo
( 10 ).

il capitolo 13 , IBM Watson e Cognitive Computing, utilizza la funzione incorporata open

e l'istruzione with ( sezione 9.3 ).

capitolo 14 , Machine Learning: classificazione, regressione e clustering, utilizza


Fondamenti di array NumPy e metodo unico ( capitolo 7 ), panda DataFrame
caratteristiche da Sezione 7.14 Introduzione a Data Science e sottotrame delle funzioni Matplotlib
( sezione 10.6 ).

il capitolo 15 , Deep Learning, richiede i fondamenti dell'array NumPy ( capitolo 7 ), stringa


metodo join ( ection 8.9 ), concetti generali di machine learning da capitolo 14 e

caratteristiche da Caso di studio del capitolo 14 : Classificazione con kNearest Neighbors e


Set di dati cifre.

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 Notebooks è un progetto opensource gratuito che ti consente di combinare testo,


funzionalità di codifica grafica, audio, video e interattiva per l'immissione, la modifica, l'esecuzione,
debug e modifica del codice rapidamente e comodamente in un browser web. Secondo il
articolo, "Che cos'è Jupyter?":

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

semplifica il problema della distribuzione di software funzionante a colleghi e collaboratori.

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 .

Collaborazione e condivisione dei risultati

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.

Riproducibilità: una custodia robusta per i notebook Jupyter

Nella scienza dei dati e nelle scienze in generale, dovrebbero esserci esperimenti e studi
riproducibile. Questo è stato scritto nella letteratura per molti anni, incluso

La pubblicazione di informatica del 1992 di Donald Knuth: Literate Programming .

1
Knuth, D., "Literate Programming" (PDF), The Computer Journal , British Computer
Società, 1992.

L'articolo “LanguageAgnostic Reproducible Data Analysis Using Literate


La programmazione ",2 che dice," Lir (computer alfabetizzato e riproducibile) si basa sull'idea
di programmazione alfabetizzata come proposto da Donald Knuth. "

2
ttp: //journals.plos.org/plosone/article?

d = 10.1371 / journal.pone.0164023 .

In sostanza, la riproducibilità cattura l'ambiente completo utilizzato per produrre risultati—


hardware, software, comunicazioni, algoritmi (soprattutto codice), dati e dati

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.

CARATTERISTICHE SPECIALI: IBM WATSON ANALYTICS AND


COMPUTAZIONE COGNITIVA
All'inizio della nostra ricerca per questo libro, abbiamo riconosciuto l'interesse in rapida crescita per IBM
Watson. Abbiamo esaminato i servizi della concorrenza e abbiamo riscontrato che "nessuna carta di credito richiesta" di Watson

politica per i suoi "livelli gratuiti" per essere tra i più amichevoli per i nostri lettori.

IBM Watson è una piattaforma di elaborazione cognitiva utilizzata in un'ampia gamma di


scenari del mondo reale. I sistemi di elaborazione cognitiva simulano il riconoscimento dei pattern e
capacità decisionali del cervello umano di "apprendere" man mano che consumano di più
4
3,, 5
dati. Includiamo un significativo trattamento manuale con Watson. Usiamo il Watson gratuito
Developer Cloud: Python SDK, che fornisce API che ti consentono di interagire con
I servizi di Watson a livello di programmazione. Watson è divertente da usare e un'ottima piattaforma per la locazione
i tuoi succhi creativi fluiscono. Dimostrerai o utilizzerai le seguenti API Watson: conversazione,
Scoperta, traduttore di lingue, classificatore di lingue naturali, linguaggio naturale
Comprensione, Approfondimenti sulla personalità, Da parola a testo, Da testo a voce, Tono
Analizzatore e riconoscimento visivo.

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 .

Servizi di livello Lite di Watson e un interessante case study di Watson

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

Utilizzo dei caratteri per enfatizzare

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

le parole chiave vengono visualizzate in blu scuro

le costanti e i valori letterali vengono visualizzati in azzurro


gli errori vengono visualizzati in rosso

tutto il resto del codice appare in nero

538 Esempi di codici

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.

160 Tabelle / Illustrazioni / Visualizzazioni

Includiamo numerose tabelle, disegni al tratto e visualizzazioni statiche, dinamiche e interattive.

Saggezza di programmazione

Noi integriamo nelle discussioni la programmazione saggezza gli autori congiunta nove
decenni di esperienza nella programmazione e nell'insegnamento, tra cui:

Buone pratiche di programmazione e idiomi Python preferiti che ti aiutano a produrre


programmi più chiari, più comprensibili e più manutenibili.

Errori di programmazione comuni per ridurre la probabilità che tu li faccia.

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.

SOFTWARE UTILIZZATO NEL LIBRO


Il software che utilizziamo è disponibile per Windows, macOS e Linux ed è scaricabile gratuitamente
da Internet. Abbiamo scritto gli esempi del libro usando Anaconda Python gratuito

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:

Riferimento al linguaggio Python:

ttps: //docs.python.org/3/reference/index.html

h
La libreria standard Python: Pagina 16

ttps: //docs.python.org/3/library/index.html

Elenco della documentazione di Python:

ttps: //docs.python.org/3/

RISPOSTA ALLE VOSTRE DOMANDE


I popolari forum online di Python e di programmazione generale includono:

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] .

COME OTTENERE AIUTO JUPYTER


Il supporto di Jupyter Notebooks viene fornito tramite:

Progetto Jupyter Google Group:


ttps: //groups.google.com/forum/#! forum / jupyter

Chat room in tempo reale di Jupyter:

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):

ttps: //groups.google.com/forum/#! forum / jupytereducation

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:

Codice sorgente Python scaricabile (file .py) e notebook Jupyter (.ipynb


file) per gli esempi di codice del libro.

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.

RIMANERE IN CONTATTO CON GLI AUTORI


Per risposte a domande o per segnalare un errore, inviaci una mail a

[email protected]

o interagisci con noi tramite i social media:

®
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

Daniel Chen, Data Scientist, Lander


Analytics
Daniel Chen, Data Scientist, Lander
Garrett Dancik, professore associato di Analytics
Informatica / Bioinformatica,
Eastern Connecticut State University Garrett Dancik, professore associato di
Informatica / Bioinformatica,
Pranshu Gupta, professore assistente, Eastern Connecticut State University
Informatica, DeSales University
Dr. Marsha Davis, presidente del dipartimento di
David Koop, assistente professore, Data Scienze matematiche, orientale
CoDirettore del programma scientifico, UMass Connecticut State University
Dartmouth
Roland DePratti, Professore a contratto di
Ramon Mata Toledo, professore, Informatica, Connecticut orientale
Informatica, James Madison Università Statale
Università
Shyamal Mitra, docente senior,
Shyamal Mitra, docente senior, Informatica, Università del Texas a
Informatica, Università del Texas Austin
ad Austin
Mark Pauley, ricercatore senior,
Alison Sanchez, assistente professore in Bioinformatica, Scuola di Interdisciplinarità

dh
Economia, Università di San Diego Informatica, Università del Nebraska a Pagina 18
Omaha
José Antonio González Seco, IT

Consulente Sean Raleigh, professore associato di


Matematica, cattedra di scienza dei dati,
Jamie Whitacre, dati indipendenti Westminster College
Consulente scientifico
Alison Sanchez, assistente professore in
Elizabeth Wickes, docente, School of Economia, Università di San Diego
Scienze dell'informazione, Università di
Illinois Dr. Harvey Siy, Professore Associato di
Informatica, Scienza dell'informazione
Revisori delle proposte
and Technology, University of Nebraska at
Omaha
Dott.ssa Irene Bruno, Professore Associato in
il Dipartimento dell'informazione
Jamie Whitacre, dati indipendenti
Scienze e tecnologia, George Consulente scientifico
Mason University

Lance Bryant, Professore Associato,


Dipartimento di Matematica,
Shippensburg University

Mentre leggi il libro, apprezzeremmo i tuoi commenti, critiche, correzioni e


suggerimenti per un miglioramento. Si prega di inviare tutta la corrispondenza a:

[email protected]

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!

Paul e Harvey Deitel

RIGUARDO AGLI AUTORI


Paul J. Deitel, CEO e Chief Technical Officer di Deitel & Associates, Inc., è un MIT
laureato con 38 anni di esperienza in informatica. Paul è uno dei più famosi al mondo
formatori esperti di linguaggi di programmazione, avendo tenuto corsi professionali su software

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

riconoscimento internazionale, con più di 100 traduzioni pubblicate in giapponese, tedesco,


Russo, spagnolo, francese, polacco, italiano, cinese semplificato, cinese tradizionale, coreano,

Portoghese, greco, urdu e turco. Il Dr. Deitel ha fornito centinaia di programmi


corsi per clienti accademici, aziendali, governativi e militari.

®
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

linguaggi di programmazione, tecnologia a oggetti, sviluppo di app mobili e Internet e web


tecnologia software. I clienti della formazione dell'azienda includono alcuni dei più grandi al mondo

aziende, agenzie governative, filiali delle istituzioni militari e accademiche. Il


L'azienda offre corsi di formazione con istruttore erogati presso i siti dei clienti in tutto il mondo su major
linguaggi di programmazione.

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

ttps: //www.informit.com ), Percorsi di apprendimento e seminari di formazione online dal vivo in


Servizio Safari ( ttps: //learning.oreilly.com ) e multimediale interattivo Revel ™
corsi.

Per contattare Deitel & Associates, Inc. e gli autori, o per richiedere una proposta in loco,
formazione istruita, scrivere a:

[email protected]

Per ulteriori informazioni sulla formazione aziendale in loco Deitel, visitare

ttp: //www.deitel.com/training

Le persone che desiderano acquistare libri Deitel possono farlo all'indirizzo

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

CONVENZIONI DI FONT E NOMINA


ffers & Dea
Mostriamo codice e comandi Python e nomi di file e cartelle in un sansserif

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

OTTENERE GLI ESEMPI DI CODICE


Supporto
Puoi scaricare
Disconnessione il file examples.zip contenente gli esempi del libro dal nostro
Pagina web di Python per programmatori all'indirizzo:

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

cartella Documenti dell'account:

Windows: C: \ Users \ YourAccount \ Documents \ examples

macOS o Linux: ~ / Documents / examples

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 ).

STRUTTURA DELLA CARTELLA ESEMPI


In questo libro eseguirai tre tipi di esempi:

Pagina 21
Singoli frammenti di codice nell'ambiente interattivo IPython.

Applicazioni complete, note come script.

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.

Dimostriamo ciascuno in sezione 1.5 dei test drive.

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_ipynb: una cartella contenente i file Jupyter Notebook del capitolo.

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.

File di script e relativi file di supporto.

il capitolo 13 contiene un'applicazione. hapters 15 e 6 spiegare dove trovare i file


è necessario rispettivamente nelle cartelle ch15 e ch16.

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,

la maggior parte delle librerie Python e di data science che utilizziamo,

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 macOS, apri un Terminale dalla sottocartella Utilità della cartella Applicazioni.

Su Windows, apri il prompt di Anaconda dal menu di avvio. Quando lo fai


per aggiornare Anaconda (come farai qui) o per installare nuovi pacchetti (discusso
momentaneamente), eseguire il Prompt Anaconda come amministratore di diritto
facendo clic su, quindi selezionando Altro> Esegui come amministratore. (Se non riesci a trovare il file
Prompt di Anaconda nel menu di avvio, cercalo semplicemente nel Tipo qui a
campo di ricerca nella parte inferiore dello schermo.)

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:

1. conda aggiornamento conda

2. conda aggiorna tutto

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.

INSTALLAZIONE DEL CODICE STATICO DEL PROSPETTORE


STRUMENTO DI ANALISI
h
Pagina 23
Potresti voler analizzare il tuo codice Python usando lo strumento di analisi Prospector, che
controlla il tuo codice per errori comuni e ti aiuta a migliorarlo. Per installare Prospector
e le librerie Python che utilizza, esegui il seguente comando nella riga di comando
finestra:

pip install prospector


INSTALLAZIONE DI JUPYTER-MATPLOTLIB
Implementiamo diverse animazioni utilizzando una libreria di visualizzazione chiamata Matplotlib. Usare
in Jupyter Notebooks, è necessario installare uno strumento chiamato ipympl. Nel Terminal,

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 .

conda install c condaforge ipympl


conda installa nodejs
jupyter labextension installa @ jupyterwidgets / jupyterlabmanager
jupyter labextension installa jupytermatplotlib

INSTALLAZIONE DEGLI ALTRI PACCHETTI


Anaconda viene fornito con circa 300 popolari pacchetti Python e data science per
tu, come NumPy, Matplotlib, panda, Regex, BeautifulSoup, richieste, Bokeh, SciPy,
SciKitLearn, Seaborn, Spacy, sqlite, statsmodels e molti altri. Il numero di
i pacchetti aggiuntivi che dovrai installare in tutto il libro saranno piccoli e lo faremo
fornire le istruzioni di installazione secondo necessità. Man mano che scopri nuovi pacchetti, il loro file
la documentazione spiegherà come installarli.

OTTIENI UN ACCOUNT SVILUPPATORE TWITTER


Se intendi utilizzare il nostro capitolo "Data mining Twitter" e qualsiasi esempio basato su Twitter
nei capitoli successivi, richiedere un account sviluppatore Twitter. Twitter ora richiede
registrazione per l'accesso alle proprie API. Per candidarsi, compilare e inviare la domanda a

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.

CONNESSIONE A INTERNET RICHIESTA IN ALCUNI


CAPITOLI
Durante l'utilizzo di questo libro, avrai bisogno di una connessione Internet per installare vari altri
Librerie Python. In alcuni capitoli ti registrerai per gli account con cloudbased
servizi, principalmente per utilizzare i loro livelli gratuiti. Alcuni servizi richiedono carte di credito per verificare il tuo
identità. In alcuni casi, utilizzerai servizi non gratuiti. In questi casi, prendi
vantaggio dei crediti monetari forniti dai fornitori in modo da poter provare i loro servizi
senza incorrere in spese. Attenzione: alcuni servizi basati su cloud comportano dei costi
una volta impostati. Quando completi i nostri casi di studio utilizzando tale
servizi, assicurati di eliminare prontamente le risorse che hai assegnato.

LEGGERE DIFFERENZE NELLE USCITE DI PROGRAMMA


Quando esegui i nostri esempi, potresti notare alcune differenze tra i risultati
mostriamo e i tuoi risultati:

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.

RISPOSTA ALLE VOSTRE DOMANDE


I forum online ti consentono di interagire con altri programmatori Python e ottenere il tuo
Risposte alle domande di Python. I popolari forum Python e di programmazione generale includono:

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

storia 1. Introduzione a computer e Python


Obiettivi
opiche

In questo capitolo potrai:


guadagnando Pat

Scopri gli entusiasmanti sviluppi recenti nell'informatica.


ffers & Dea

Rivedi le basi della programmazione orientata agli oggetti.


ighlights

Comprendi i punti di forza di Python.


ettings

Scopri le principali librerie Python e datascience che utilizzerai in questo libro.


Supporto
Testdrive la modalità interattiva dell'interprete IPython per l'esecuzione del codice Python.
Disconnessione

Esegui uno script Python che anima un grafico a barre.

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.

Leggi un case study di bigdata su una popolare app di navigazione mobile.

Essere introdotto all'intelligenza artificiale, all'incrocio tra informatica e dati

scienza.

Contorno

.1 Introduzione

.2 Una rapida rassegna delle nozioni di base sulla tecnologia degli oggetti

.3 Python

.4 Sono le biblioteche!

.4.1 Libreria standard Python

.4.2 Librerie DataScience

.5 TestDrives: utilizzo di IPython e Jupyter Notebook


Pagina 27

.5.1 Utilizzo della modalità interattiva IPython come calcolatrice

.5.2 Esecuzione di un programma Python utilizzando l'interprete IPython

.5.3 Scrittura ed esecuzione di codice in un notebook Jupyter


.6 Cloud e Internet of Things

.6.1 Il Cloud

.6.2 Internet delle cose

.7 Quanto sono grandi i Big Data?

.7.1 Analisi dei Big Data

.7.2 Scienza dei dati e Big Data fanno la differenza: casi d'uso

.8 Case Study: un'applicazione mobile BigData

.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

e, secondo l' indice PYPL (Popolarità dei linguaggi di programmazione) , il


1
più popolare.

1
ttps: //pypl.github.io/PYPL.html (a partire da gennaio 2019).

Qui, introduciamo terminologia e concetti che gettano le basi per Python

programmazione in cui imparerai hapters 2 - 0 e i bigdata, intelligenza artificiale e cloud


case study basati su cui presentiamo hapters 11 - 6.

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

vedere subito i risultati.

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.

Nell'ultimo, introdurremo i notebook Jupyter utilizzando JupyterLab, un web interattivo


strumento basato su browser in cui è possibile scrivere ed eseguire comodamente istruzioni Python.
I taccuini Jupyter ti consentono di includere testo, immagini, audio, video, animazioni e
codice.

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

Things (IoT), ponendo le basi per le applicazioni contemporanee in cui svilupperai


hapters 11 - 6.

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

i programmi orientati sono spesso più facili da capire, correggere e modificare.

Automobile come 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

al deposito di denaro su un conto, un altro per ritirare denaro da un conto e un terzo a


chiedi qual è il saldo del conto. Una classe è simile nel concetto all'ingegneria di un'auto
disegni, che ospitano il design di un pedale dell'acceleratore, volante e così via.

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

il riutilizzo è un vantaggio chiave della programmazione orientata agli oggetti.

Messaggi e chiamate al metodo

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.

Attributi e variabili di istanza

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

serbatoio, ma non quanto c'è nei serbatoi di altre auto.

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

sottoclasse ) inizia con le caratteristiche di una classe esistente (chiamata superclasse ),


possibilmente personalizzandoli e aggiungendo caratteristiche proprie uniche. Nella nostra analogia con l'auto,

un oggetto della classe "decappottabile" è certamente un oggetto della classe più generale "automobile",
ma più specificamente , il tetto può essere alzato o abbassato.

Analisi e progettazione orientata agli oggetti (OOAD)


Presto scriverai programmi in Python. Come creerai il codice per i tuoi programmi?

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

e progettando il sistema da un punto di vista orientato agli oggetti , si chiama oggetto


processo orientato all'analisi e alla progettazione (OOAD) . Linguaggi come Python sono oggetti
orientate. Programmazione in tale linguaggio, chiamato programmazione orientata agli oggetti (OOP) ,
consente di implementare un progetto orientato agli oggetti come sistema funzionante.
1.3 PITONE
Python è un linguaggio di scripting orientato agli oggetti che è stato rilasciato pubblicamente nel 1991. Lo era

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.

È più facile da leggere rispetto a molti altri linguaggi di programmazione popolari.

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.

Esistono un numero enorme di applicazioni Python opensource gratuite.

È popolare nello sviluppo web (ad esempio, Django, Flask).

Supporta i paradigmi di programmazione più diffusi: procedurale, stile funzionale e oggetto


0
orientate. Inizieremo a introdurre le funzionalità di programmazione in stile funzionale in capitolo 4
e utilizzarli nei capitoli successivi.

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

il suo rapporto speciale con la scienza dei dati.

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 .

R è un popolare linguaggio di programmazione opensource per applicazioni statistiche e


visualizzazione. Python e R sono i due linguaggi di datascience più diffusi.

Anaconda Python Distribution

Usiamo la distribuzione Anaconda Python perché è facile da installare su Windows, macOS


e Linux e supporta le ultime versioni di Python, l'interprete IPython (introdotto in

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/ .

1.4 SONO LE BIBLIOTECHE!


In tutto il libro, ci concentriamo sull'utilizzo delle biblioteche esistenti per aiutarti a evitare di "reinventare il
wheel ", sfruttando così i vostri sforzi di sviluppo del programma. Spesso, piuttosto che sviluppare lotti

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.

1.4.1 Libreria standard di Python

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

os: interazione con l'operatore


raccolte: dati aggiuntivi
sistema.
strutture oltre elenchi, tuple,
dizionari e set.
coda: i primi dati, i primi
struttura.
csv: elaborazione del valore separato da virgole
File.
casuale: numeri pseudocasuali.

datetime, time: data e ora


re: espressioni regolari per pattern
manipolazioni.
corrispondenza.

decimale: virgola fissa e virgola mobile


sqlite3: database relazionale SQLite
aritmetica, inclusa quella monetaria
accesso.
calcoli.

statistica: statistica matematica


doctest: semplice unit test tramite
funzioni come media, mediana, modalità
test di convalida e risultati attesi
e varianza.
incorporato in docstrings.

string: elaborazione delle stringhe.


json: JavaScript Object Notation (JSON)
elaborazione per l'utilizzo con servizi web e
sys: argomento della riga di comando
Database di documenti NoSQL.
elaborazione; input standard, standard
output e flussi di errore standard.
math: costanti matematiche comuni e
operazioni.
timeit: analisi delle prestazioni.

1.4.2 Biblioteche di scienza dei dati

Python ha una comunità enorme e in rapida crescita di sviluppatori opensource in molti


campi. Uno dei motivi principali della popolarità di Python è la straordinaria gamma di open

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

librerie opulari Python utilizzate nella scienza dei dati


Pagina 35

Informatica scientifica e statistica

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

fornisce routine per l'elaborazione di tali strutture di dati.

SciPy (Scientific Python) - Costruito su NumPy, SciPy aggiunge routine per scientific

elaborazione, come integrali, equazioni differenziali, elaborazione di matrici aggiuntive


e altro ancora. scipy.org controlla SciPy e NumPy.

StatsModels— Fornisce supporto per stime di modelli statistici, statistici


test ed esplorazione statistica dei dati.

Manipolazione e analisi dei dati

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

dimensionali) e DataFrames (bidimensionali).

Visualizzazione

Matplotlib: una libreria di grafici e visualizzazioni altamente personalizzabile. Supportato


i grafici includono regolare, dispersione, barra, contorno, torta, faretra, griglia, asse polare, 3D e testo.

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.

Machine learning, deep learning e reinforcement learning

scikitlearn: la migliore libreria di machine learning . L'apprendimento automatico è un sottoinsieme dell'IA.


L'apprendimento profondo è un sottoinsieme dell'apprendimento automatico che si concentra sulle reti neurali.

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

ensorFlow (Google), CNTK (toolkit cognitivo di Microsoft per l'apprendimento profondo) o

Theano (Université de Montréal).

TensorFlow: di Google, questa è la libreria di deep learning più utilizzata.

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.

OpenAI Gym— Una libreria e un ambiente per lo sviluppo, il test e il confronto


algoritmi di rinforzo dell'apprendimento.

Elaborazione del linguaggio naturale (PNL)

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.

1.5 TEST DRIVES: USO DI IPYTHON E JUPYTER


I QUADERNI
9
In questa sezione, testerai l'interprete IPython in due modalità:

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à interattiva , inserirai piccoli bit di codice Python chiamati snippet e

vedere subito i risultati.

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

gli snippet di codice che utilizzerai in modalità interattiva.

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 .

1.5.1 Utilizzo della modalità interattiva IPython come calcolatrice

Usiamo la modalità interattiva IPython per valutare semplici espressioni aritmetiche.

Accesso a IPython in modalità interattiva


Innanzitutto, apri una finestra della riga di comando sul tuo sistema:

Su macOS, apri un Terminale dalla sottocartella Utilità della cartella Applicazioni.

Su Windows, apri il prompt dei comandi di Anaconda dal menu di avvio.

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

come il seguente, varia in base alla piattaforma e alla versione di IPython:

lecca qui per visualizzare l'immagine del codice

Python 3.7.0 | confezionato da condaforge | (impostazione predefinita, 20 gennaio 2019, 17:24:52)


Digita "copyright", "crediti" o "licenza" per ulteriori informazioni
IPython 6.5.0 Un Python interattivo migliorato. Genere '?'
per un aiuto.

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

sessione interattiva. Generalmente lo facciamo per ogni nuova sezione di un capitolo.

1
Nel prossimo capitolo, vedrai che ci sono alcuni casi in cui Out [] non è visualizzato.

Valutiamo un'espressione più complessa:

lecca qui per visualizzare l'immagine del codice

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 .

Uscita dalla modalità interattiva

Per uscire dalla modalità interattiva, puoi:

Digitare il comando exit al prompt In [] corrente e premere Invio per uscire

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.

Digita <Ctrl> + d (o <control> + d ) due volte (solo macOS e Linux).

1.5.2 Esecuzione di un programma Python utilizzando l'interprete IPython

In questa sezione, eseguirai uno script chiamato RollDieDynamic.py in cui scrivere

capitolo 6 . L' estensione .py indica che il file contiene codice sorgente Python. Il copione

RollDieDynamic.py simula il lancio di un dado a sei facce. Presenta un animato colorato

visualizzazione che rappresenta graficamente dinamicamente le frequenze di ciascuna faccia della matrice.

Passaggio alla cartella degli esempi di questo capitolo

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:

Su macOS / Linux, digita cd ~ / Documents / examples / ch01, quindi premi Invio .


Su Windows, digita cd C: \ Users \ YourAccount \ Documents \ examples \ ch01, quindi

premere Invio .

Esecuzione dello script

Per eseguire lo script, digita il seguente comando nella riga di comando, quindi premi Invio :

ipython RollDieDynamic.py 6000 1

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.

Problemi che possono verificarsi al momento dell'esecuzione


I programmi spesso non funzionano al primo tentativo. Ad esempio, un programma in esecuzione potrebbe provare a

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

correzioni e riesegui lo script per determinare se le correzioni hanno risolto il file


i problemi).

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.

1.5.3 Scrittura ed esecuzione di codice in un notebook Jupyter

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

studi e comunicando in modo riproducibile i loro risultati. L'ambiente Jupyter Notebook


supporta un numero crescente di linguaggi di programmazione.

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

it, vedere i risultati, modificare il codice ed eseguirlo di nuovo.

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

codice da ezione 1.5.1 ad esso ed eseguire quel codice.

Apertura di JupyterLab nel tuo browser

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

sul lato sinistro dell'interfaccia JupyterLab:

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

http: // localhost: 8888 / lab

Creazione di un nuovo notebook Jupyter

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

2. Modificare il nome in TestDrive.ipynb e fare clic su RENAME.

La parte superiore di JupyterLab dovrebbe ora apparire come segue:

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:

Aggiunta ed esecuzione di un'altra cella


Valutiamo un'espressione più complessa. Innanzitutto, fai clic sul pulsante + nella barra degli strumenti sopra il file

prima cella del taccuino: aggiunge una nuova cella sotto quella corrente:

Fare clic nella nuova cella, quindi digitare l'espressione

5 * (12,7 4) / 2

Pagina 43

ed esegui la cella digitando Ctrl + Invio (o control + Invio ):


Salvataggio del taccuino
Se il tuo taccuino ha modifiche non salvate, la X nella scheda del taccuino cambierà in. Salvare

il notebook, seleziona il menu File in JupyterLab (non nella parte superiore della finestra del browser),
quindi selezionare Salva blocco appunti.

Quaderni forniti con gli esempi di ogni capitolo


Per tua comodità, vengono forniti anche gli esempi di ogni capitolo pronti per essere eseguiti
notebook senza i relativi output. Ciò ti consente di lavorare attraverso di loro snippetbysnippet

e vedi gli output apparire mentre esegui ogni snippet.

Affinché possiamo mostrarti come caricare un notebook esistente ed eseguire le sue celle, resettiamo il file

Notebook TestDrive.ipynb per rimuovere i numeri di output e di frammento. Questo lo restituirà


a uno stato come i quaderni che forniamo per gli esempi dei capitoli successivi. Dal
Dal menu Kernel selezionare Riavvia kernel e Cancella tutti gli output ..., quindi fare clic su RIAVVIA

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

pulsante per chiudere il notebook.

Apertura ed esecuzione di un blocco note esistente

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

numeri di riga dal menu Visualizza di JupyterLab.

Ulteriori informazioni sull'utilizzo di JupyterLab


JupyterLab ha molte altre funzionalità che troverai utili. Ti consigliamo di leggere il
Presentazione del team di Jupyter a JupyterLab su:

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

Editor e taccuini per molte funzionalità aggiuntive.

1.6 IL CLOUD E L'INTERNET DELLE COSE

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.

Attraverso il hapters 11 - 6 esempi, lavorerai con molti servizi basati su cloud:

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

e ricevere flussi di tweet non appena si verificano, ovvero in tempo reale.

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

è il set di servizi basati su cloud di Microsoft.

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,

nascondere i dettagli su come accedere a questi servizi su Internet.

Mashup
La metodologia di sviluppo delle applicazioni dei mashup consente di sviluppare rapidamente

potenti applicazioni software combinando servizi web complementari (spesso gratuiti) e


altre forme di feed di informazioni, come farai con il nostro assistente di viaggio IBM Watson
app di traduzione. Uno dei primi mashup combinava gli elenchi di immobili forniti da
ttp: //www.craigslist.org con le funzionalità di mappatura di Google Maps da offrire
mappe che mostravano l'ubicazione delle case in vendita o in affitto in una determinata area.

ProgrammableWeb ( ttp: //www.programmableweb.com/ ) fornisce una directory di over


20.750 servizi web e quasi 8.000 mashup. Forniscono anche guide e campioni
codice per lavorare con i servizi web e creare i propri mashup. Secondo loro
sito web, alcuni dei servizi web più utilizzati sono Facebook, Google Maps, Twitter e

1
hC

ouTube.
Pagina 46

1.6.2 Internet delle cose

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:

un'auto con transponder per il pagamento dei pedaggi,

monitora la disponibilità di posti auto in garage,

un cardiofrequenzimetro impiantato in un essere umano,

monitor della qualità dell'acqua,

un contatore intelligente che segnala l'utilizzo di energia,

rilevatori di radiazioni,

tracker articoli in un magazzino,

app mobili in grado di monitorare i tuoi movimenti e la tua posizione,

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 / .

1.7 QUANTO SONO GRANDI I BIG DATA?


Per gli informatici e gli scienziati dei dati, i dati ora sono importanti quanto la scrittura di programmi.

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

il coinvolgimento del clientewatsonmarketingwrotherpaperandreports

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

base richiedono uno o più MB di spazio di archiviazione. Alcuni esempi includono:

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)

130 MB / minuto e video 4K a 30 FPS richiedono 350 MB / minuto.

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 .

fino a 141 ore di audio MP3,

circa 1000 foto da una fotocamera da 16 megapixel,

circa 7,7 minuti di video 1080p a 30 FPS o

circa 2,85 minuti di video 4K a 30 FPS.

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 / .

circa 28 anni di audio MP3,

circa 1,68 milioni di foto da una fotocamera da 16 megapixel,

circa 226 ore di video 1080p a 30 FPS e

circa 84 ore di video 4K a 30 FPS.

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/ .

Petabyte, Exabyte e Zettabyte


Ci sono quasi quattro miliardi di persone online che creano circa 2,5 quintilioni di byte di dati ciascuno
1
giorno : 2500 petabyte (ogni petabyte corrisponde a circa 1000 terabyte) o 2,5 exabyte (ciascuno
exabyte è di circa 1000 petabyte). Secondo un articolo di AnalyticsWeek di marzo 2016 , all'interno

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

il coinvolgimento del clientewatsonmarketingwrotherpaperandreports

rl12345usen20170719.pdf .

2
ttps: //analyticsweek.com/content/bigdatafacts/ .

3
ttps: //en.wikipedia.org/wiki/World_population .

13 petabyte di nuovi dati al secondo,

780 petabyte al minuto,

46.800 petabyte (46,8 exabyte) all'ora e

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

circa 116 miliardi di foto ogni giorno!


Pagina 49

Statistiche aggiuntive sui Big Data

Per un divertente senso in tempo reale dei big data, dai un'occhiata

ttps: //www.internetlivestats.com , con varie statistiche, compresi i numeri


finora oggi di

Ricerche su Google.

Tweets.

Video visualizzati su YouTube.

Foto caricate su Instagram.

È 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.

Alcuni altri fatti interessanti sui bigdata:

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

lanetsshoeboxedsizedsatellitesvideo , 30 Giugno 2017.

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 .

473.400 tweet inviati.

2.083.333 foto Snapchat condivise.

97.222 ore di video Netflix visualizzate.

12.986.111 milioni di messaggi di testo inviati.

49.380 post su Instagram.

176.220 chiamate Skype.

750.000 brani Spotify trasmessi in streaming.

3.877.140 ricerche su Google.

4.333.560 video di YouTube guardati.

Potenza informatica nel corso degli anni


I dati stanno diventando sempre più grandi, così come la potenza di calcolo per elaborarli. Il
le prestazioni dei processori odierni sono spesso misurate in termini di FLOPS (floatingpoint

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 / .

I computer quantistici attualmente in fase di sviluppo potrebbero teoricamente funzionare


5
18.000.000.000.000.000.000 di volte la velocità dei "computer convenzionali" di oggi! Questo

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

numeri, in sistemi informatici commerciali "a prezzi ragionevoli" e persino desktop


computer, laptop, tablet e smartphone.

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

cosa usi per svolgere un determinato compito.

L'elaborazione dei dati mondiali richiede molta elettricità

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

Un altro enorme consumatore di elettricità è la criptovaluta basata su blockchain Bitcoin.


Pagina 52

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 .

Secondo alcune stime, un anno di transazioni Bitcoin consuma più energia di


9
molti paesi. Insieme, Bitcoin ed Ethereum (un'altra popolare blockchain basata
piattaforma e criptovaluta) consumano più energia all'anno rispetto a Israele e quasi altrettanto
0
come la Grecia.

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/ .

Opportunità per i big data

È 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

inoltre, aumentando rapidamente la necessità di professionisti informatici con datascience e


esperienza in informatica. È probabile che questa crescita continui per molti anni.

.7.1 Analisi dei Big Data


1
54UN
ue
hun'
.7.1 Analisi dei Big Data Pagina 53

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 .

3. Varietà: i dati erano alfanumerici (cioè costituiti da caratteri alfabetici, cifre,

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,

aziende, veicoli, città e altro ancora.


4. La veridicità - la validità dei dati - è completa e accurata? Possiamo fidarci di quei dati

quando si prendono decisioni cruciali? È vero?

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

Sono i big data.

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

abbiamo citato:ttps: //www.forbes.com/sites/gilpress/2013/05/28/avery

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/ .

ttp: //mattturck.com/wpcontent/uploads/2018/07/Matt_Turck_FirstMark_Big_Data_L ndscape_

.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.

Ci aspettiamo che i casi d'uso e i nostri esempi in tutto il libro ti ispirino


perseguire nuovi casi d'uso nella tua carriera. L'analisi dei bigdata ha portato a migliori profitti,

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

rilevamento delle anomalie

assistere le persone
con disabilità

rischio di autoassicurazione

predizione

chiuso automatizzato

sottotitoli

immagine automatizzata
prevedere il tempo
didascalie
vendite di prodotti sensibili

investimenti automatizzati riconoscimento facciale analisi predittiva

navi autonome
monitoraggio del fitness medicina preventiva

mappatura del cervello intercettazione di una frode


prevenire le malattie
focolai
identificazione del chiamante gioco

leggere la lingua dei segni


cancro
genomica e sanità
diagnosi / trattamento
valutazione immobiliare
Sistemi di informazione geografica
emissioni di carbonio
(GIS) raccomandazione
riduzione
sistemi
Sistemi GPS
classificando
ridurre l'overbooking
grafia miglioramento dei risultati di salute

ride sharing
visione computerizzata riduzione della riammissione ospedaliera

minimizzazione del rischio


livello di crediti sequenziamento del genoma umano

robo financial advisor


crimine: previsione prevenzione del furto di identità
posizioni
miglioramenti della sicurezza

6D

rime: predire immunoterapia auto a guida autonoma


Pagina 56

recidività
prezzi assicurativi analisi del sentiment

crimine: predittivo
polizia assistenti intelligenti sharing economy

prevenzione del crimine Internet of Things (IoT) e rilevamento della somiglianza


monitoraggio di dispositivi medici
città intelligenti
Gene CRISPR
la modifica Internet delle cose e del tempo
previsione case intelligenti

resa delle colture


contatori intelligenti
miglioramento controllo dell'inventario

traduzione in lingua termostati intelligenti


fidelizzazione dei clienti

servizi basati sulla posizione controllo intelligente del traffico


cliente
Esperienza
analisi sociale
programmi fedeltà

fidelizzazione dei clienti


rilevamento di malware analisi del grafico sociale
cliente Mappatura rilevamento dello spam
soddisfazione

analisi dei dati spaziali


marketing
assistenza clienti

analisi di marketing reclutamento sportivo e


assistenza clienti
istruire
agenti
generazione di musica
previsioni del mercato azionario
diete personalizzate
traduzione naturallanguage
rendimento degli studenti
sicurezza informatica
nuovi prodotti farmaceutici valutazione

estrazione dei dati


prevenzione dell'abuso di oppioidi testo riassuntivo

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

vittima di disastro prevedere focolai di malattie riconoscimento vocale


Pagina 57

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

rilevamento delle emozioni

energia
consumo

riduzione

1.8 CASO DI STUDIO: APPLICAZIONE MOBILE PER BIG DATA


8
L'app di navigazione GPS Waze di Google, con i suoi 90 milioni di utenti attivi mensilmente, è una delle

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

dinamicamente al mutare delle situazioni di traffico.

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

questi in hapters 11 - 6 . Per esempio,

C
61
h

La maggior parte delle app create oggi utilizza almeno alcuni software opensource. Ne approfitterai Pagina 58

molte biblioteche e strumenti opensource in questo libro.

Waze comunica informazioni su Internet tra i propri server e i propri utenti


dispositivi mobili. Oggi, tali dati vengono spesso trasmessi in JSON (JavaScript Object

Notation), che introdurremo in capitolo 9 e utilizzarlo nei capitoli successivi. Il


I dati JSON sono in genere nascosti dalle librerie che utilizzi.

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

capacità di sintesi e riconoscimento vocale in capitolo 13 .

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

visualizzazioni dinamiche con Matplotlib e Seaborn in tutto il libro e noi mostriamo


mappe interattive con Folium in formato hapters 12 e 6.

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

introdurre l'IoT e lavorare con sensori di streaming IoT simulati.

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

6 , introdurremo varie tecnologie di infrastruttura bigdata per la ricezione dello streaming


dati, archiviando tali big data in database appropriati ed elaborando i dati con il software

e hardware che forniscono capacità di elaborazione massicciamente parallele.

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

e fare previsioni basate su quei 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

di telecamere e altri sensori utilizzando tecniche di calcolo approfondito per


analizzare le immagini "al volo" e segnalare automaticamente tali elementi. Introduciamo in profondità

apprendimento per la visione artificiale in capitolo 15 .


1.9 INTRO ALLA DATA SCIENCE: INTELLIGENZA ARTIFICIALE—
ALL'INTERSEZIONE DI CS E DATA SCIENCE
Quando un bambino apre gli occhi per la prima volta, "vede" i volti dei suoi genitori? Ne capisce qualcosa

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

pensiero spaventoso per molte persone.

Pietre miliari dell'intelligenza artificiale


Diverse pietre miliari dell'intelligenza artificiale, in particolare, hanno catturato l'attenzione della gente e
l'immaginazione, ha fatto sì che il grande pubblico iniziasse a pensare che l'IA fosse reale e ha fatto riflettere le aziende

sulla commercializzazione dell'IA:

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

il capitolo 14 discute l'apprendimento automatico.

3
ttps: //www.techrepublic.com/article/ibmwatsontheinside

storia di come è nato il pericolo che ha vinto il supercomputer e

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

Campione europeo di Go Fan Hui . Go è considerato un gioco molto più complesso di


scacchi. il capitolo 15 discute le reti neurali e l'apprendimento profondo.

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

quasi esclusivamente dipendente dal progetto. Nessuna pressione!

Ho studiato i test del QI standardizzati che le scuole amministrano per aiutarli a valutarli

capacità di intelligenza degli studenti. Essendo un matematico in fondo, ho deciso di affrontare il


popolare problema IQtest di prevedere il numero successivo in una sequenza di numeri di

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

da molto tempo e quasi sempre ha trovato la risposta giusta.

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.

Negli anni ho provato quella sequenza su amici, parenti e colleghi professionisti. UN

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)

conoscenza del mondo.

Watson e Big Data aprono nuove possibilità

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

tecnologie e ha contribuito a dare forma hapters 11 - 6 di questo libro.

È 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

infrastruttura che consente a informatici e scienziati di dati di implementare leadingedge


Soluzioni basate su AI in modo efficace.

AI: un campo con problemi ma senza soluzioni


Per molti decenni, l'IA è stata vista come un campo con problemi ma senza soluzioni. Quello è

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.

Molti dei problemi più interessanti e stimolanti vengono affrontati in profondità

apprendimento. Solo Google ha migliaia di progetti di deeplearning in corso e questo numero lo è


1, 2
in rapida crescita. Mentre lavori in questo libro, ti presenteremo molti aspetti

la pratica dell'intelligenza artificiale, dei big data e delle tecnologie cloud.

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

e casi di studio basati su cloud in cui presentiamo hapters 11 - 6.

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

interprete e quaderni Jupyter. Abbiamo introdotto il cloud e l'Internet of Things


(IoT), ponendo le basi per le applicazioni contemporanee in cui svilupperai hapters

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

2. Introduzione alla programmazione Python


storia

Obiettivi
opiche

In questo capitolo potrai:


guadagnando Pat

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.

ettingsCrea variabili per memorizzare i dati per un uso successivo.


Acquisisci
Supporto familiarità con i tipi di dati incorporati.

Disconnessione
Usa operatori aritmetici e operatori di confronto e comprendi i loro
precedenza.

Usa stringhe singole, doppie e triple.

Usa la funzione di stampa incorporata per visualizzare il testo.

Utilizzare l'input della funzione incorporata per richiedere all'utente di immettere i dati sulla tastiera e ottenere
quei dati da utilizzare nel programma.

Converti il ​testo in valori interi con la funzione incorporata int.

Usa gli operatori di confronto e l'istruzione if per decidere se eseguire un file


dichiarazione o gruppo di dichiarazioni.

Informazioni sugli oggetti e sulla digitazione dinamica di Python.

Usa il tipo di funzione incorporato per ottenere il tipo di un oggetto

Contorno

1
Pagina 65
.1 Introduzione

.2 Variabili e dichiarazioni di assegnazione

.3 Aritmetica

.4 Stampa delle funzioni e un'introduzione alle stringhe con virgolette singole e doppie

.5 Stringhe con tripla citazione

.6 Ottenere input dall'utente

.7 Processo decisionale: istruzione if e operatori di confronto

.8 Oggetti e digitazione dinamica

.9 Introduzione alla scienza dei dati: statistiche descrittive di base

.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.

2.2 VARIABILI E DICHIARAZIONI DI ASSEGNAZIONE


Hai usato la modalità interattiva di IPython come calcolatrice con espressioni come

In [1]: 45 + 72
Uscita [1]: 117

Creiamo una variabile chiamata x che memorizza il numero intero 7:

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

È ora possibile utilizzare i valori di x e y nelle espressioni:

In [4]: ​x + y
Uscita [4]: ​10

Calcoli nelle dichiarazioni di assegnazione

La seguente istruzione aggiunge i valori delle variabili x e y e assegna il risultato a


la variabile totale, che poi visualizziamo:

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

In [8]: digitare ( 10.5 )


Out [8]: float

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.

Pitone Aritmetica Algebrico


Pitone
espressione
operazione operatore espressione

Aggiunta + f+7 f+7

Sottrazione - p-c pc

Moltiplicazione * b · m b*m

Esponenziazione ** X x ** y

Vera divisione / oo x/y

E
Pagina 68

o o

Divisione del piano // x // y

Resto
% r mod s r% s
(modulo)

Moltiplicazione (*)

Python utilizza l' operatore di moltiplicazione asterisco (*) :


In [1]: 7 * 4
Uscita [1]: 28

Esponenziazione (**)

L' operatore di esponenziazione (**) eleva un valore alla potenza di un altro:

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

True Division (/) vs Floor Division (//)

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

Nella vera divisione, 13 diviso 4 dà 3.25:

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:

lecca qui per visualizzare l'immagine del codice

In [10]: 123 / 0
ZeroDivisionError Traceback (la chiamata più recente per ultima
ipythoninput10cd759d3fcf39> in <module> ()
> 1 123 / 0

ZeroDivisionError : divisione per zero

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:

ZeroDivisionError: divisione per zero

Il capitolo "File ed eccezioni" discute le eccezioni in dettaglio.

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:

lecca qui per visualizzare l'immagine del codice

In [11]: z + 7

NameError Traceback (la chiamata più recente per ultima


ipythoninput11f2cdbf4fe75d> in <module> ()
>1z+ 7

NameError : il nome "z" non è definito

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

In questo caso, 17 diviso 5 produce un quoziente di 3 e un resto di 2. Questo operatore


è più comunemente usato con numeri interi, ma può anche essere usato con altri tipi numerici:

In [13]: 7,5 % 3,5


Uscita [13]: 0,5

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.

Raggruppamento di espressioni con parentesi


Le parentesi raggruppano le espressioni Python, come fanno nelle espressioni algebriche. Per
esempio, il codice seguente moltiplica 10 volte la quantità 5 + 3:

In [14]: 10 * ( 5 + 3 )
Uscita [14]: 80

Senza queste parentesi, il risultato è diverso :

In [15]: 10 * 5 + 3
Out [15]: 53

Le parentesi sono ridondanti (non necessarie) se rimuovendole si ottiene lo stesso risultato


risultato.

Regole di precedenza degli operatori

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.

2. Le operazioni di esponenziazione valutano successivamente. Se un'espressione contiene diversi file


operazioni di esponenziazione, Python le applica da destra a sinistra.

3. Le operazioni di moltiplicazione, divisione e modulo valutano successivamente. Se un'espressione

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

può essere tra parentesi, per chiarezza, come

lecca qui per visualizzare l'immagine del codice

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.

2.4 FUNCTION PRINT E INTRODUZIONE A SINGLE- AND


CORDE A DOPPIA CITAZIONE
La funzione di stampa incorporata mostra i suoi argomenti come una riga di testo:

lecca qui per visualizzare l'immagine del codice

In [1]: print ( 'Benvenuto in Python!' )


Benvenuto in Python!

In questo caso, l'argomento "Benvenuto in Python!" è una stringa, una sequenza di


caratteri racchiusi tra virgolette singole ('). A differenza di quando valuti le espressioni in
modalità interattiva, il testo visualizzato qui da stampare non è preceduto da Out [1]. Anche,

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:

lecca qui per visualizzare l'immagine del codice

In [2]: print ( "Benvenuto in Python!" )


Benvenuto in Python!

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.

Stampa di un elenco di elementi separati da virgole

La funzione di stampa può ricevere un elenco di argomenti separati da virgole, come in:

lecca qui per visualizzare l'immagine del codice

In [3]: print ( 'Benvenuto' , 'a' , 'Python!' )


Benvenuto in Python!

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.

Stampa di molte righe di testo con una sola istruzione

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

lecca qui per visualizzare l'immagine del codice

In [4]: ​print ( 'Benvenuto \ nto \ n \ nPython!' )


benvenuto
per

Pitone!

Altre sequenze di escape

La tabella seguente mostra alcune sequenze di escape comuni.

Fuga
Descrizione
sequenza

Inserisce un carattere di nuova riga in una stringa. Quando la stringa è


\n visualizzato, per ogni nuova riga, spostare il cursore del video su
all'inizio della riga successiva.

Inserisci una tabulazione orizzontale. Quando viene visualizzata la stringa, per ciascuna scheda,
\t
spostare il cursore del video al successivo punto di tabulazione.

\\ Inserisce un carattere barra rovesciata in una stringa.

io
C
Pagina 75
\" Inserisce una virgoletta doppia in una stringa.

\' Inserisci una virgoletta singola in una stringa.

Ignorare un'interruzione di riga in una stringa lunga

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:

lecca qui per visualizzare l'immagine del codice

In [5]: print ( 'questa è una stringa più lunga, quindi \


...: dividerlo su due righe ' )
questa è una stringa più lunga, quindi la dividiamo su due righe

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.

Stampa del valore di un'espressione

I calcoli possono essere eseguiti in istruzioni di stampa:

lecca qui per visualizzare l'immagine del codice

In [6]: print ( 'Sum is' , 7 + 3 )


La somma è 10

2.5 STRINGHE TRIPLA


In precedenza, abbiamo introdotto stringhe delimitate da una coppia di virgolette singole (') o da una coppia di doppie
virgolette ("). Le stringhe tra virgolette iniziano e finiscono con tre virgolette doppie (" "") o

tre virgolette singole ('' '). La Guida allo stile per il codice Python consiglia tre doppie
virgolette ("" "). Utilizzale per creare:

C
Pagina 76
stringhe multilinea,

stringhe contenenti virgolette singole o doppie e

docstrings , che sono il modo consigliato per documentare gli scopi di alcuni file
componenti del programma.

Comprese le virgolette nelle stringhe

In una stringa delimitata da virgolette singole, puoi includere caratteri virgolette doppie:

lecca qui per visualizzare l'immagine del codice

In [1]: print ( "Visualizza" ciao "tra virgolette" )


Mostra "ciao" tra virgolette

ma non virgolette singole:


lecca qui per visualizzare l'immagine del codice

In [2]: print ( "Mostra" ciao "tra virgolette" )


File "<ipythoninput219bf596ccf72>", riga 1
print ('Mostra' ciao 'tra virgolette')
^
SyntaxError : sintassi non valida

a meno che non utilizzi la sequenza di escape \ ':

lecca qui per visualizzare l'immagine del codice

In [3]: print ( "Visualizza \" ciao \ "tra virgolette" )


Mostra "ciao" tra virgolette

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:

sintassi non valida.

Una stringa delimitata da virgolette doppie può includere virgolette singole:

lecca qui per visualizzare l'immagine del codice

In [4]: ​print ( "Visualizza il nome O'Brien" )


Pagina 77
Mostra il nome O'Brien

ma non virgolette doppie, a meno che non utilizzi la sequenza di escape \ ":

lecca qui per visualizzare l'immagine del codice

In [5]: print ( "Visualizza \" ciao \ "tra virgolette" )


Mostra "ciao" tra virgolette

Per evitare di utilizzare \ 'e \ "all'interno di stringhe, puoi racchiudere tali stringhe tra virgolette triple:

lecca qui per visualizzare l'immagine del codice

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:

lecca qui per visualizzare l'immagine del codice

In [7]: triple_quoted_string = "" "Questa è una tripla citazione


...: stringa che si estende su due righe "" "

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

In [8]: print (triple_quoted_string)


Questa è una tripla citazione
stringa che si estende su due righe

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:

lecca qui per visualizzare l'immagine del codice

In [9]: triple_quoted_string
Out [9]: "Questa è una stringa con virgolette triple che si estende su due righe"

2.6 OTTENERE INGRESSO DALL'UTENTE


La funzione di input incorporata richiede e ottiene l'input dell'utente:

lecca qui per visualizzare l'immagine del codice

In [1]: name = input ( "Come ti chiami?" )


Come ti chiami? Paolo

In [2]: nome
Uscita [2]: "Paul"

In [3]: print (nome)


Paolo

Lo snippet viene eseguito come segue:

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:

lecca qui per visualizzare l'immagine del codice

In [4]: ​name = input ( "Come ti chiami?" )


Come ti chiami? 'Paolo'

C
Pagina 79
In [5]: nome
Uscita [5]: "'Paul'"
In [6]: print (nome)
'Paolo'

Input della funzione Restituisce sempre una stringa

Considera i seguenti frammenti che tentano di leggere due numeri e aggiungerli:

lecca qui per visualizzare l'immagine del codice

In [7]: value1 = input ( "Enter first number:" )


Immettere il primo numero: 7

In [8]: value2 = input ( "Enter second number:" )


Immettere il secondo numero: 3

In [9]: valore1 + valore2


Uscita [9]: "73"

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.

Ottenere un numero intero dall'utente

Se hai bisogno di un numero intero, converti la stringa in un numero intero utilizzando la funzione incorporata int :

lecca qui per visualizzare l'immagine del codice

In [10]: value = input ( "Enter an integer:" )


Immettere un numero intero: 7

In [11]: value = int (value)

In [12]: valore
Uscita [12]: 7

Avremmo potuto combinare il codice negli snippet [10] e [11]:

lecca qui per visualizzare l'immagine del codice

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):

In [15]: valore + altro_valore


Uscita [15]: 20

Se la stringa passata a int non può essere convertita in un numero intero, si verifica un'eccezione ValueError:

lecca qui per visualizzare l'immagine del codice

In [16]: bad_value = int (input ( 'Enter another integer:' ))


Inserisci un altro numero intero: ciao

ValueError Traceback (la chiamata più recente last


ipythoninput16cd36e6cf8911> in <module> ()
> 1 bad_value = int (input ( 'Enter another integer:' ))

ValueError : valore letterale non valido per int () con base 10: 'hello'

La funzione int può anche convertire un valore a virgola mobile in un intero:

In [17]: int ( 10.5 )


Fuori [17]: 10

Per convertire le stringhe in numeri in virgola mobile, usa la funzione float incorporata .

2.7 PROCESSO DECISIONALE: LA DICHIARAZIONE IF E


OPERATORI A CONFRONTO
Una condizione è un'espressione booleana con il valore True o False . Il seguente
determina se 7 è maggiore di 4 e se 7 è minore di 4:

In [1]: 7 > 4
Out [1]: vero

C
<

In [2]: 7 < 4 Pagina 81


Fuori [2]: Falso

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.

Creerai spesso condizioni utilizzando gli operatori di confronto di seguito


tavolo:

Algebrico Pitone Campione


Senso
operatore operatore condizione

> > x> y x è maggiore di y

< < x <y x è minore di y

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 <=

(scrivendoli come = !, => e = <).

Prendere decisioni con l'istruzione if: Introduzione agli script

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

oppure, se sei già in IPython, puoi utilizzare il comando:

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)

lecca qui per visualizzare l'immagine del codice

Inserisci due numeri interi e ti dirò le relazioni che soddisfano.


Inserisci il primo numero intero: 37
Inserisci il secondo numero intero: 42
37 non è uguale a 42
37 è inferiore a 42
37 è minore o uguale a 42

lecca qui per visualizzare l'immagine del codice

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

lecca qui per visualizzare l'immagine del codice

Inserisci due numeri interi e ti dirò le relazioni che soddisfano.


Inserisci il primo numero intero: 54
Inserisci il secondo numero intero: 17
54 non è uguale a 17
54 è maggiore di 17
54 è maggiore o uguale a 17
Commenti

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:

"" "Confronto di numeri interi utilizzando istruzioni if ​e operatori di confronto." ""

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

Righe vuote Pagina 85

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.

Suddivisione di una frase lunga su più righe

Righe 4–5

lecca qui per visualizzare l'immagine del codice

print ( 'Inserisci due numeri interi e te lo dirò' ,


"le relazioni che soddisfano." )

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.

Lettura di valori interi dall'utente

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

lecca qui per visualizzare l'immagine del codice

se numero1 == numero2:
print (numero1, 'è uguale a' , numero2)

utilizza l'operatore di confronto == per determinare se i valori delle variabili

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.

Rientro della suite

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 =

Utilizzando il simbolo di assegnazione (=) invece dell'operatore di uguaglianza (==) in un if

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

È possibile concatenare confronti per verificare se un valore è in un intervallo. Il seguente


il confronto determina se x è compreso tra 1 e 5, inclusi:

In [1]: x = 3

In [2]: 1 <= x <= 5


Out [2]: vero

In [3]: x = 10

In [4]: 1 <= x <= 5


Fuori [4]: ​Falso

Precedenza degli operatori che abbiamo presentato finora

Di seguito viene mostrata la precedenza degli operatori introdotti in questo capitolo:

Tipo di raggruppamento operatori

l
Pagina 87
lasciato a
() parentesi
giusto
giusto per
** esponenziazione
sinistra

lasciato a moltiplicazione, divisione vera, divisione piano,


* / //%
giusto resto

lasciato a
+- addizione, sottrazione
giusto

> <= < lasciato a minore di, minore o uguale, maggiore di, maggiore

>= giusto di o uguale

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

2.8 OGGETTI E DIGITAZIONE DINAMICA


Valori come 7 (un numero intero), 4.1 (un numero in virgola mobile) e "cane" sono tutti oggetti.
Ogni oggetto ha un tipo e un valore:

In [1]: tipo ( 7 )
Out [1]: int

In [2]: digitare ( 4.1 )

Out [2]: float Pagina 88

In [3]: tipo ( "cane" )


Uscita [3]: str

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).

Le variabili si riferiscono agli oggetti

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 [9]: digitare (x)


Out [9]: int

In [10]: x = 4.1

In [11]: digitare (x)


Out [11]: float

Pagina 89
In [12]: x = "dog"

In [13]: digitare (x)


Uscita [13]: str

Raccolta dei rifiuti

Python crea oggetti in memoria e li rimuove dalla memoria se necessario. Dopo


snippet [10], la variabile x ora si riferisce a un oggetto float. L'oggetto intero da
lo snippet [7] non è più vincolato a una variabile. Come vedremo in un capitolo successivo, Python
rimuove automaticamente tali oggetti dalla memoria. Questo processo, chiamato spazzatura
raccolta: aiuta a garantire che la memoria sia disponibile per i nuovi oggetti creati.

2.9 INTRO ALLA DATA SCIENCE: DESCRITTIVO DI BASE


STATISTICHE
Nella scienza dei dati, utilizzerai spesso le statistiche per descrivere e riepilogare i tuoi dati. Qui,
iniziamo introducendo diverse di queste statistiche descrittive , tra cui:

minimo: il valore più piccolo in una raccolta di valori.

massimo: il valore più grande in una raccolta di valori.

intervallo: l'intervallo di valori dal minimo al massimo.

count: il numero di valori in una raccolta.

sum: il totale dei valori in una raccolta.

Vedremo come determinare il conteggio e la somma nel prossimo capitolo. Misure di


la dispersione (chiamata anche misura della variabilità ), come l' intervallo , aiuta a determinare
quanto sono distribuiti i valori. Altre misure di dispersione che presenteremo più avanti
i capitoli includono la varianza e la deviazione standard .

Determinazione del minimo di tre valori

Innanzitutto, mostriamo come determinare manualmente il minimo di tre valori. Il


il seguente script richiede e immette tre valori, utilizza le istruzioni if ​per determinare
il valore minimo, quindi lo visualizza.

lecca qui per visualizzare l'immagine del codice

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)

lecca qui per visualizzare l'immagine del codice

Inserisci il primo numero intero: 12


Inserisci il secondo numero intero: 27
Immettere il terzo numero intero: 36
Il valore minimo è 12

lecca qui per visualizzare l'immagine del codice

Inserisci il primo numero intero: 27


Inserisci il secondo numero intero: 12
Immettere il terzo numero intero: 36
Il valore minimo è 12

lecca qui per visualizzare l'immagine del codice

Immettere il primo numero intero: 36


Inserisci il secondo numero intero: 27
Immettere il terzo numero intero: 12
Il valore minimo è 12

Dopo aver immesso i tre valori, elaboriamo un valore alla volta:

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.

La seconda istruzione if (righe 13-14) verifica quindi number3 <minimum, e if this


condition è True assegna il numero3 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.

Determinazione del minimo e del massimo con le funzioni integrate min e


max
Python ha molte funzioni incorporate per eseguire attività comuni. Funzioni incorporate
min e max calcolano rispettivamente il minimo e il massimo di una raccolta di
valori:

In [1]: min ( 36 , 27 , 12 )
Uscita [1]: 12

In [2]: max ( 36 , 27 , 12 )
Fuori [2]: 36

Le funzioni min e max possono ricevere un numero qualsiasi di argomenti.

Determinazione dell'intervallo di una raccolta di valori

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.

Programmazione in stile funzionale: riduzione

In questo libro, introduciamo vari tipi di programmazione in stile funzionale


capacità. Questi ti consentono di scrivere codice che può essere più conciso, più chiaro e più facile
per eseguire il debug -cioè, trovare e correggere gli errori. Le funzioni min e max sono esempi di

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.

Prossima introduzione alle sezioni sulla scienza dei dati

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.

Hai utilizzato la funzione di input per richiedere e ottenere input dall'utente in

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

In questo capitolo potrai:


arning Pat

Prendi decisioni con if, if else e if elif else.


ffers & Dea

Esegui ripetutamente le istruzioni con while e for.


ighlights

Riduci le espressioni di assegnazione con assegnazioni aumentate.


ttings

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.

Smetti di girare con una pausa.

Forza l'iterazione successiva di un ciclo con continue.

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

.6.1 Iterabili, elenchi e iteratori

.6.2 Funzione di portata incorporata

.7 Incarichi aumentati

.8 Iterazione controllata dalla sequenza; stringhe formattate

.9 Iterazione controllata da Sentinel

.10 Gamma di funzioni integrate: uno sguardo più profondo

.11 Utilizzo del tipo decimale per importi monetari

.12 break and continue Dichiarazioni

.13 Operatori booleani and, or and not

.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

range per generare sequenze di numeri interi.

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:

L'istruzione if esegue un'azione se una condizione è True o salta l'azione se il

condizione è False.

L' istruzione if ... else esegue un'azione se una condizione è True o esegue

una diversa azione se la condizione è falsa.

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.

Python fornisce due istruzioni di iterazione, nel frattempo e per:

L' istruzione while ripete un'azione (o un gruppo di azioni) fintanto che a


la condizione rimane vera.

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.

Parole chiave Python

e come asserire asincrono attendere

rompere classe continua def del

3
Pagina 96
elif altro tranne Falso finalmente

per a partire dal globale Se importare

nel è lambda Nessuna non locale

non o passaggio aumentare ritorno

Vero provare mentre con dare la precedenza


3.3 DICHIARAZIONE IF
Eseguiamo un'istruzione if di Python:

lecca qui per visualizzare l'immagine del codice

In [1]: voto = 85
In [2]: se voto> = 60 :
...: print ( 'Superato' )
...:
Passato

La condizione grade> = 60 è True, quindi l'istruzione print indentata in if's


suite visualizza "Superato".

Rientro della suite

È richiesto il rientro di una suite; in caso contrario, si verifica un errore di sintassi di IndentationError:

lecca qui per visualizzare l'immagine del codice

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

Un errore IndentationError si verifica anche se hai più di un'istruzione in una suite

e quelle dichiarazioni non hanno la stessa indentazione:

lecca qui per visualizzare l'immagine del codice

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.

Ogni espressione può essere interpretata come vera o falsa

Puoi basare le decisioni su qualsiasi espressione. Un valore diverso da zero è True. Zero è falso:

lecca qui per visualizzare l'immagine del codice

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 =

L'uso dell'operatore di uguaglianza == invece di = in un'istruzione di assegnazione può portare a


problemi sottili. Ad esempio, in questa sessione, lo snippet [1] ha definito il voto con

C
Pagina 98
Incarico:

grado = 85

Se invece scrivessimo accidentalmente:

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

Falso e non eseguire un incarico. Questo è un errore logico.

3.4 DICHIARAZIONI IF ELSE E IF ELIF ELSE


L'istruzione if else esegue suite diverse, a seconda che una condizione sia vera

o Falso:

lecca qui per visualizzare l'immagine del codice

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.

Il codice seguente assegna 57 al voto variabile, quindi mostra if else

ancora una volta per dimostrare che solo la suite else viene eseguita quando la condizione è

Falso:

lecca qui per visualizzare l'immagine del codice

In [3]: voto = 57

In [4]: se voto> = 60 : Pagina 99


...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Fallito

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:

lecca qui per visualizzare l'immagine del codice

In [5]: voto = 99

In [6]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...:
Passato

Espressioni condizionali

A volte le suite in un'istruzione if else assegnano valori diversi a una variabile,


in base a una condizione, come in:

lecca qui per visualizzare l'immagine del codice

In [7]: voto = 87

In [8]: se voto> = 60 :
...: risultato = 'Superato'
...: altro :
...: result = 'Failed'
...:

Possiamo quindi stampare o valutare quella variabile:

In [9]: risultato
Out [9]: "Passed"

C
Pagina 100
Puoi scrivere istruzioni come snippet [8] usando un'espressione condizionale concisa :

lecca qui per visualizzare l'immagine del codice

In [10]: risultato = ( "Superato" se voto> = 60 altro "Non superato " )

In [11]: risultato
Out [11]: "Passed"

Le parentesi non sono obbligatorie, ma chiariscono che l'istruzione assegna il


valore dell'espressione condizionale da ottenere. Innanzitutto, Python valuta il grado della condizione

> = 60:

Se è True, lo snippet [10] assegna come risultato il valore dell'espressione a sinistra


di if, vale a dire "Passed". La parte else non viene eseguita.
Se è False, lo snippet [10] assegna come risultato il valore dell'espressione a
diritto di altro, vale a dire "Fallito".

In modalità interattiva, puoi anche valutare direttamente l'espressione condizionale, come in:

lecca qui per visualizzare l'immagine del codice

In [12]: "Superato" se voto> = 60 altrimenti "Non superato "


Out [12]: "Passed"

Dichiarazioni multiple in una suite

Il codice seguente mostra due istruzioni nella suite else di un if ... else
dichiarazione:

lecca qui per visualizzare l'immagine del codice

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:

lecca qui per visualizzare l'immagine del codice

In [15]: voto = 100

In [16]: se voto> = 60 :
...: print ( 'Superato' )
...: altro :
...: print ( 'Fallito' )
...: print ( 'Devi ripetere questo corso' )
...:
Passato
Devi ripetere questo corso

if ... elif ... else Istruzione

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

L'altro nell'istruzione if ... elif ... else è facoltativo. Compreso ti consente


per gestire i valori che non soddisfano nessuna delle condizioni. Quando un if ... elif
dichiarazione senza un'altra verifica un valore che non rende vera nessuna delle sue condizioni,
il programma non esegue nessuna delle suite dell'istruzione: l'istruzione successiva in
sequenza dopo l'esecuzione dell'istruzione if ... elif ... Se specifichi l'altro, tu
deve posizionarlo dopo l'ultimo elif, altrimenti si verifica un SyntaxError.

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.

3.5 DURANTE LA DICHIARAZIONE


L' istruzione while ti consente di ripetere una o più azioni durante una condizione

rimane vero. Usiamo un'istruzione while per trovare la prima potenza di 3 maggiore di 50:

lecca qui per visualizzare l'immagine del codice

In [1]: prodotto = 3

In [2]: while product <= 50 :


...: prodotto = 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.

3.6 PER DICHIARAZIONE


L' istruzione for consente di ripetere un'azione o più azioni per ogni elemento in un file
sequenza di elementi. Ad esempio, una stringa è una sequenza di singoli caratteri. Andiamo
visualizzare 'Programmazione' con i suoi caratteri separati da due spazi:

lecca qui per visualizzare l'immagine del codice

In [1]: per il carattere in "Programmazione" :


...: print (carattere, fine = '' )
...:
Programming

L'istruzione for viene eseguita come segue:

Entrando nell'istruzione, assegna al target la "P" in "Programmazione"


variabile tra le parole chiave per e in, in questo caso, carattere.

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 =.

Argomento parola chiave sep di stampa della funzione

È 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:

lecca qui per visualizzare l'immagine del codice

In [2]: print ( 10 , 20 , 30 , sep = ',' )


10, 20, 30

Per rimuovere gli spazi predefiniti, utilizzare sep = '' (ovvero una stringa vuota).

3.6.1 Iterabili, elenchi e iteratori


La sequenza a destra della parola chiave in dell'istruzione for deve essere un iterabile , ovvero
è un oggetto da cui l'istruzione for può prendere un elemento alla volta fino a quando non più
gli elementi rimangono. Python ha altri tipi di sequenza iterabili oltre alle stringhe. Uno dei più
comune è un elenco , che è una raccolta di elementi separati da virgole racchiusi in un quadrato
parentesi ([e]). Il codice seguente totalizza cinque numeri interi in un elenco:

lecca qui per visualizzare l'immagine del codice

In [3]: totale = 0

In [4]: per il numero in [ 2 , 3 , 0 , 17 , 9 ]:


...: totale = totale + numero
...:

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).

3.6.2 Funzione di portata incorporata


Usiamo un'istruzione for e la funzione di intervallo incorporata per iterare esattamente 10
volte, visualizzando i valori da 0 a 9:

lecca qui per visualizzare l'immagine del codice

In [6]: per contatore in serie ( 10 ):


...: print (counter, end = '' )
...:
0123456789

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

Un tipo comune di errore offbyone si verifica quando si assume l'argomento di quell'intervallo


il valore è incluso nella sequenza generata. Ad esempio, se fornisci 9 come intervallo
quando si tenta di produrre la sequenza da 0 a 9, l'intervallo genera solo 0
fino a 8.

3.7 INCARICHI AUMENTATI


Le assegnazioni aumentate abbreviano le espressioni di assegnazione in cui lo stesso
il nome della variabile appare a sinistra ea destra del = dell'assegnazione, come total fa in:

lecca qui per visualizzare l'immagine del codice

per numero in [ 1 , 2 , 3 , 4 , 5 ]:

totale = totale + numero Pagina 106

Lo snippet [2] lo reimplementa utilizzando un'addizione aumentata di assegnazione (+ =)

dichiarazione :

lecca qui per visualizzare l'immagine del codice

In [1]: totale = 0

In [2]: per il numero in [ 1 , 2 , 3 , 4 , 5 ]:


...: totale + = numero # aggiunge il numero al totale
...:

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

/= g/=2 g=g/2 4,5 a g

C
Pagina 107
// = g // = 2 g = g // 2 4ag

%= h% = 9 h = h% 9 3 alle h

3.8 ITERAZIONE CONTROLLATA IN SEQUENZA; FORMATTATO


STRINGHE
Questa sezione e la successiva risolvono due problemi di media delle classi. Considera quanto segue
dichiarazione dei requisiti:

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 .

lecca qui per visualizzare l'immagine del codice

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

La media della classe è 81,7

Le righe 5-6 creano le variabili total e grade_counter e inizializzano ciascuna a 0.


Linea 7

lecca qui per visualizzare l'immagine del codice

voti = [ 98 , 76 , 71 , 87 , 83 , 90 , 57 , 79 , 82 , 94 ] # elenco di 10 voti

crea i voti variabili e li inizializza con un elenco di 10 voti interi.

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.

Introduzione alle stringhe formattate

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:

lecca qui per visualizzare l'immagine del codice

f "La media della classe è {media} "

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.

3.9 ITERAZIONE CONTROLLATA DA SENTINEL


Generalizziamo il problema della media di classe. Considera i seguenti requisiti
dichiarazione:

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.

Implementazione dell'iterazione controllata da Sentinel

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.

lecca qui per visualizzare l'immagine del codice

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 :

18 media = totale / grado_counter Pagina 110


19 print (f 'La media della classe è {media: .2 f} ' )
20 altro :
21 print ( "Non sono stati inseriti voti" )

lecca qui per visualizzare l'immagine del codice

Inserisci voto, da 1 a fine: 97


Inserisci voto, da 1 a fine: 88
Inserisci voto, da 1 a fine: 72
Inserisci voto, 1 per terminare: 1
La media della classe è 85,67

Logica di programma per iterazione controllata da Sentinel

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

viene eseguito, aggiungendo il valore del voto al totale e incrementando il

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.

Formattazione della media della classe con due cifre decimali

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"

discute molte altre funzionalità di formattazione delle stringhe.

3.10 GAMMA DI FUNZIONI INTEGRATE: UNO SGUARDO PIÙ PROFONDO


La gamma di funzioni ha anche due e tre versioni di strumenti. Come hai visto, range's
La versione oneargument produce una sequenza di numeri interi consecutivi da 0 fino a, ma
escluso il valore dell'argomento. La versione a due argomenti della gamma di funzioni produce
una sequenza di numeri interi consecutivi dal valore del primo argomento fino a, ma non
incluso, il valore del secondo argomento, come in:

lecca qui per visualizzare l'immagine del codice

In [1]: per numero di serie ( 5 , 10 ):


...: print (numero, fine = '' )
...:
56789

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 :

lecca qui per visualizzare l'immagine del codice

In [2]: per numero di intervallo ( 0 , 10 , 2 ):


...: print (numero, fine = '' )
...:
02468

Se il terzo argomento è negativo, la sequenza procede dal primo argomento


valore fino a, ma escluso il valore del secondo argomento, decrementato del
valore del terzo argomento, come in:

lecca qui per visualizzare l'immagine del codice

In [3]: per numero di serie ( 10 , 0 , 2 ):


...: print (numero, fine = '' )
...:
10 8 6 4 2

3C .11 UTILIZZO DEL TIPO DECIMALE PER GLI IMPORTI MONETARI


Pagina 112
3.11 UTILIZZO DEL TIPO DECIMALE PER GLI IMPORTI MONETARI
In questa sezione, introduciamo le funzionalità Decimal per calcoli monetari precisi. Se

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:

In [1]: importo = 112,31

In [2]: stampa (importo)


112.31

Tuttavia, se si stampa l'importo con 20 cifre di precisione a destra del decimale


punto, puoi vedere che il valore in virgola mobile effettivo in memoria non è esattamente 112,31
—È solo un'approssimazione:

lecca qui per visualizzare l'immagine del codice

In [3]: print (f ' {amount: .20 f} ' )


112.31000000000000227374

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 .

Importazione di tipo Decimal dal modulo decimal

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

Decimale e sue capacità.

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:

lecca qui per visualizzare l'immagine del codice


In [4]: da decimal import Decimal

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

In genere crei un decimale da una stringa:

lecca qui per visualizzare l'immagine del codice

hC
Pagina 114
In [5]: principal = Decimal ( '1000.00' )

In [6]: principale
In uscita [6]: decimale ("1000,00")

In [7]: tasso = decimale ( "0,05" )

In [8]: tasso
In uscita [8]: decimale ("0,05")

Presto utilizzeremo queste variabili principal e rate in un interesse composto


calcolo.

Aritmetica decimale

I decimali supportano gli operatori aritmetici standard +,, *, /, //, ** e%, oltre a
i corrispondenti incarichi aumentati:

In [9]: x = decimale ( '10,5 ' )

In [10]: y = decimale ( "2" )

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 ')

È possibile eseguire operazioni aritmetiche tra decimali e interi, ma non tra

Decimali e numeri in virgola mobile.

Dichiarazione sui requisiti per il problema degli interessi composti

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

p è l'importo originariamente investito (ovvero il capitale),

r è il tasso di interesse annuale,

n è il numero di anni e

una è la quantità in deposito alla fine del n ° anno.

Calcolo dell'interesse composto

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:

lecca qui per visualizzare l'immagine del codice

In [15]: per l' anno in serie ( 1 , 11 ):


...: importo = capitale * ( 1 + tasso) ** anno
...: print (f ' {anno:> 2 } {importo:> 10.2 f} ' )
...:
1 1050.00
2 1102.50
3 1157.62
4 1215.51
5 1276.28
6 1340.10
7 1407.10
8 1477.46
9 1551.33
10 1628.89

n
L'espressione algebrica (1 + r) dalla dichiarazione dei requisiti è scritta come

( 1 + tariffa) ** anno

dove il tasso variabile rappresenta re l' anno variabile rappresenta n .

Formattazione dell'anno e dell'importo del deposito

C
Pagina 116
La dichiarazione

lecca qui per visualizzare l'immagine del codice

print (f ' {anno:> 2} {importo:> 10.2f} ' )

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:

Puoi allineare i valori a sinistra con <.

L'identificatore di formato 10.2f nel segnaposto

{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

3.12 BREAK E CONTINUA AFFERMAZIONI


Le istruzioni break e continue alterano il flusso di controllo di un ciclo. Eseguire una pausa
dichiarazione in un istante o per esce immediatamente da tale istruzione. Nel codice seguente,

range produce la sequenza intera 0–99, ma il ciclo termina quando number è


10:

lecca qui per visualizzare l'immagine del codice

In [1]: per numero di serie ( 100 ):


...: se numero == 10 :
...: pausa
...: print (numero, fine = '' )
...:
0123456789

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.

L'esecuzione di un'istruzione continue in un ciclo while o for salta il resto del


suite di loop. In un attimo, la condizione viene quindi testata per determinare se il ciclo
dovrebbe continuare l'esecuzione. In un for, il ciclo elabora l'elemento successivo nella sequenza
(se presente):

lecca qui per visualizzare l'immagine del codice

In [2]: per numero di serie ( 10 ):


...: se numero == 5 :
...: continua
...: print (numero, fine = '' )
...:
012346789

3.13 OPERATORI BOOLEANI E, O E NON


C
Pagina 118
Gli operatori condizionali>, <,> =, <=, == e! = Possono essere usati per formare semplice
condizioni come grado> = 60. Per formare condizioni più complesse che si combinano
condizioni semplici, utilizzare gli operatori and , or e not booleani.

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:

lecca qui per visualizzare l'immagine del codice

In [1]: sesso = "Femmina"

In [2]: età = 70

In [3]: se sesso == "Femmina" ed età> = 65 :


...: print ( 'Senior female' )
...:
Femmina senior

L'istruzione if ha due semplici condizioni:

genere == "Femmina" determina se una persona è una donna e

età> = 65 determina se quella persona è un cittadino anziano.

La semplice condizione a sinistra dell'operatore e valuta per prima perché == ha


precedenza maggiore di e. Se necessario, la semplice condizione a destra di e
valuta dopo, perché> = ha una precedenza maggiore di e. (Discuteremo a breve perché
il lato destro di un operatore and valuta solo se il lato sinistro è True.) L'intero if
la condizione dell'istruzione è vera se e solo se entrambe le condizioni semplici sono vere. Il
la condizione combinata può essere resa più chiara aggiungendo parentesi ridondanti

lecca qui per visualizzare l'immagine del codice

(sesso == 'Femmina' ) e (età> = 65 )

La tabella seguente riassume l'operatore e mostrando tutti e quattro i possibili

C
combinazioni di valori False e True per expression1 e expression2: tali tabelle Pagina 119
sono chiamate tabelle di verità :

espressione1 espressione2 espressione1 ed espressione2

Falso Falso Falso

Falso Vero Falso

Vero Falso Falso

Vero Vero Vero

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:

lecca qui per visualizzare l'immagine del codice

In [4]: ​semester_average = 83

In [5]: final_exam = 95

In [6]: se semester_average> = 90 o final_exam> = 90 :


...: print ( 'Lo studente riceve una A' )
...:
Lo studente ottiene un A

Lo snippet [6] contiene anche due semplici condizioni:

semester_average> = 90 determina se la media di uno studente era un A (90


o superiore) durante il semestre, e

C
Pagina 120
final_exam> = 90 determina se il voto finalexam di uno studente era un A.

La tabella di verità di seguito riepiloga l'operatore booleano o. Operatore e ha una maggiore


precedenza rispetto a o.

espressione1 espressione2 espressione1 o espressione2

Falso Falso Falso

Falso Vero Vero


Vero Falso Vero

Vero Vero Vero

Miglioramento delle prestazioni con la valutazione del cortocircuito

Python smette di valutare un'espressione and non appena sa se l'intero file


condizione è False. Allo stesso modo, Python smette di valutare un'espressione o non appena questa
sa se l'intera condizione è vera. Questa è chiamata valutazione del cortocircuito . Così
la condizione

lecca qui per visualizzare l'immagine del codice

sesso == "Femmina" ed età> = 65

smette di valutare immediatamente se il sesso non è uguale a 'Femmina' perché il tutto


l'espressione deve essere False. Se il sesso è uguale a "Femmina", l'esecuzione continua,
perché l'intera espressione sarà True se l'età è maggiore o uguale a 65.

Allo stesso modo, la condizione

C
Pagina 121
lecca qui per visualizzare l'immagine del codice

semester_average> = 90 o final_exam> = 90

interrompe la valutazione immediatamente se semester_average è maggiore o uguale a 90


perché l'intera espressione deve essere True. Se semester_average è inferiore a 90,
l'esecuzione continua, perché l'espressione potrebbe essere ancora True se final_exam lo è

maggiore o uguale a 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:

lecca qui per visualizzare l'immagine del codice

In [7]: voto = 87

In [8]: se non voto == 1 :


...: print ( 'Il voto successivo è' , voto)
...:
Il grado successivo è 87
Spesso si può evitare di utilizzare not esprimendo la condizione in modo più “naturale” o
modo conveniente. Ad esempio, l'istruzione if precedente può anche essere scritta come
segue:

lecca qui per visualizzare l'immagine del codice

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.

espressione non espressione

Falso Vero

Vero Falso

La tabella seguente mostra la precedenza e il raggruppamento degli operatori così introdotti


lontano, dall'alto verso il basso, in ordine decrescente di precedenza.

Operatori Raggruppamento

() da sinistra a destra

** da destra a sinistra

* / //% da sinistra a destra

+ da sinistra a destra

<<=>> = ==! = da sinistra a destra

non da sinistra a destra

T
e da sinistra a destra Pagina 123

o da sinistra a destra

3.14 INTRO A DATA SCIENCE: MISURE DI


TENDENZA CENTRALE: MEDIA, MEDIA E MODO
Qui continuiamo la nostra discussione sull'utilizzo delle statistiche per analizzare i dati con diversi
statistiche descrittive aggiuntive, tra cui:

media: il valore medio in un insieme di valori.

mediana: il valore medio quando tutti i valori sono disposti in ordine ordinato .

modalità: il valore che si verifica più di frequente .

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.

Calcoliamo la media, la mediana e il modo su un elenco di numeri interi. La sessione successiva


crea un elenco chiamato voti, quindi utilizza le funzioni incorporate sum e len per il calcolo
la media "a mano": la somma calcola il totale dei voti (397) e len restituisce il
numero di voti (5):

lecca qui per visualizzare l'immagine del codice

In [1]: voti = [ 85 , 93 , 45 , 89 , 85 ]

In [2]: somma (voti) / len (voti)


Uscita [2]: 79,4

Il capitolo precedente ha menzionato il conteggio e la somma delle statistiche descrittive:


implementato in Python come funzioni incorporate len e sum. Come le funzioni min e

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:

In [3]: statistiche sulle importazioni

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 :

lecca qui per visualizzare l'immagine del codice


In [4]: ​statistics.mean (voti)
Uscita [4]: ​79,4

In [5]: statistics.median (voti)


Uscita [5]: 85

In [6]: statistics.mode (voti)


Uscita [6]: 85

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:

In [7]: ordinato (voti)


Uscita [7]: [45, 85, 85, 89, 93]

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

Crea funzioni personalizzate.


ffers & Dea

Importa e utilizza i moduli della libreria standard Python, come random e math, in
ighlights
riutilizza il codice ed evita di "reinventare la ruota".

ettingsPassa i dati tra le funzioni.

Supporto
Genera un intervallo di numeri casuali.

Disconnessione
Vedi le tecniche di simulazione che utilizzano la generazione di numeri casuali.

Semina il generatore di numeri casuali per garantire la riproducibilità.

Comprimere i valori in una tupla e decomprimere i valori da una tupla.

Restituisce più valori da una funzione tramite una tupla.

Comprendi come l'ambito di un identificatore determina dove puoi utilizzare nel tuo programma
esso.

Crea funzioni con valori di parametro predefiniti.

Chiama funzioni con argomenti di parole chiave.

Crea funzioni che possono ricevere un numero qualsiasi di argomenti.

Usa i metodi di un oggetto.

Scrivi e usa una funzione ricorsiva.

4
Contorno Pagina 127

.1 Introduzione

.2 Definizione delle funzioni

.3 Funzioni con più parametri

.4 Generazione RandomNumber

.5 Case Study: Un gioco d'azzardo

.6 Libreria standard Python

.7 Funzioni del modulo matematico

.8 Utilizzo del completamento della scheda IPython per il rilevamento

.9 Valori dei parametri predefiniti

.10 Argomenti delle parole chiave

.11 Elenchi di argomenti arbitrari

.12 Metodi: funzioni che appartengono agli oggetti

.13 Regole di ambito

.14 import: uno sguardo più approfondito

.15 Passaggio di argomenti alle funzioni: uno sguardo più approfondito

.16 Ricorsione

.17 Programmazione FunctionalStyle

.18 Introduzione alla scienza dei dati: misure di dispersione

.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.

4.2 DEFINIZIONE DELLE FUNZIONI


Hai chiamato molte funzioni incorporate (int, float, print, input, type, sum, len,

min e max) e alcune funzioni dal modulo statistiche (media, mediana e


modalità). Ciascuno ha svolto un singolo compito ben definito. Spesso definirai e chiamerai personalizzato
funzioni. La sessione seguente definisce una funzione quadrata che calcola il quadrato di
il suo argomento. Quindi chiama la funzione due volte, una per quadrare il valore int 7
(producendo il valore int 49) e una volta per quadrare il valore float 2.5 (producendo il

valore float 6.25):

lecca qui per visualizzare l'immagine del codice

In [1]: def quadrato (numero):


...: "" "Calcola il quadrato del numero." ""
...: numero di ritorno ** 2
...:

In [2]: quadrato ( 7 ) Pagina 129


Uscita [2]: 49

In [3]: quadrato ( 2.5 )


Uscita [3]: 6.25

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.

Definizione di una funzione personalizzata


Una definizione di funzione (come il quadrato nello snippet [1]) inizia con la parola chiave def ,
seguito dal nome della funzione (quadrato), un insieme di parentesi e due punti (:). Piace
identificatori di variabili, per convenzione i nomi delle funzioni dovrebbero iniziare con una lettera minuscola
e nei nomi composti da più parole, i trattini bassi dovrebbero separare ogni parola.

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.

Specificare la docstring di una funzione personalizzata

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:

"" "Calcola il quadrato del numero." ""

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.

Restituzione di un risultato al chiamante di una funzione

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

il primo numero di quadrati, quindi termina la funzione e restituisce il risultato a


chiamante. In questo esempio, il primo chiamante è nello snippet [2], quindi IPython mostra il risultato
in Out [2]. Il secondo chiamante è nello snippet [3], quindi IPython mostra il risultato in

Fuori [3].

Le chiamate di funzione possono anche essere incorporate nelle espressioni. Il codice seguente chiama square
prima, poi stampa mostra il risultato:

lecca qui per visualizzare l'immagine del codice

In [4]: ​print ( 'Il quadrato di 7 è' , quadrato ( 7 ))


Il quadrato del 7 è 49

Esistono altri due modi per restituire il controllo da una funzione al suo chiamante:

L'esecuzione di un'istruzione return senza un'espressione termina la funzione e


restituisce implicitamente il valore None al chiamante. La documentazione di Python afferma
che Nessuno rappresenta l'assenza di un valore. Nessuno restituisce False nelle condizioni.

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.

Accesso alla docstring di una funzione tramite il meccanismo di aiuto di IPython

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 (?) :

lecca qui per visualizzare l'immagine del codice

C
Pagina 131
In [5]: quadrato?
Firma: quadrato (numero)
Docstring: Calcola il quadrato del numero.
File: ~ / Documents / examples / ch04 / <ipythoninput17268c8ff93a9>
Tipo: funzione

Per la nostra funzione quadrata, le informazioni visualizzate includono:

Il nome della funzione e l'elenco dei parametri, noto come firma .

La docstring della 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:

lecca qui per visualizzare l'immagine del codice

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 il codice sorgente non è accessibile da IPython, ?? mostra semplicemente la docstring.

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.

4.3 FUNZIONI CON PARAMETRI MULTIPLI


Definiamo una funzione di massimo che determina e restituisce il più grande di tre valori

—La sessione seguente chiama la funzione tre volte con numeri interi, virgola mobile
rispettivamente numeri e stringhe.

lecca qui per visualizzare l'immagine del codice

In [1]: def massimo (valore1, valore2, valore3):


...: "" "Restituisce il massimo di tre valori." ""
...: valore_max = valore1
...: se valore2> valore_max:
...: valore_max = valore2
...: se valore3> valore_max:
...: valore_max = valore3
...: restituisce max_value
...:

In [2]: massimo ( 12 , 27 , 36 )
Fuori [2]: 36

In [3]: massimo ( 12.3 , 45.6 , 9.7 )


Uscita [3]: 45.6

In [4]: ​massimo ( "giallo" , "rosso" , "arancione" )


Fuori [4]: ​"giallo"

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:

In [5]: massimo ( 13,5 , 3 , 7 )


Fuori [5]: 13.5

La chiamata massima (13.5, 'hello', 7) risulta in TypeError perché le stringhe e


i numeri non possono essere confrontati tra loro con l'operatore maggiore di (>).

Definizione della funzione massima

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.

Per determinare il valore più grande, elaboriamo un valore alla volta:

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.

La prima istruzione if quindi verifica value2> max_value e se questa condizione è

True assegna valore2 a max_value.

La seconda istruzione if verifica quindi value3> max_value e se questa condizione è

True assegna value3 a 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ù.

Funzioni max e min integrate di Python

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:

lecca qui per visualizzare l'immagine del codice

In [6]: max ( "giallo" , "rosso" , "arancione" , "blu" , "verde" )


Fuori [6]: "giallo"

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

4hC .4 GENERAZIONE DI NUMERI CASUALI


Pagina 134
4.4 GENERAZIONE DI NUMERI CASUALI
Ora prendiamo una breve deviazione in un tipo popolare di applicazione di programmazione—
simulazione e gioco. Puoi introdurre l' elemento del caso tramite
Modulo casuale della libreria standard di Python .

Lancio di un dado a sei facce

Produciamo 10 numeri interi casuali nell'intervallo 1-6 per simulare il lancio di un dado a sei facce:

lecca qui per visualizzare l'immagine del codice

In [1]: importa casuale

In [2]: in rotolo in serie ( 10 ):


...: print (random.randrange ( 1 , 7 ), end = '' )
...:
4255464615

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 :

lecca qui per visualizzare l'immagine del codice

In [3]: in rotolo in serie ( 10 ):


...: print (random.randrange ( 1 , 7 ), end = '' )
...:
4545141465

A volte, potresti voler garantire la riproducibilità di una sequenza casuale, per


debugging, per esempio. Alla fine di questa sezione, useremo il seme del modulo casuale
funzione per fare questo.

Lanciare un dado a sei facce 6.000.000 di volte

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 } ' )

lecca qui per visualizzare l'immagine del codice

Frequenza del viso


1 998686
2 1001481
3 999900
4 1000453
5 999953
6 999527

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.

Semina del generatore di numeri casuali per la riproducibilità


La funzione randrange genera effettivamente numeri pseudocasuali , basati su un file
calcolo interno che inizia con un valore numerico noto come seme . Ripetutamente
chiamare randrange produce una sequenza di numeri che sembrano essere casuali,
perché ogni volta che si avvia una nuova sessione interattiva o si esegue uno script che utilizza l'estensione
1
funzioni del modulo random, Python utilizza internamente un diverso valore seed . quando
stai eseguendo il debug di errori logici in programmi che utilizzano dati generati casualmente, può essere
utile usare la stessa sequenza di numeri casuali fino a quando non hai eliminato la logica
errori, prima di testare il programma con altri valori. Per fare ciò, puoi usare il
del modulo casuale seme funzione per inizializzare il generatore di RandomNumber da soli
-Questo forza randrange a iniziare a calcolare la sua sequenza numerica pseudocasuale da
il seme che specifichi. Nella sessione successiva, gli snippet [5] e [8] producono lo stesso
risultati, perché gli snippet [4] e [7] utilizzano lo stesso seme (32):

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.

lecca qui per visualizzare l'immagine del codice

In [4]: ​random.seed ( 32 )

In [5]: per rotolo in serie ( 10 ):


...: print (random.randrange ( 1 , 7 ), end = '' )
...:
1223624161
In [6]: in rotolo in serie ( 10 ):
...: print (random.randrange ( 1 , 7 ), end = '' )

...: Pagina 137


1353156435
In [7]: random.seed ( 32 )

In [8]: per rotolo in serie ( 10 ):


...: print (random.randrange ( 1 , 7 ), end = '' )
...:
1223624161

Snippet [6] genera valori diversi perché continua semplicemente lo pseudocasuale


sequenza numerica iniziata nello snippet [5].

4.5 CASO DI STUDIO: UN GIOCO DI CASE


In questa sezione, simuliamo il popolare gioco di dadi noto come "craps". Ecco il file
dichiarazione dei requisiti:

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.

Il seguente script simula il gioco e mostra diverse esecuzioni di esempio,


illustrando la vittoria al primo lancio, la sconfitta al primo lancio, la vittoria al successivo
rotolare e perdere in un tiro successivo.
lecca qui per visualizzare l'immagine del codice

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' )

lecca qui per visualizzare l'immagine del codice

Il giocatore ha ottenuto 2 + 5 = 7
Il giocatore vince

lecca qui per visualizzare l'immagine del codice

Il giocatore ha ottenuto 1 + 2 = 3
Il giocatore perde

lecca qui per visualizzare l'immagine del codice

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

lecca qui per visualizzare l'immagine del codice

Il giocatore ha ottenuto 1 + 5 = 6
Il punto è 6
Il giocatore ha ottenuto 1 + 6 = 7
Il giocatore perde

Funzione roll_dice: restituzione di più valori tramite una tupla

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 )

verifica se la tupla (7, 11) contiene il valore di sum_of_dice. Se questa condizione è

È 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

lecca qui per visualizzare l'immagine del codice

(sum_of_dice == 7 ) o (sum_of_dice == 11 )

Allo stesso modo, la condizione nella riga 24

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".

Per qualsiasi altra somma dei dadi (4, 5, 6, 8, 9 o 10):

la riga 27 imposta game_status su "CONTINUE" in modo che tu possa continuare a scorrere

C
Pagina 141
la riga 28 memorizza la somma dei dadi in my_point per tenere traccia di ciò che devi tirare
vincere e

la riga 29 mostra my_point.

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.

Visualizzazione dei risultati finali

Quando il ciclo termina, lo script passa all'istruzione if else (righe 43-46),


che stampa "Player wins" se game_status è "WON" o "Player perde"
altrimenti.

4.6 LIBRERIA STANDARD PYTHON


In genere, scrivi programmi Python combinando funzioni e classi (ovvero,
tipi personalizzati) che crei con funzioni e classi preesistenti definite in
moduli, come quelli nella libreria standard Python e altre librerie. Una chiave
l'obiettivo della programmazione è evitare di "reinventare la ruota".

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/

Hai già utilizzato funzionalità dal decimale, statistica e casuale


moduli. Nella sezione successiva, utilizzerai le capacità matematiche della matematica
modulo. Vedrai molti altri moduli della libreria standard Python in tutto il libro
esempi, inclusi molti di quelli nella tabella seguente:

Alcuni popolari moduli della libreria standard Python

math: costanti matematiche comuni


e operazioni.

os: interazione con l'operatore


collezioni: strutture dati
sistema.
oltre a liste, tuple, dizionari e
imposta.
profilo, pstats, timeit—
Analisi di performance.
Moduli di crittografia: crittografia
dati per una trasmissione sicura.
casuale: numeri pseudocasuali.

csv: elaborazione separata da virgole


re: espressioni regolari per
file di valori (come quelli in Excel).
corrispondenza del modello.

datetime: data e ora


sqlite3: relazionale SQLite
manipolazioni. Anche il tempo dei moduli
accesso al database.
e calendario.

statistica: matematica
decimale: virgola fissa e virgola mobile
funzioni statistiche come media,
aritmetica dei punti, inclusa quella monetaria
mediana, modo e varianza.
calcoli.

string: elaborazione delle stringhe.


doctest: include test di convalida
e risultati attesi in docstrings per
sys: argomento della riga di comando
semplice unit test.
hY
Pagina 143
gettext e locale— elaborazione; input standard,
Internazionalizzazione e localizzazione output standard e standard
moduli. flussi di errore.

json: notazione dell'oggetto JavaScript tkinter: utente grafico


(JSON) elaborazione utilizzata con web interfacce (GUI) e basate su canvas
servizi e documento NoSQL grafica.
banche dati.
tartaruga: grafica della tartaruga.

browser web: per convenienza


visualizzazione di pagine web in Python
app.

4.7 FUNZIONI DEL MODULO MATEMATICO


Il modulo di matematica definisce le funzioni per eseguire varie operazioni matematiche comuni
calcoli. Ricordiamo dal capitolo precedente che un'istruzione import di
il modulo seguente consente di utilizzare le definizioni di un modulo tramite il nome del modulo e un file
punto (.):

In [1]: importa matematica

Ad esempio, lo snippet seguente calcola la radice quadrata di 900 chiamando la matematica


la funzione sqrt del modulo , che restituisce il risultato come valore float:

In [2]: math.sqrt ( 900 )


Uscita [2]: 30.0

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

Funzione Descrizione Esempio

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

peccato ( x ) Seno trigonometrico di x ( x in radianti) sin (0,0) è 0,0

cos ( x ) Coseno trigonometrico di x ( x in radianti) cos (0,0) è 1,0

tan ( x ) Tangente trigonometrica di x ( x in radianti) tan (0,0) è 0,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

pow (2.0, 7.0)


è 128.0
pow ( x ,
x elevato alla potenza y ( x )
y)
pow (9.0, .5)
è 3.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

fmod ( x , fmod (9.8,


Resto di x / y come numero in virgola mobile
y) 4.0) è 1.8

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:

lecca qui per visualizzare l'immagine del codice

In [1]: importa matematica

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 [].

Visualizzazione degli identificatori in un modulo

Per visualizzare un elenco di identificatori definiti in un modulo, digitare il nome del modulo e un punto (.),
quindi premere Tab :

lecca qui per visualizzare l'immagine del codice

In [3]: matematica. <Tab>


acos () atan () copysign () e expm1 ()
acosh () atan2 () cos () erf () fabs ()
asin () atanh () cosh () erfc () fattoriale ()>
asinh () ceil () gradi () exp () floor ()

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

CommissionEmployee) rappresentano i nomi delle classi (non ce ne sono nei precedenti


elenco). Questa convenzione di denominazione, consigliata dalla Guida allo stile per il codice Python ,
è noto come CamelCase perché le lettere maiuscole risaltano come quelle di un cammello
gobbe.

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.

Python non ha costanti , sebbene molti oggetti in Python siano immutabili


(non modificabile). Quindi, anche se pi ed e sono costanti del mondo reale, non devi
assegnare loro nuovi valori , perché ciò cambierebbe i loro valori. Per aiutare a distinguere
costanti da altre variabili, la guida allo stile consiglia di denominare il file personalizzato
costanti con tutte le lettere maiuscole.

Utilizzo della funzione attualmente evidenziata

Mentre navighi tra gli identificatori, se desideri utilizzare un file


, inizia semplicemente a digitare i suoi argomenti tra parentesi. IPython quindi nasconde il file
elenco di completamento automatico. Se hai bisogno di ulteriori informazioni sull'elemento attualmente evidenziato,
puoi visualizzare la sua docstring digitando un punto interrogativo (?) dopo il nome e
premendo Invio per visualizzare la documentazione della guida. Quanto segue mostra i fab
docstring della funzione:

lecca qui per visualizzare l'immagine del codice

In [4]: ​math.fabs?
Docstring:
fabs (x)

Restituisce il valore assoluto del float x.


Digita: builtin_function_or_method

Il builtin_function_or_method mostrato sopra indica che fabs fa parte di un file


Modulo Python Standard Library. Tali moduli sono considerati integrati in Python.
In questo caso, fabs è una funzione incorporata nel modulo math.

4.9 VALORI DEI PARAMETRI DI DEFAULT

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:

lecca qui per visualizzare l'immagine del codice

In [1]: def rectangle_area (length = 2 , width = 3 ):


...: "" "Restituisce l'area di un rettangolo." ""
...: lunghezza di ritorno * larghezza
...:

Si specifica un valore di parametro predefinito seguendo il nome di un parametro con un = e a


valore: in questo caso, i valori dei parametri predefiniti sono 2 e 3 per lunghezza e larghezza,
rispettivamente. Tutti i parametri con valori di parametro predefiniti devono essere visualizzati nel file
elenco dei parametri a destra dei parametri che non hanno valori predefiniti.

La seguente chiamata a rectangle_area non ha argomenti, quindi IPython li usa entrambi


valori dei parametri predefiniti come se avessi chiamato rectangle_area (2, 3):

In [2]: rectangle_area ()
Fuori [2]: 6

La seguente chiamata a rectangle_area ha un solo argomento. Gli argomenti sono


assegnato ai parametri da sinistra a destra, quindi 10 viene utilizzato come lunghezza. L'interprete

passa il valore del parametro predefinito 3 per la larghezza come se avessi chiamato

rettangolo_area (10, 3):

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

4.10 PAROLE CHIAVE ARGOMENTI

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:

lecca qui per visualizzare l'immagine del codice

In [1]: def rectangle_area (length, width):


...: "" "Restituisce l'area di un rettangolo." ""
...: lunghezza di ritorno * larghezza
...:

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:

lecca qui per visualizzare l'immagine del codice

In [2]: rectangle_area (larghezza = 5 , lunghezza = 10 )


Uscita [3]: 50

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).

Definizione di una funzione con un elenco di argomenti arbitrario

Definiamo una funzione media che può ricevere un numero qualsiasi di argomenti:

lecca qui per visualizzare l'immagine del codice

In [1]: def media (* args):


...: return sum (args) / len (args)
...:

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:

lecca qui per visualizzare l'immagine del codice

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

len). Nota nella nostra definizione media che se la lunghezza di args è 0, a


Si verifica ZeroDivisionError. Nel prossimo capitolo vedrai come accedere a una tupla
elementi senza disimballarli.

Passaggio dei singoli elementi di un iterabile come argomenti della funzione


Puoi decomprimere gli elementi di una tupla, di una lista o di altri iterabili per passarli come singoli
argomenti della funzione. L' operatore * , quando applicato a un argomento iterabile in un file
chiamata di funzione, decomprime i suoi elementi. Il codice seguente crea una valutazione a cinque elementi
list, quindi utilizza l'espressione * grades per decomprimere i suoi elementi come media
argomenti:
C
Pagina 151
lecca qui per visualizzare l'immagine del codice

In [5]: voti = [ 88 , 75 , 96 , 55 , 83 ]

In [6]: media (* voti)


Uscita [6]: 79,4

La chiamata mostrata sopra è equivalente alla media (88, 75, 96, 55, 83).

4.12 METODI: FUNZIONI A CUI APPARTENGONO


OGGETTI
Un metodo è semplicemente una funzione che chiami su un oggetto usando il form

nome_oggetto . nome_metodo ( argomenti )

Ad esempio, la sessione seguente crea la variabile stringa s e le assegna la stringa


oggetto "Hello". Quindi la sessione chiama i metodi inferiore e superiore dell'oggetto , che
produrre nuove stringhe contenenti versioni tutte minuscole e tutte maiuscole dell'originale
stringa, lasciando s invariato:

lecca qui per visualizzare l'immagine del codice

In [1]: s = "Hello"

In [2]: s.lower () # chiama il metodo lower sull'oggetto stringa s


Uscita [2]: "ciao"

In [3]: s.upper ()
Uscita [3]: "CIAO"

In [4]: ​s
Uscita [4]: ​"Ciao"

Il riferimento alla libreria standard Python in

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.

4hC .13 REGOLE DI SCOPO


Pagina 152
4.13 REGOLE DI CAMPO DI APPLICAZIONE
Ogni identificatore ha un ambito che determina dove puoi usarlo nel tuo programma. Per
quella parte del programma, si dice che l'identificatore sia "nell'ambito".

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

sessione ovunque dopo la definizione.

Accesso a una variabile globale da una funzione

Puoi accedere al valore di una variabile globale all'interno di una funzione:

lecca qui per visualizzare l'immagine del codice

In [1]: x = 7

In [2]: def access_global ():


...: print ( 'x stampata da access_global:' , x)
...:

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:

lecca qui per visualizzare l'immagine del codice

In [4]: def try_to_modify_global ():


...: x = 3.5
...: print ( 'x stampato da try_to_modify_global:' , x)
...:

In [5]: try_to_modify_global ()
x stampato da try_to_modify_global: 3.5

C
Pagina 153
In [6]: x
Fuori [6]: 7

Nel blocco della funzione try_to_modify_global, la x locale ombreggia la x globale,


rendendolo inaccessibile nell'ambito del blocco della funzione. Lo snippet [6] lo mostra
la variabile globale x esiste ancora e ha il suo valore originale (7) dopo la funzione

try_to_modify_global viene eseguito.

Per modificare una variabile globale in un blocco funzione, è necessario utilizzare un'istruzione globale a
dichiarare che la variabile è definita nell'ambito globale:

lecca qui per visualizzare l'immagine del codice

In [7]: def modify_global ():


...: globale x
...: x = 'ciao'
...: print ( 'x stampata da modify_global:' , x)
...:

In [8]: modify_global ()
x stampato da modify_global: hello

In [9]: x
Uscita [9]: "ciao"

Blocks vs. Suites

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 è nell'ambito globale, tutte le variabili definite in


le istruzioni di controllo hanno un ambito globale.

Se l'istruzione di controllo è nel blocco di una funzione, tutte le variabili definite nel file
le istruzioni di controllo hanno un ambito locale.

Continueremo la nostra discussione sull'ambito nel capitolo "Programmazione ObjectOriented"


quando introduciamo classi personalizzate.

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:

lecca qui per visualizzare l'immagine del codice

In [10]: somma = 10 + 5

In [11]: sum
Uscita [11]: 15

In [12]: sum ([ 10 , 5 ])

TypeError Traceback (la chiamata più recente per ultima


ipythoninput121237d97a65fb> in <module> ()
> 1 somma ([ 10 , 5 ])

TypeError : l'oggetto 'int' non è richiamabile

Dichiarazioni a Global Scope

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.

4.14 IMPORTAZIONE: UNO SGUARDO PIÙ PROFONDO


Hai importato moduli (come matematica e casuale) con un'istruzione come:

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:

da nome_modulo importazione identificatore


C
<

Pagina 155
poi ha usato quell'identificatore senza doverlo precedere con il nome del modulo e un punto
(.).

Importazione di più identificatori da un modulo

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 (.):

lecca qui per visualizzare l'immagine del codice

In [1]: from math import ceil, floor

In [2]: ceil ( 10.3 )


Fuori [2]: 11

In [3]: floor ( 10.7 )


Uscita [3]: 10

Il tentativo di utilizzare una funzione non importata provoca un'eccezione NameError, che indica che il file
nome non è definito.

Attenzione: evitare le importazioni di caratteri jolly

È possibile importare tutti gli identificatori definiti in un modulo con un'importazione di caratteri jolly del modulo

da importazione nome 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 [5]: dalla matematica import *

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

Nomi di associazione per moduli e identificatori di modulo Pagina 156

A volte è utile importare un modulo e utilizzare un'abbreviazione per semplificarlo


il tuo codice. La clausola as dell'istruzione import consente di specificare il nome utilizzato per
fare riferimento agli identificatori del modulo. Ad esempio, in sezione 3.14 avremmo potuto importare
il modulo delle statistiche e accedere alla sua funzione di media come segue:

lecca qui per visualizzare l'immagine del codice

In [7]: importa le statistiche come statistiche

In [8]: voti = [ 85 , 93 , 45 , 87 , 93 ]

In [9]: stats.mean (voti)


Fuori [9]: 80.6

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

importa numpy come np

La documentazione della biblioteca menziona spesso nomi stenografici popolari.

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.

4.15 TRASFERIMENTO ARGOMENTI ALLE FUNZIONI: UN APPROFONDIMENTO


GUARDA
Diamo uno sguardo più da vicino a come gli argomenti vengono passati alle funzioni. In molti
linguaggi di programmazione, ci sono due modi per passare arguments- passbyvalue e
passbyreference (a volte chiamato callbyvalue e callbyreference ,
rispettivamente):

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.

Indirizzi di memoria, riferimenti e "puntatori"

Interagisci con un oggetto tramite un riferimento, che dietro le quinte è l'oggetto


indirizzo (o posizione) nella memoria del computer, talvolta chiamato "puntatore" in altri
le lingue. Dopo un incarico come

x= 7

la variabile x non contiene effettivamente il valore 7. Piuttosto, contiene un riferimento a un file


oggetto contenente 7 archiviato altrove nella memoria. Potresti dire che x "punta a" (che
è, riferimenti) l'oggetto contenente 7, come nel diagramma seguente:
ID funzione incorporata e identità degli oggetti

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.

Passaggio di un oggetto a una funzione


Definiamo una funzione cubo che mostri l'identità del suo parametro, quindi restituisca il
valore del parametro al cubo:

lecca qui per visualizzare l'immagine del codice

In [3]: def cube (numero):


...: print ( 'id (numero):' , id (numero))
...: numero di ritorno ** 3
...:

Quindi, chiamiamo cubo con l'argomento x, che si riferisce all'oggetto intero che contiene

7:

In [4]: ​cubo (x)


id (numero): 4350477840
Uscita [4]: ​343

L'identità visualizzata per il numero di parametro del cubo, 4350477840, è la stessa di


quello visualizzato per x in precedenza. Poiché ogni oggetto ha un'identità unica, sia il file
l'argomento x e il numero del parametro si riferiscono allo stesso oggetto durante l'esecuzione del cubo.
Quindi, quando il cubo funzione utilizza il numero di parametro nel suo calcolo, ottiene il valore di

numero dall'oggetto originale nel chiamante.

Test delle identità degli oggetti con l'operatore is


C
Pagina 159
Puoi anche provare che l'argomento e il parametro si riferiscono allo stesso oggetto con
L' operatore is di Python , che restituisce True se i suoi due operandi hanno la stessa identità :

lecca qui per visualizzare l'immagine del codice

In [5]: def cube (numero):


...: print ( 'number is x:' , number is x) # x è una variabile globale e
...: numero di ritorno ** 3
...:

In [6]: cubo (x)


il numero è x: vero
Uscita [6]: 343

Oggetti immutabili come argomenti

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:

lecca qui per visualizzare l'immagine del codice

In [7]: def cube (numero):


...: print ( 'id (numero) prima di modificare il numero:' , id (numero))
...: numero ** = 3
...: print ( 'id (numero) dopo aver modificato il numero:' , id (numero))
...: numero di ritorno
...:

In [8]: cubo (x)


id (numero) prima di modificare il numero: 4350477840
id (numero) dopo aver modificato il numero: 4396653744
Uscita [8]: 343

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à:

lecca qui per visualizzare l'immagine del codice

In [9]: print (f 'x = {x} ; id (x) = {id (x)} ' )


x = 7; id (x) = 4350477840

Oggetti mutabili come argomenti


Nel prossimo capitolo, lo mostreremo quando si fa riferimento a un oggetto mutabile come una lista
passato a una funzione, la funzione può modificare l'oggetto originale nel chiamante.

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

con 1! uguale a 1 e 0! definito come 1. Ad esempio, 5! è il prodotto 5 · 4 · 3 · 2 · 1,


che è uguale a 120.

Approccio fattoriale iterativo

Puoi calcolarne 5! iterativamente con un'istruzione for, come in:

lecca qui per visualizzare l'immagine del codice

In [1]: fattoriale = 1

In [2]: in numero a gamma ( 5 , 0 , 1 ):


...: fattoriale * = numero
...:

In [3]: fattoriale
Uscita [3]: 120

Risoluzione ricorsiva dei problemi


C
Pagina 161
Gli approcci ricorsivi alla risoluzione dei problemi hanno diversi elementi in comune. Quando tu
chiama una funzione ricorsiva per risolvere un problema, in realtà è in grado di risolvere solo il file
casi più semplici , o casi base . Se chiami la funzione con un caso base , esso
restituisce immediatamente un risultato. Se chiami la funzione con un problema più complesso, esso
in genere divide il problema in due parti, una che la funzione sa come eseguire
e uno che non sa fare. Per rendere fattibile la ricorsione, quest'ultimo pezzo
deve essere una versione leggermente più semplice o più piccola del problema originale. Perché questo nuovo
problema assomiglia al problema originale, la funzione chiama una nuova copia di se stessa per funzionare
sul problema più piccolo, questo è indicato come una chiamata ricorsiva ed è anche chiamato
passo di ricorsione . Questo concetto di separare il problema in due porzioni più piccole è a
forma del divideandconquer approccio introdotto in precedenza nel libro.

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.

Approccio fattoriale ricorsivo

Puoi arrivare a una rappresentazione fattoriale ricorsiva osservando che n ! può essere scritto
come:
n ! = n · ( n - 1)!

Ad esempio, 5! è uguale a 5 · 4 !, come in:

5! = 5 · 4 · 3 · 2 · 1
5! = 5 · (4 · 3 · 2 · 1)
5! = 5 · (4!)

Visualizzazione della ricorsione

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.

Implementazione di una funzione fattoriale ricorsiva


La sessione seguente utilizza la ricorsione per calcolare e visualizzare i fattoriali di
numeri interi da 0 a 10:

lecca qui per visualizzare l'immagine del codice

In [4]: def fattoriale (numero):


...: "" "Restituisce il fattoriale del numero." ""
...: se numero <= 1 :
...: ritorno 1
...: numero di ritorno * fattoriale (numero 1 ) # chiamata ricorsiva
...:

In [5]: per i in serie ( 11 ):


...: print (f ' {i} ! = {fattoriale (i)} ' )
...:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
C
Pagina 163

La funzione fattoriale ricorsiva di Snippet [4] determina innanzitutto se il file terminating


il numero di condizione <= 1 è vero. Se questa condizione è vera (il caso base), fattoriale
restituisce 1 e non è necessaria un'ulteriore ricorsione. Se il numero è maggiore di 1, il secondo

L'istruzione return esprime il problema come prodotto di numero e ricorsivo


chiamata a fattoriale che valuta fattoriale (numero 1). Questo è un po '

problema più piccolo del calcolo originale, fattoriale (numero). Nota che
la funzione fattoriale deve ricevere un argomento non negativo . Non lo testiamo
Astuccio.

Il ciclo nello snippet [5] chiama la funzione fattoriale per i valori da 0 a

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.

Overflow dello stack e ricorsione infinita

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).

4.17 PROGRAMMAZIONE IN STILE FUNZIONALE


Come altri linguaggi popolari, come Java e C #, Python non è puramente funzionale
linguaggio. Piuttosto, offre funzionalità di "stile funzionale" che ti aiutano a scrivere codice che è
meno probabilità di contenere errori, più conciso e facile da leggere, eseguire il debug e modificare.
Anche i programmi in stile funzionale possono essere più facili da parallelizzare per ottenere prestazioni migliori

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.

Argomenti di programmazione in stile funzionale

evitare effetti collaterali (4)


funzioni del generatore
valutazione pigra (5)
chiusure
ordine superiore
programmazione dichiarativa funzioni (5) liste di comprensione (5)

(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.

Cosa contro come

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.

Considera l'istruzione for in molti altri linguaggi di programmazione. In genere, tu


deve specificare tutti i dettagli dell'iterazione controcontrollata: una variabile di controllo, la sua iniziale
value, come incrementarlo e una condizione di continuazione del ciclo che utilizza il controllo
variabile per determinare se continuare l'iterazione. Questo stile di iterazione è noto come
iterazione esterna ed è soggetto a errori. Ad esempio, potresti fornire un errore
condizione di inizializzazione, incremento o continuazione del ciclo. L'iterazione esterna muta (that
è, modifica) la variabile di controllo e la suite dell'istruzione for spesso ne modifica altri
anche variabili. Ogni volta che modifichi le variabili potresti introdurre errori.
La programmazione in stile funzionale enfatizza l' immutabilità . Cioè, evita le operazioni
che modificano i valori delle variabili. Diremo di più nel prossimo capitolo.

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è

somma (voti). La funzione sum sa come scorrere l'elenco e aggiungerli


elemento al totale parziale. Indicare cosa vuoi fare invece di programmare
come farlo è noto come programmazione dichiarativa .

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.

lecca qui per visualizzare l'immagine del codice

d
C
Pagina 166
In [1]: valori = [ 1 , 2 , 3 ]

In [2]: somma (valori)


Fuori [2]: 6

In [3]: sum (values) # la stessa chiamata restituisce sempre lo stesso risultato


Fuori [3]: 6

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.

4.18 INTRO A DATA SCIENCE: MISURE DI


DISPERSIONE
Nella nostra discussione sulle statistiche descrittive, abbiamo considerato le misure di centrale
tendenza: media, mediana e moda. Questi ci aiutano a classificare i valori tipici in un gruppo
—Come l'altezza media dei tuoi compagni di classe o l'auto acquistata più di frequente
marca (la modalità) in un determinato paese.

Quando parliamo di un gruppo, l'intero gruppo è chiamato popolazione .


A volte una popolazione è piuttosto numerosa, come le persone che probabilmente voteranno nei prossimi Stati Uniti
elezioni presidenziali, che è un numero superiore a 100.000.000 di persone. Per pratico
ragioni, le organizzazioni elettorali che cercano di prevedere chi diventerà il prossimo presidente
lavorare con piccoli sottoinsiemi accuratamente selezionati della popolazione noti come campioni . Molti
dei sondaggi nelle elezioni del 2016 avevano un campione di circa 1000 persone.

In questa sezione, continueremo a discutere le statistiche descrittive di base. Introduciamo


misure di dispersione (chiamate anche misure di variabilità ) che ti aiutano
capire quanto sono diffusi i valori. Ad esempio, in una classe di studenti, lì
può essere un gruppo di studenti la cui altezza è vicina alla media, con numeri più piccoli
di studenti che sono considerevolmente più bassi o più alti.

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

Varianza Pagina 167

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

Quindi, quadriamo ciascuno di questi risultati (producendo solo positivi):

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:

lecca qui per visualizzare l'immagine del codice

In [1]: statistiche sulle importazioni

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:

lecca qui per visualizzare l'immagine del codice

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:

lecca qui per visualizzare l'immagine del codice

In [4]: importa matematica

In [5]: math.sqrt (statistics.pvariance ([ 1 , 3 , 4 , 2 , 6 , 5 , 3 , 4 , 5 , 2 ]))


Fuori [5]: 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

5. Sequenze: elenchi e tuple


tory

Obiettivi
foto

In questo capitolo potrai:


arning Pat

Crea e inizializza elenchi e tuple.


fers & Dea

Fare riferimento a elementi di elenchi, tuple e stringhe.


hlights

Ordina e cerca elenchi e cerca tuple.


ttings

Passa elenchi e tuple a funzioni e metodi.


Supporto
Utilizza i metodi di elenco per eseguire manipolazioni comuni, come la ricerca di elementi,
Disconnessione
ordinare un elenco, inserire e rimuovere elementi.

Usa funzionalità di programmazione in stile funzionale Python aggiuntive, inclusi lambda


e le operazioni di programmazione in stile funzionale filtrano, mappano e riducono.

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.

Usa elenchi bidimensionali.

Migliora le tue capacità di analisi e presentazione con Seaborn e Matplotlib


librerie di visualizzazione.

Contorno

.1 Introduzione

.2 Elenchi

.3 Tuple
5
Pagina 171
.4 Sequenze di disimballaggio

.5 Sequence Slicing

.6 del Statement

.7 Passaggio di elenchi alle funzioni

.8 Ordinamento degli elenchi

.9 Ricerca di sequenze

.10 Altri metodi di elenco

.11 Simulazione di pile con elenchi

.12 Comprensioni degli elenchi

.13 Espressioni del generatore

.14 Filtra, mappa e riduci

.15 Altre funzioni di elaborazione delle sequenze

.16 Elenchi bidimensionali

.17 Introduzione alla scienza dei dati: simulazione e visualizzazioni statiche

.17.1 Esempi di grafici per 600, 60.000 e 6.000.000 di dadi

.17.2 Visualizzazione delle frequenze e delle percentuali di DieRoll

.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.

Nel capitolo precedente, abbiamo dimostrato la generazione di numeri casuali e simulato


tirando un dado a sei facce. Concludiamo questo capitolo con la nostra prossima introduzione alla scienza dei dati
sezione, che utilizza le librerie di visualizzazione Seaborn e Matplotlib per interagire
sviluppare grafici a barre statici contenenti le frequenze dello stampo. Nell'introduzione di
Nella sezione Data Science, presenteremo una visualizzazione animata in cui il grafico a barre
cambia dinamicamente all'aumentare del numero di tiri di dado: vedrai la legge del grande
numeri "in azione".

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:

lecca qui per visualizzare l'immagine del codice

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):

lecca qui per visualizzare l'immagine del codice

[ "Mary" , "Smith" , 3.57 , 2022 ]

UN
C accesso agli elementi di un elenco

Accesso agli elementi di un elenco Pagina 173

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

Determinazione della lunghezza di una lista

Per ottenere la lunghezza di una lista, usa la funzione len incorporata :


In [5]: len (c)
Fuori [5]: 5

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

Gli indici devono essere numeri interi o espressioni intere

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

L'utilizzo di un valore di indice non intero causa un'eccezione TypeError.

Le liste sono mutevoli

Gli elenchi sono modificabili: i loro elementi possono essere modificati:

lecca qui per visualizzare l'immagine del codice

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.

Alcune sequenze sono immutabili

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:

lecca qui per visualizzare l'immagine del codice

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"

TypeError : l'oggetto 'str' non supporta l'assegnazione di elementi

tentativo di accedere a un elemento inesistente

L'uso di un elenco fuori intervallo, una tupla o un indice di stringa provoca un errore IndexError:

lecca qui per visualizzare l'immagine del codice

In [16]: c [ 100 ]

IndexError Traceback (la chiamata più recente last


ipythoninput169a31ea1e1a13> in <module> ()
> 1 c [ 100 ]

IndexError : elenca l'indice fuori intervallo

Utilizzo degli elementi dell'elenco nelle espressioni

Gli elementi della lista possono essere usati come variabili nelle espressioni:

In [17]: c [ 0 ] + c [ 1 ] + c [ 2 ]
Fuori [17]: 39

Aggiunta a un elenco con + =

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:

lecca qui per visualizzare l'immagine del codice

In [18]: a_list = []

In [19]: per numero di serie ( 1 , 6 ):


...: a_list + = [numero]
...:

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:

lecca qui per visualizzare l'immagine del codice

In [21]: lettere = []

In [22]: lettere + = "Python"


In [23]: lettere
Fuori [23]: ['P', 'y', 't', 'h', 'o', 'n']

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.

Concatenazione di elenchi con +

È 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:

lecca qui per visualizzare l'immagine del codice

In [24]: list1 = [ 10 , 20 , 30 ]

In [25]: list2 = [ 40 , 50 ]

In [26]: concatenated_list = list1 + list2

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.

Utilizzo di for e range per accedere a indici e valori dell'elenco

È inoltre possibile accedere agli elementi dell'elenco tramite i loro indici e l'operatore di abbonamento ([]):

lecca qui per visualizzare l'immagine del codice

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

La funzione chiamata range (len (concatenated_list)) produce una sequenza di


numeri interi che rappresentano gli indici di concatenated_list (in questo caso, da 0 a 4). quando
in questo modo, è necessario assicurarsi che gli indici rimangano nell'intervallo. Presto lo mostreremo
un modo più sicuro per accedere agli indici e ai valori degli elementi utilizzando la funzione incorporata enumerate.

Operatori di confronto

Puoi confrontare interi elenchi elemento per elemento utilizzando gli operatori di confronto:

lecca qui per visualizzare l'immagine del codice

In [29]: a = [1, 2, 3]

In [30]: b = [1, 2, 3]

In [31]: c = [1, 2, 3, 4]

In [32]: a == b # True: gli elementi corrispondenti in entrambi sono uguali


Out [32]: Vero
In [33]: a == c # False: a e c hanno elementi e lunghezze differenti
Out [33]: Falso

In [34]: a <c # True: a ha meno elementi di c


Out [34]: Vero

In [35]: c> = b # Vero: gli elementi 02 sono uguali ma c ha più elementi


Out [35]: Vero

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]: ()

In [3]: len (student_tuple)


Uscita [3]: 0

Ricorda che puoi comprimere una tupla separando i suoi valori con virgole:

lecca qui per visualizzare l'immagine del codice

In [4]: ​student_tuple = 'John' , 'Green' , 3.3

In [5]: student_tuple
Uscita [5]: ('John', 'Green', 3.3)

In [6]: len (student_tuple)


Fuori [6]: 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:

lecca qui per visualizzare l'immagine del codice

In [7]: another_student_tuple = ( 'Mary' , 'Red' , 3.3 )

In [8]: another_student_tuple
Uscita [8]: ('Mary', 'Red', 3.3)

Il codice seguente crea una tupla di un elemento:

lecca qui per visualizzare l'immagine del codice

In [9]: a_singleton_tuple = ( 'red' ,) # nota la virgola

In [10]: a_singleton_tuple
Fuori [10]: ('rosso',)

La virgola (,) che segue la stringa "red" identifica a_singleton_tuple come a


tupla: le parentesi sono facoltative. Se la virgola fosse omessa, le parentesi lo sarebbero

C
T
Pagina 179
essere ridondante e a_singleton_tuple farebbe semplicemente riferimento alla stringa 'red'
piuttosto che una tupla.

Accesso agli elementi della 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:

lecca qui per visualizzare l'immagine del codice

In [11]: time_tuple = ( 9 , 16 , 1 )

In [12]: time_tuple
Uscita [12]: (9, 16, 1)

In [13]: time_tuple [ 0 ] * 3600 + time_tuple [ 1 ] * 60 + time_tuple [ 2 ]


Uscita [13]: 33361

L'assegnazione di un valore a un elemento tupla causa un'eccezione TypeError.

Aggiunta di elementi a una stringa o tupla

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 [15]: tuple2 = tuple1

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:

lecca qui per visualizzare l'immagine del codice

In [17]: tuple1 + = (40 , 50 )

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.

Aggiunta di tuple agli elenchi


Puoi usare + = per aggiungere una tupla a un elenco:

lecca qui per visualizzare l'immagine del codice

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]

Le tuple possono contenere oggetti mobili

Creiamo una student_tuple con un nome, un cognome e un elenco di voti:

lecca qui per visualizzare l'immagine del codice

In [23]: student_tuple = ( 'Amanda' , 'Blue' , [ 98 , 75 , 87 ])

Anche se la tupla è immutabile, il suo elemento di lista è mutabile:

lecca qui per visualizzare l'immagine del codice

In [24]: student_tuple [ 2 ] [ 1 ] = 85

In [25]: student_tuple
Uscita [25]: ('Amanda', 'Blue', [98, 85, 87])

Nel nome doubleubscripted student_tuple [2] [1], Python views

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.

5.4 SEQUENZE DI DISIMBALLAGGIO


Il capitolo precedente ha introdotto lo spacchettamento delle tuple. Puoi decomprimere qualsiasi sequenza
elementi assegnando la sequenza a un elenco di variabili separato da virgole. UN
ValueError si verifica se il numero di variabili a sinistra del simbolo di assegnazione è
non identico al numero di elementi nella sequenza a destra:

lecca qui per visualizzare l'immagine del codice

In [1]: student_tuple = ( 'Amanda' , [ 98 , 85 , 87 ])

In [2]: first_name, grades = student_tuple

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:

lecca qui per visualizzare l'immagine del codice

In [5]: primo, secondo = "ciao"


In [6]: print (f ' {first} {second} ' )
Ciao

In [7]: numero1, numero2, numero3 = [2 , 3 , 5 ]

In [8]: print (f ' {number1} {number2} {number3} ' )


235

In [9]: numero1, numero2, numero3 = intervallo (10 , 40 , 10 )

In [10]: print (f ' {number1} {number2} {number3} ' )


10 20 30

Scambio di valori tramite imballaggio e disimballaggio

È possibile scambiare i valori di due variabili utilizzando la sequenza di compressione e decompressione:

lecca qui per visualizzare l'immagine del codice

C
Pagina 182
In [11]: numero1 = 99

In [12]: numero2 = 22

In [13]: numero1, numero2 = (numero2, numero1)

In [14]: print (f 'numero1 = {} number1 ; numero2 = {} numero2 ' )


numero1 = 22; numero2 = 99

Accesso sicuro a indici e valori con enumerazione di funzioni incorporate

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.

Il meccanismo preferito per accedere all'indice e al valore di un elemento è il builtin


funzione enumerate . Questa funzione riceve un iterabile e crea un iteratore che, per
ogni elemento, restituisce una tupla contenente l'indice e il valore dell'elemento. Il seguente
il codice usa l' elenco delle funzioni incorporate per creare un elenco contenente i risultati di enumerate:

lecca qui per visualizzare l'immagine del codice

In [15]: colors = [ "red" , "orange" , "yellow" ]

In [16]: list (enumerate (colors))


Out [16]: [(0, 'red'), (1, 'orange'), (2, 'yellow')]

Allo stesso modo la funzione incorporata tupla crea una tupla da una sequenza:

lecca qui per visualizzare l'immagine del codice

In [17]: tuple (enumerate (colors))


Out [17]: ((0, 'red'), (1, 'orange'), (2, 'yellow'))

Il seguente ciclo for decomprime ogni tupla restituita da enumerate nelle variabili

indice e valore e li visualizza:

lecca qui per visualizzare l'immagine del codice


In [18]: for index, value in enumerate (colors):

...: print (f ' {index} : {value} ' ) Pagina 183


...:
0: rosso
1: arancione
2: giallo

Creazione di un grafico a barre primitivo

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

oppure, se sei già in IPython, usa il comando:

esegui fig05_01.py

lecca qui per visualizzare l'immagine del codice

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} ' )

lecca qui per visualizzare l'immagine del codice

Creazione di un grafico a barre da numeri:


Barra dei valori dell'indice
0 19 *******************
1 3 ***
2 15 ***************
3 7 *******
4 11 ***********

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.

Specifica di una sezione con indici iniziale e finale


Creiamo una sezione composta dagli elementi agli indici da 2 a 5 di un elenco:

lecca qui per visualizzare l'immagine del codice

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.

Specifica di una sezione con solo un indice finale

Se ometti l'indice iniziale, viene assunto 0. Quindi, i numeri di slice [: 6] sono equivalenti a
i numeri di slice [0: 6]:

lecca qui per visualizzare l'immagine del codice

In [3]: numeri [: 6 ]
Uscita [3]: [2, 3, 5, 7, 11, 13]

In [4]: ​numeri [ 0 : 6 ]

Uscita [4]: ​[2, 3, 5, 7, 11, 13] Pagina 185

Specifica di una sezione con solo un indice iniziale

Se ometti l'indice finale, Python assume la lunghezza della sequenza (8 qui), quindi snippet

La sezione di [5] contiene gli elementi dei numeri agli indici 6 e 7:

lecca qui per visualizzare l'immagine del codice

In [5]: numeri [ 6 :]
Uscita [5]: [17, 19]

In [6]: numbers [ 6 : len (numbers)]


Uscita [6]: [17, 19]

Specificare una sezione senza indici

L'omissione di entrambi gli indici di inizio e di fine copia l'intera sequenza:

lecca qui per visualizzare l'immagine del codice

In [7]: numeri [:]


Fuori [7]: [2, 3, 5, 7, 11, 13, 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.

Affettare con passaggi

Il codice seguente usa un passaggio di 2 per creare una sezione con ogni altro elemento di

numeri:

In [8]: numeri [:: 2 ]


Uscita [8]: [2, 5, 11, 17]

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

Affettare con indici e passaggi negativi Pagina 186

È 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:

lecca qui per visualizzare l'immagine del codice

In [9]: numeri [:: 1 ]


Fuori [9]: [19, 17, 13, 11, 7, 5, 3, 2]

Questo è equivalente a:

lecca qui per visualizzare l'immagine del codice

In [10]: numeri [ 1 : 9 : 1 ]
Fuori [10]: [19, 17, 13, 11, 7, 5, 3, 2]

Modifica degli elenchi tramite le sezioni


È possibile modificare un elenco assegnandogli una porzione: il resto dell'elenco rimane invariato. Il
il codice seguente sostituisce i primi tre elementi dei numeri, lasciando il resto invariato:

lecca qui per visualizzare l'immagine del codice

In [11]: numeri [ 0 : 3 ] = [ "due" , "tre" , "cinque" ]

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:

lecca qui per visualizzare l'immagine del codice

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 [16]: numeri [:: 2 ] = [ 100 , 100 , 100 , 100 ]

In [17]: numeri
Fuori [17]: [100, 3, 100, 7, 100, 13, 100, 19]

In [18]: id (numeri)
Uscita [18]: 4434456648

Eliminiamo tutti gli elementi in numeri, lasciando vuoto l'elenco esistente :

lecca qui per visualizzare l'immagine del codice

In [19]: numeri [:] = []

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.

5.6 DICHIARAZIONE DEL CANC


L' istruzione del può anche essere utilizzata per rimuovere elementi da un elenco e per eliminarli
variabili dalla sessione interattiva. Puoi rimuovere l'elemento in qualsiasi indice valido o
l'elemento (i) da qualsiasi slice valido.

Eliminazione dell'elemento in un indice di elenco specifico


C
Eliminazione dell'elemento in un indice di elenco specifico
Pagina 188
et crea una lista, quindi usa del per rimuovere il suo ultimo elemento:

lecca qui per visualizzare l'immagine del codice

In [1]: numbers = list (range ( 0 , 10 ))

In [2]: numeri
Uscita [2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [3]: del numbers [ 1 ]

In [4]: ​numeri
Uscita [4]: ​[0, 1, 2, 3, 4, 5, 6, 7, 8]

Eliminazione di una sezione da un elenco

Quanto segue elimina i primi due elementi dell'elenco:

In [5]: del numeri [ 0 : 2 ]

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 [7]: del numbers [:: 2 ]

In [8]: numeri
Uscita [8]: [3, 5, 7]

Eliminazione di una sezione che rappresenta l'intero elenco

Il codice seguente elimina tutti gli elementi dell'elenco:

In [9]: del numbers [:]

In [10]: numeri
Fuori [10]: []

Eliminazione di una variabile dalla sessione corrente

L'istruzione del può eliminare qualsiasi variabile. Eliminiamo i numeri dall'interattivo


session, quindi tenta di visualizzare il valore della variabile, causando un'eccezione NameError:

C
L
Pagina 189
lecca qui per visualizzare l'immagine del codice

In [11]: del numbers

In [12]: numeri

NameError Traceback (la chiamata più recente per ultima


ipythoninput12426f8401232b> in <module> ()
> 1 numeri

NameError : il nome "numeri" non è definito

5.7 PASSAGGIO DELLE LISTE ALLE FUNZIONI


Nell'ultimo capitolo abbiamo accennato al fatto che tutti gli oggetti vengono passati per riferimento e
ha dimostrato di passare un oggetto immutabile come argomento di una funzione. Qui discutiamo
ulteriori riferimenti esaminando cosa accade quando un programma passa un elenco modificabile
oggetto a una funzione.

Passaggio di un intero elenco a una funzione


Considera la funzione modify_elements, che riceve un riferimento a un elenco e
moltiplica ciascuno dei valori degli elementi della lista per 2:

lecca qui per visualizzare l'immagine del codice


In [1]: def modify_elements (elementi):
...: "" "" Moltiplica tutti i valori degli elementi negli elementi per 2. "" "
...: for i in range (len (items)):
...: elementi [i] * = 2
...:

In [2]: numeri = [ 10 , 3 , 7 , 1 , 9 ]

In [3]: modify_elements (numeri)

In [4]: ​numeri
Uscita [4]: ​[20, 6, 14, 2, 18]

Il parametro degli elementi della funzione modify_elements riceve un riferimento all'originale


list, quindi l'istruzione nella suite del ciclo modifica ogni elemento nell'oggetto list originale.

Passaggio di una tupla a una funzione

C
<

Pagina 190
Quando si passa una tupla a una funzione, tentando di modificare l'immutabile della tupla
elementi risulta in un TypeError:

lecca qui per visualizzare l'immagine del codice

In [5]: numbers_tuple = ( 10 , 20 , 30 )

In [6]: numbers_tuple
Uscita [6]: (10, 20, 30)

In [7]: modify_elements (numbers_tuple)

TypeError Traceback (la chiamata più recente per ultima


ipythoninput79339741cd595> in <module> ()
> 1 modify_elements (numbers_tuple)

<ipythoninput127acb8f8f44c> in modify_elements (elementi)


2 "" "" Moltiplica tutti i valori degli elementi negli elementi per 2. "" "
3 per i in range (len (articoli)):
> 4 elementi [i] * = 2
5
6

TypeError : l'oggetto 'tuple' non supporta l'assegnazione di elementi

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.

Una nota per quanto riguarda i trackback

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

> ha causato l'eccezione.

5.8 ELENCHI DI SMISTAMENTO


L'ordinamento consente di disporre i dati in ordine crescente o decrescente.

S
C ortare un elenco in ordine crescente
<

Ordinamento di un elenco in ordine crescente Pagina 191

Il metodo di ordinamento elenco modifica un elenco per disporre i suoi elementi in ordine crescente:

lecca qui per visualizzare l'immagine del codice

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]

Ordinamento di un elenco in ordine decrescente

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):

lecca qui per visualizzare l'immagine del codice

In [4]: ​numbers.sort (reverse = True )

In [5]: numeri
Uscita [5]: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Funzione incorporata ordinata

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:

lecca qui per visualizzare l'immagine del codice

In [6]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]

In [7]: ascending_numbers = ordinato (numeri)

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]

In [10]: letters = "fadgchjebi"

In [11]: lettere_ascendenti = ordinate (lettere)

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 [14]: colors = ( "red" , "orange" , "yellow" , "green" , "blue" )

In [15]: ascending_colors = ordinato (colori)

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.

5.9 RICERCA DELLE SEQUENZE


Spesso, ti consigliamo di determinare se una sequenza (come un elenco, una tupla o una stringa)
contiene un valore che corrisponde a un particolare valore chiave . La ricerca è il processo di
individuare una chiave.

Indice del metodo elenco

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:

lecca qui per visualizzare l'immagine del codice

In [1]: numeri = [ 3 , 7 , 1 , 4 , 2 , 8 , 5 , 6 ]

In [2]: numbers.index ( 5 )
Fuori [2]: 6

Si verifica un'eccezione ValueError se il valore che stai cercando non è nell'elenco.

Specificare l'indice iniziale di una ricerca

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:

lecca qui per visualizzare l'immagine del codice

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]

Il codice seguente ricerca nell'elenco aggiornato il valore 5 a partire dall'indice 7 e


continuando fino alla fine dell'elenco:

In [5]: numbers.index ( 5 , 7 )
Uscita [5]: 14

Specificare gli indici di inizio e fine di una ricerca


Se si specificano gli indici iniziale e finale, l'indice esegue la ricerca dall'inizio
indice fino alla posizione dell'indice finale, ma esclusa. La chiamata all'indicizzazione in snippet

[5]:

numbers.index ( 5 , 7 )
assume la lunghezza dei numeri come terzo argomento opzionale ed è equivalente a:

lecca qui per visualizzare l'immagine del codice

numbers.index ( 5 , 7 , len (numeri))

Quanto segue cerca il valore 7 nell'intervallo di elementi con indici da 0 a 3:

lecca qui per visualizzare l'immagine del codice

In [6]: numbers.index ( 7 , 0 , 4 )
Fuori [6]: 1

Operatori in e non in

L'operatore verifica se l'iterabile dell'operando destro contiene il valore dell'operando sinistro:

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:

In [9]: 1000 non in numeri


Out [9]: Vero

In [10]: 5 non in numeri


Out [10]: Falso

Utilizzo dell'operatore in per impedire un ValueError

È 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:

lecca qui per visualizzare l'immagine del codice

In [11]: chiave = 1000

In [12]: se chiave in numeri:


...: print (f 'trovato {key} all'indice {numbers.index (search_key)} ' )
...: altro :
...: print (f ' {key} non trovato' )
...:
1000 non trovato

Funzioni integrate qualsiasi e tutte

A volte devi semplicemente sapere se un elemento in un iterabile è True o

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:

lecca qui per visualizzare l'immagine del codice

In [1]: color_names = [ 'orange' , 'yellow' , 'green' ]

Inserimento di un elemento in un indice di elenco specifico


Il metodo insert aggiunge un nuovo elemento a un indice specificato. Il seguente inserisce "rosso" in
indice 0:

lecca qui per visualizzare l'immagine del codice

In [2]: color_names.insert ( 0 , "red" )

In [3]: color_names
Uscita [3]: ["rosso", "arancione", "giallo", "verde"]

Aggiunta di un elemento alla fine di un elenco

Puoi aggiungere un nuovo elemento alla fine di un elenco con il metodo append :

lecca qui per visualizzare l'immagine del codice

In [4]: ​color_names.append ( "blue" )

In [5]: color_names
In uscita [5]: ["rosso", "arancione", "giallo", "verde", "blu"]

Aggiunta di tutti gli elementi di una sequenza alla fine di un elenco

Usa il metodo list extended per aggiungere tutti gli elementi di un'altra sequenza alla fine di un elenco:

lecca qui per visualizzare l'immagine del codice

In [6]: color_names.extend ([ 'indigo' , 'violet' ])

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:

lecca qui per visualizzare l'immagine del codice

In [8]: sample_list = []

In [9]: s = "abc"

In [10]: sample_list.extend (s)


In [11]: sample_list
Uscita [11]: ['a', 'b', 'c']

In [12]: t = ( 1 , 2 , 3 )

In [13]: sample_list.extend (t)

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:

lecca qui per visualizzare l'immagine del codice

In [15]: sample_list.extend (( 4 , 5 , 6 )) # nota le parentesi extra

In [16]: sample_list
Fuori [16]: ['a', 'b', 'c', 1, 2, 3, 4, 5, 6]

Se si omettono le parentesi richieste si verifica un TypeError.

Rimozione della prima occorrenza di un elemento in un elenco


Il metodo remove elimina il primo elemento con un valore specificato: si verifica un'eccezione ValueError

se l'argomento di remove non è nell'elenco:

lecca qui per visualizzare l'immagine del codice

In [17]: color_names.remove ( 'green' )

In [18]: color_names
Fuori [18]: ["rosso", "arancione", "giallo", "blu", "indaco", "viola"]

C
Pagina 197

Svuotamento di un elenco

Per eliminare tutti gli elementi in un elenco, chiama il metodo clear :

In [19]: color_names.clear ()

In [20]: color_names
Fuori [20]: []

Questo è l'equivalente dell'assegnazione slice mostrata in precedenza

color_names [:] = []

Conteggio del numero di occorrenze di un elemento

Il conteggio del metodo List cerca il suo argomento e restituisce il numero di volte che lo è
trovato:

lecca qui per visualizzare l'immagine del codice

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

Inversione degli elementi di una lista

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:

lecca qui per visualizzare l'immagine del codice

In [23]: color_names = [ 'red' , 'orange' , 'yellow' , 'green' , 'blue' ]

In [24]: color_names.reverse () Pagina 198

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:

lecca qui per visualizzare l'immagine del codice

In [26]: copied_list = color_names.copy ()

In [27]: copied_list
Uscita [27]: ["blu", "verde", "giallo", "arancione", "rosso"]

Questo è equivalente all'operazione slice precedentemente dimostrata:

copied_list = color_names [:]

5.11 SIMULAZIONE DI PILE CON LISTE


Il capitolo precedente ha introdotto lo stack functioncall. Python non ha un file build
nel tipo di pila, ma puoi pensare a una pila come a un elenco vincolato. Si preme con lista
metodo append, che aggiunge un nuovo elemento alla fine della lista. Si apre utilizzando la lista
metodo pop senza argomenti, che rimuove e restituisce l'elemento alla fine del file
elenco.

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):

lecca qui per visualizzare l'immagine del codice

n [1]: stack = []

In [2]: stack.append ( 'red' )

In [3]: stack
Fuori [3]: ["rosso"]

In [4]: ​stack.append ( 'green' )


In [5]: stack
Uscita [5]: ["rosso", "verde"]

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 ()

IndexError Traceback (la chiamata più recente per ultima)


<ipythoninput1050ea7ec13fbe> in <module> ()
> 1 stack.pop ()

IndexError : pop da un elenco vuoto

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) .

5.12 COMPRENSIONI DELLA LISTA


Qui, si continua a discutere functionalstyle caratteristiche con list comprehension -a
notazione concisa e conveniente per creare nuovi elenchi. Le comprensioni di elenco possono sostituire
molte per le istruzioni che iterano su sequenze esistenti e creano nuovi elenchi, come:

lecca qui per visualizzare l'immagine del codice

In [1]: list1 = []

In [2]: per elemento in serie ( 1 , 6 ):


...: list1.append (elemento)
...:

In [3]: list1

F
C

Fuori [3]: [1, 2, 3, 4, 5] Pagina 200

Utilizzo della comprensione di un elenco per creare un elenco di numeri interi

Possiamo eseguire la stessa operazione in una singola riga di codice con una comprensione dell'elenco:

lecca qui per visualizzare l'immagine del codice

In [4]: list2 = [elemento per elemento in serie ( 1 , 6 )]


In [5]: list2
Uscita [5]: [1, 2, 3, 4, 5]

Come l'istruzione for dello snippet [2], la clausola for della lista di comprensione

per elemento in serie ( 1 , 6 )

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:

list2 = list (range ( 1 , 6 ))

Mappatura: esecuzione di operazioni in un'espressione di comprensione della lista

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:

lecca qui per visualizzare l'immagine del codice

In [6]: list3 = [item ** 3 for item in range ( 1 , 6 )]

In [7]: list3
Uscita [7]: [1, 8, 27, 64, 125]

Filtraggio: elenca le comprensioni con clausole if

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:

lecca qui per visualizzare l'immagine del codice

In [8]: elenco4 = [elemento per elemento in serie ( 1 , 11 ) se l'elemento% 2 == 0 ]

In [9]: list4
Fuori [9]: [2, 4, 6, 8, 10]

Comprensione delle liste che elabora gli elementi di un'altra lista


La clausola for può elaborare qualsiasi iterabile. Creiamo un elenco di stringhe minuscole e usiamo un file

comprensione dell'elenco per creare un nuovo elenco contenente le loro versioni maiuscole:

lecca qui per visualizzare l'immagine del codice

In [10]: colors = [ "red" , "orange" , "yellow" , "green" , "blue" ]

In [11]: colors2 = [item.upper () for item in colors]

In [12]: colors2
In uscita [12]: ["ROSSO", "ARANCIONE", "GIALLO", "VERDE", "BLU"]

In [13]: colori
Uscita [13]: ["rosso", "arancione", "giallo", "verde", "blu"]

5.13 ESPRESSIONI DEL GENERATORE


Un generatore di espressione è simile a un elenco di comprensione, ma crea un iterabile
oggetto generatore che produce valori su richiesta . Questo è noto come pigro
valutazione . Le comprensioni di elenchi utilizzano valutazioni avide: creano elenchi
immediatamente quando li esegui. Per un gran numero di elementi, la creazione di un elenco può
richiede tempo e memoria sostanziali. Quindi le espressioni del generatore possono ridurre i file
consumo di memoria e migliorare le prestazioni se l'intero elenco non è necessario in una volta.

Le espressioni del generatore hanno le stesse funzionalità delle comprensioni di elenco, ma tu


definirli tra parentesi invece che tra parentesi quadre. L'espressione del generatore in
snippet [2] quadrati e restituisce solo i valori dispari in numeri:

C
Pagina 202
lecca qui per visualizzare l'immagine del codice

In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]

In [2]: per il valore in (x ** 2 per x in numeri se x% 2 ! = 0 ):


...: print (value, end = '' )
...:
9 49 1 81 25

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:

lecca qui per visualizzare l'immagine del codice

In [3]: squares_of_odds = (x ** 2 for x in numbers if x% 2 ! = 0 )

In [3]: squares_of_odds
Uscita [3]: <oggetto generatore <genexpr> a 0x1085e84c0>

Il testo "oggetto generatore <genexpr>" indica che square_of_odds è un file


oggetto generatore creato da un'espressione generatore (genexpr).

5.14 FILTRO, MAPPA E RIDUCI


La sezione precedente ha introdotto diverse caratteristiche dello stile funzionale: elenco
comprensioni, filtraggio e mappatura. Qui mostriamo il filtro integrato e

funzioni map per il filtraggio e la mappatura, rispettivamente. Continuiamo a discutere


riduzioni in cui si elabora una raccolta di elementi in un singolo valore, ad esempio
il loro conteggio, totale, prodotto, medio, minimo o massimo.

Filtrare i valori di una sequenza con la funzione di filtro incorporata

Usiamo il filtro della funzione incorporata per ottenere i valori dispari in numeri:

lecca qui per visualizzare l'immagine del codice

In [1]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]

In [2]: def is_odd (x):


...: "" "Restituisce True solo se x è dispari." ""
...: restituisce x% 2 ! = 0
...:

In [3]: list (filter (is_odd, numbers)) Pagina 203


Uscita [3]: [3, 7, 1, 9, 5]

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:

lecca qui per visualizzare l'immagine del codice

In [4]: ​[item for item in numbers if is_odd (item)]


Uscita [4]: ​[3, 7, 1, 9, 5]

Utilizzo di un lambda invece di una funzione

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:

lecca qui per visualizzare l'immagine del codice

In [5]: list (filter ( lambda x: x% 2 ! = 0 , numbers))


Uscita [5]: [3, 7, 1, 9, 5]

Passiamo il valore di ritorno del filtro (un iteratore) all'elenco delle funzioni qui per convertire il file

risultati in un elenco e visualizzarli.

Un'espressione lambda è una funzione anonima , ovvero una funzione senza nome . Nel
la chiamata del filtro

lecca qui per visualizzare l'immagine del codice

C
Pagina 204
filtro ( lambda x: x% 2 ! = 0 , numeri)

il primo argomento è lambda

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

lecca qui per visualizzare l'immagine del codice

def nome_funzione ( parameter_list ):


espressione di ritorno

può essere espresso come un lambda più conciso della forma

lecca qui per visualizzare l'immagine del codice

lambda parameter_list : espressione

Mappatura dei valori di una sequenza su nuovi valori

Usiamo la funzione mappa incorporata con un lambda per quadrare ogni valore in numeri:

lecca qui per visualizzare l'immagine del codice

In [6]: numeri
Fuori [6]: [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]

In [7]: list (map ( lambda x: x ** 2 , numbers))


Uscita [7]: [100, 9, 49, 1, 81, 16, 4, 64, 25, 36]

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

In [8]: [item ** 2 for item in numbers]


Uscita [8]: [100, 9, 49, 1, 81, 16, 4, 64, 25, 36]

Combinazione di filtro e mappa

È possibile combinare il filtro precedente e le operazioni di mappatura come segue:

lecca qui per visualizzare l'immagine del codice

In [9]: list (map ( lambda x: x ** 2 ,


...: filtro ( lambda x: x% 2! = 0 , numeri)))
...:
Uscita [9]: [9, 49, 1, 81, 25]

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:

lecca qui per visualizzare l'immagine del codice


In [10]: [x ** 2 per x in numeri se x% 2 ! = 0 ]
Uscita [10]: [9, 49, 1, 81, 25]

Per ogni valore di x in numeri, l'espressione x ** 2 viene eseguita solo se il


la condizione x% 2! = 0 è vera.

Riduzione: somma degli elementi di una sequenza con somma

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

ttps: //docs.python.org/3/library/functools.html per un esempio di codice.


Quando indaghiamo su big data e Hadoop in nel capitolo 16 , mostreremo MapReduce
programmazione, che si basa sul filtro, mappare e ridurre le operazioni funzionali
programmazione di stile.

5Ch .15 ALTRE FUNZIONI DI ELABORAZIONE DELLE SEQUENZE


Pagina 206
5.15 ALTRE FUNZIONI DI ELABORAZIONE DELLE SEQUENZE
Python fornisce altre funzioni incorporate per manipolare le sequenze.

Trovare i valori minimo e massimo utilizzando una funzione chiave

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:

In [1]: "Red" < "orange"


Out [1]: vero

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:

In [2]: ord ( 'R' )


Uscita [2]: 82

In [3]: ord ( 'o' )


Uscita [3]: 111

Considera i colori dell'elenco, che contiene stringhe con lettere maiuscole e minuscole:

lecca qui per visualizzare l'immagine del codice

In [4]: ​colors = [ "Red" , "orange" , "Yellow" , "green" , "Blue" ]

Supponiamo di voler determinare le stringhe minime e massime utilizzando


ordine alfabetico , non numerico (lessicografico). Se disponiamo i colori
in ordine alfabetico

lecca qui per visualizzare l'immagine del codice


"Blu" , "verde" , "arancione" , "Rosso" , "Giallo"

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:

lecca qui per visualizzare l'immagine del codice

In [5]: min (colori, chiave = lambda s: s.lower ())


Uscita [5]: "Blu"

In [6]: max (colori, chiave = lambda s: s.lower ())


Uscita [6]: "Giallo"

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.

Iterazione all'indietro attraverso una sequenza

La funzione incorporata invertita restituisce un iteratore che consente di iterare su un file


i valori della sequenza all'indietro. La seguente comprensione dell'elenco crea un nuovo elenco
contenente i quadrati dei valori dei numeri in ordine inverso:

lecca qui per visualizzare l'immagine del codice

In [7]: numeri = [ 10 , 3 , 7 , 1 , 9 , 4 , 2 , 8 , 5 , 6 ]

In [7]: reversed_numbers = [item for item in reversed (numbers)]

In [8]: reversed_numbers
Uscita [8]: [36, 25, 64, 4, 16, 81, 1, 49, 9, 100]

Combinazione di iterabili in tuple di elementi corrispondenti

La funzione zip incorporata ti consente di iterare su più iterabili di dati contemporaneamente


tempo. La funzione riceve come argomenti un numero qualsiasi di iterabili e restituisce un file
iteratore che produce tuple contenenti gli elementi con lo stesso indice in ciascuna. Per
esempio, la chiamata a zip dello snippet [11] produce le tuple ('Bob', 3.5), ('Sue',

4.0) e ('Amanda', 3.75) costituito dagli elementi all'indice 0, 1 e 2 di ciascuno

C
Pagina 208
elenco, rispettivamente:

lecca qui per visualizzare l'immagine del codice

In [9]: names = [ "Bob" , "Sue" , "Amanda" ]

In [10]: grade_point_averages = [ 3.5 , 4.0 , 3.75 ]

In [11]: for name, gpa in zip (names, grade_point_averages):


...: print (f 'Name = {name} ; GPA = {gpa} ' )
...:
Nome = Bob; GPA = 3.5
Nome = Sue; GPA = 4.0
Nome = Amanda; GPA = 3.75

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.

5.16 ELENCHI BIDIMENSIONALI


Gli elenchi possono contenere altri elenchi come elementi. Un uso tipico di tale annidato (o
multidimensionali) serve a rappresentare tabelle di valori costituite da informazioni
disposti in righe e colonne . Per identificare un particolare elemento della tabella, ne specifichiamo due
indici: per convenzione, il primo identifica la riga dell'elemento, il secondo quella dell'elemento
colonna.

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.

Creazione di un elenco bidimensionale

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:

lecca qui per visualizzare l'immagine del codice

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:

lecca qui per visualizzare l'immagine del codice

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

Illustrare un elenco bidimensionale

Il diagramma seguente mostra l'elenco a, con le sue righe e colonne di valori del voto d'esame:

Identificazione degli elementi in un elenco bidimensionale

Il diagramma seguente mostra i nomi degli elementi della lista a:


Ogni elemento è identificato da un nome nella forma a [ i ] [ j ]: a è il nome della lista e i
e j sono gli indici che identificano in modo univoco la riga e la colonna di ogni elemento,
rispettivamente. I nomi degli elementi nella riga 0 hanno tutti 0 come primo indice. L'elemento
i nomi nella colonna 3 hanno tutti 3 come secondo indice.

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.

Una lista con m righe e n colonne è chiamata lista mbyn e ha m × n elementi.

L'istruzione for annidata seguente restituisce le righe del precedente twodimensional


elenca una riga alla volta:

lecca qui per visualizzare l'immagine del codice

In [2]: per la riga in a:


...: per articolo nella riga:
...: print (item, end = '' )
...: Stampa()
...:
77 68 86 73
96 87 89 81
70 90 86 81

Come vengono eseguiti i cicli annidati


Modifichiamo il ciclo annidato per visualizzare il nome dell'elenco e gli indici di riga e di colonna
e valore di ogni elemento:

lecca qui per visualizzare l'immagine del codice

In [3]: for i, row in enumerate (a):


...: per j, elemento in enumerate (riga):
...: print (f 'a [ {i} ] [ {j} ] = {item} ' , end = '' )
...: Stampa()
...:
a [0] [0] = 77 a [0] [1] = 68 a [0] [2] = 86 a [0] [3] = 73
a [1] [0] = 96 a [1] [1] = 87 a [1] [2] = 89 a [1] [3] = 81
a [2] [0] = 70 a [2] [1] = 90 a [2] [2] = 86 a [2] [3] = 81

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]

[1] = 68, a [0] [2] = 86 e a [0] [3] = 73.

Nella seconda iterazione del ciclo esterno, la riga 1 è

[ 96 , 87 , 89 , 81 ]

e il ciclo annidato itera attraverso i quattro elementi di questa lista a [1] [0] = 96, a [1]

[1] = 87, a [1] [2] = 89 e a [1] [3] = 81.

Nella terza iterazione del ciclo esterno, la riga 2 è

[ 70 , 90 , 86 , 81 ]

e il ciclo annidato itera attraverso i quattro elementi di questa lista a [2] [0] = 70, a [2]

[1] = 90, a [2] [2] = 86 e a [2] [3] = 81.

Nel capitolo "Programmazione ArrayOriented con NumPy", tratteremo NumPy


la raccolta ndarray della libreria e la raccolta DataFrame della libreria Pandas. Questi
consentono di manipolare raccolte multidimensionali in modo più conciso e
convenientemente rispetto alle manipolazioni di elenchi bidimensionali che hai visto in questa sezione.

5.17 INTRO A DATA SCIENCE: SIMULAZIONE E


VISUALIZZAZIONI STATICHE
Le sezioni Intro to Data Science degli ultimi capitoli hanno discusso descrittive di base
statistiche. Qui ci concentriamo sulle visualizzazioni, che ti aiutano a "conoscere" i tuoi dati.
Le visualizzazioni offrono un modo potente per comprendere i dati che va oltre la semplice
guardando i dati grezzi.

Per la visualizzazione utilizziamo due librerie di visualizzazione opensource, Seaborn e Matplotlib


grafici a barre statici che mostrano i risultati finali di una simulazione di rollio su sei lati. Il
La libreria di visualizzazione di Seaborn è costruita sulla libreria di visualizzazione Matplotlib
e semplifica molte operazioni di Matplotlib. Useremo aspetti di entrambe le librerie, perché
alcune delle operazioni di Seaborn restituiscono oggetti dalla libreria Matplotlib. Nel prossimo
della sezione Introduzione alla scienza dei dati del capitolo, renderemo le cose "vive" con la dinamica
visualizzazioni .

5.17.1 Esempi di grafici per 600, 60.000 e 6.000.000 di dadi

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.

Discuteremo come controllare l'aspetto e i contenuti della trama, tra cui:

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,

il testo visualizzato sopra ogni barra, che rappresenta la frequenza e la percentuale di


rotoli totali e

i colori della barra.

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.

Avvio di IPython per lo sviluppo interattivo di Matplotlib

IPython ha il supporto integrato per lo sviluppo interattivo di grafici Matplotlib, che tu


anche bisogno di sviluppare grafici Seaborn. Avvia semplicemente IPython con il comando:

ipython matplotlib

Importazione delle librerie


Per prima cosa, importiamo le librerie che useremo:

Pagina 214
lecca qui per visualizzare l'immagine del codice

In [1]: importa matplotlib.pyplot come plt

In [2]: importa numpy come np

In [3]: importa casuale

In [4]: importa seaborn come sns

1. Il modulo matplotlib.pyplot contiene i grafici della libreria Matplotlib


capacità che utilizziamo. Questo modulo in genere viene importato con il nome plt.

2. La libreria NumPy (Numerical Python) include la funzione univoca che useremo


per riassumere i tiri di dado. Il modulo numpy viene tipicamente importato come np.

3. Il modulo random contiene le funzioni di generazione di numeri casuali di Python.

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.

Rotolamento del dado e calcolo delle frequenze del dado

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:

lecca qui per visualizzare l'immagine del codice

In [5]: rolls = [random.randrange ( 1 , 7 ) for i in range ( 600 )]

In [6]: values, frequencies = np.unique (rolls, return_counts = True )

La libreria NumPy fornisce la raccolta ndarray ad alte prestazioni , che è


1
in genere molto più veloce degli elenchi . Sebbene non usiamo ndarray direttamente qui, il file
La funzione unica di NumPy prevede un argomento ndarray e restituisce un ndarray. Se
passi un elenco (come i rotoli), NumPy lo converte in un ndarray per prestazioni migliori.
Il ndarray restituito da univoco lo assegneremo semplicemente a una variabile per essere utilizzato da un file
Funzione di plottaggio Seaborn.

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.

Creazione del grafico a barre iniziale

Creiamo il titolo del grafico a barre, impostiamo il suo stile, quindi rappresentiamo graficamente le facce e le frequenze del dado:

lecca qui per visualizzare l'immagine del codice

In [7]: title = f'Rolling a SixSided Die {len (rolls) :,} Times '

In [8]: sns.set_style ( 'whitegrid' )

In [9]: assi = sns.barplot (x = valori, y = frequenze, tavolozza ='brillante' )

La stringa di snippet [7] include il numero di tiri di dado nel titolo del grafico a barre. La virgola
(,) identificatore di formato in

{len (rotoli) :,}

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

Funzione barplot restituisce l'oggetto Axes che ha configurato. Lo assegniamo al


assi variabili in modo da poterlo utilizzare per configurare altri aspetti del nostro grafico finale. Eventuali modifiche

che fai al grafico a barre dopo questo punto apparirà immediatamente quando esegui il
snippet corrispondente.

Impostazione del titolo della finestra e l'etichettatura del x - e y -Axes

I prossimi due frammenti aggiungono del testo descrittivo al grafico a barre:

lecca qui per visualizzare l'immagine del codice

In [10]: axes.set_title (titolo)


Fuori [10]: Testo (0,5,1, 'Lanciare un dado a sei facce 600 volte')

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:

lecca qui per visualizzare l'immagine del codice

In [12]: axes.set_ylim (top = max (frequenze) * 1.10 )

Uscita [12]: (0,0, 122,10000000000001) Pagina 218

In [13]: 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 (rolls): .3 %} '
...: axes.text (text_x, text_y, text,
...: fontsize = 11 , ha = 'center' , va = 'bottom' )
...:

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

patch e i corrispondenti valori di frequenza. Ogni iterazione viene decompressa in bar


e la frequenza restituita da una delle tuple zip. La suite dell'istruzione for funziona come
segue:

La prima istruzione calcola la coordinata x centrale dove apparirà il testo. Noi


calcola questo come la somma della coordinata x sinistra della barra (bar.get_x ()) e
metà della larghezza della barra (bar.get_width () / 2.0).

La seconda istruzione ottiene la coordinata y dove apparirà il testo


—Bar.get_y () rappresenta la parte superiore della barra.

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

Rolling Again e aggiornamento del grafico a barre: Presentazione di IPython Magics

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 ()

IPython fornisce comandi speciali chiamati magics per eseguire comodamente


vari compiti. Usiamo la magia% Recall per ottenere lo snippet [5], che ha creato il file

roll list e inserisci il codice al successivo prompt In []:

lecca qui per visualizzare l'immagine del codice

In [15]:% richiama 5

In [16]: rolls = [random.randrange ( 1 , 7 ) for i in range ( 600 )]

Ora puoi modificare lo snippet per cambiare il numero di rotoli a 60000, quindi premere Invio

per creare un nuovo elenco:

lecca qui per visualizzare l'immagine del codice

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:

lecca qui per visualizzare l'immagine del codice

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' )
...:

Il grafico a barre aggiornato è mostrato di seguito:

C Salvataggio di frammenti su un file con% save Magic

Salvataggio di frammenti su un file con% save Magic Pagina 221

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:

lecca qui per visualizzare l'immagine del codice

In [19]: Salva% RollDie.py 1 13


I seguenti comandi sono stati scritti nel file `RollDie.py`:
importa matplotlib.pyplot come plt
importa numpy come np
importazione casuale
importare seaborn come sns
rolls = [random.randrange (1, 7) for i in range (600)]
valori, frequenze = np.unique (rolls, return_counts = True)
title = f'Rolling a SixSided Die {len (rolls) :,} Times '
sns.set_style ("whitegrid")
axes = sns.barplot (valori, frequenze, palette = 'bright')
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 '{frequenza:,} \ n {frequenza / len (rotoli) :. 3%}'
axes.text (text_x, text_y, testo,
fontsize = 11, ha = 'center', va = 'bottom')

Argomenti della riga di comando; Visualizzazione di un grafico da uno script

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:

ipython RollDie.py 600

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

rolls = [random.randrange ( 1 , 7 ) for i in range (int (sys.argv [ 1 ]))]

Notare che abbiamo convertito la stringa argv [1] in un int.

Matplotlib e Seaborn non visualizzano automaticamente il grafico


quando lo crei in uno script. Quindi alla fine dello script abbiamo aggiunto quanto segue
chiamata alla funzione show di Matplotlib , che mostra la finestra contenente il grafico:

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".

Nel prossimo capitolo, "Dizionari e insiemi", continueremo la nostra discussione su Python


collezioni incorporate. Useremo dizionari per archiviare raccolte non ordinate di valori-chiave
coppie che mappano chiavi immutabili a valori, proprio come un dizionario convenzionale mappa le parole
alle definizioni. Useremo i set per memorizzare raccolte non ordinate di elementi unici.

Nel capitolo "Programmazione ArrayOriented con NumPy", discuteremo di NumPy


raccolta ndarray in modo più dettagliato. Vedrai che mentre le liste vanno bene per piccole quantità
di dati, non sono efficienti per le grandi quantità di dati che incontrerai nei big data
applicazioni di analisi. In questi casi, il ndarray altamente ottimizzato della libreria NumPy
raccolta dovrebbe essere utilizzata. ndarray ( array n dimensionale) può essere molto più veloce di
elenchi. Eseguiremo test di profilatura Python per vedere quanto sia più veloce. Come vedrai, NumPy
include anche molte funzionalità per manipolare in modo conveniente ed efficiente array di
molte dimensioni. Nelle applicazioni di analisi dei big data, le richieste di elaborazione possono essere
enorme, quindi tutto ciò che possiamo fare per migliorare le prestazioni è importante. Nel
nostro " ig Data: Hadoop, Spark, NoSQL e IoT ”, utilizzerai uno dei più
2
database bigdata popolari ad alte prestazioni: MongoDB.

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

In questo capitolo potrai:


guadagnando Pat

Utilizza i dizionari per rappresentare raccolte non ordinate di coppie chiave-valore.


ffers & Dea

Usa set per rappresentare raccolte non ordinate di valori univoci.


ighlights

Crea, inizializza e fai riferimento a elementi di dizionari e set.


ettings

Scorri le chiavi, i valori e le coppie chiave-valore di un dizionario.


Supporto
Aggiungi, rimuovi e aggiorna le coppie chiave-valore di un dizionario.
Disconnessione

Utilizza il dizionario e imposta gli operatori di confronto.

Combina set con operatori e metodi set.

Utilizza gli operatori in e not in per determinare se un dizionario contiene una chiave o un insieme

contiene un valore.

Utilizzare le operazioni sugli insiemi modificabili per modificare il contenuto di un insieme.

Usa le comprensioni per creare dizionari e set in modo rapido e conveniente.

Scopri come creare visualizzazioni dinamiche.

Migliora la tua comprensione della mutabilità e dell'immutabilità.

Contorno

.1 Introduzione

.2 Dizionari

6
Pagina 225
.2.1 Creazione di un dizionario

.2.2 Iterazione in un dizionario

.2.3 Operazioni di base del dizionario

.2.4 Chiavi e valori dei metodi del dizionario

.2.5 Confronti del dizionario

.2.6 Esempio: Dizionario dei voti degli studenti

.2.7 Esempio: conteggio parole

.2.8 Aggiornamento del metodo del dizionario

.2.9 Comprensioni del dizionario

.3 Insiemi

.3.1 Confronto di insiemi

.3.2 Operazioni matematiche sugli insiemi


.3.3 Operatori e metodi degli insiemi modificabili

.3.4 Imposta comprensioni

.4 Introduzione alla scienza dei dati: visualizzazioni dinamiche

.4.1 Come funziona la visualizzazione dinamica

.4.2 Implementazione di una visualizzazione dinamica

.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

Numeri decimali int numeri romani str

Agricolo
stati str elenco di str
prodotti

tupla di int e
Pazienti ospedalieri str Segni vitali
galleggia

Giocatori di baseball str Medie di battuta galleggiante

Metrico
str Abbreviazioni str
misurazioni
Codici inventario str Quantità in magazzino int

U nique Keys

nique Keys Pagina 227

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.

6.2.1 Creazione di un dizionario


È possibile creare un dizionario racchiudendo tra parentesi graffe, {}, un elenco separato da virgole di
coppie chiave-valore, ciascuna della forma chiave : valore . Puoi creare un dizionario vuoto con

{}.

Creiamo un dizionario con le chiavi del paese di origine "Finlandia", "Sud Africa"

e "Nepal" e i valori corrispondenti dei codici di paese Internet "fi", "za" e

'np':

lecca qui per visualizzare l'immagine del codice

In [1]: country_codes = { 'Finland' : 'fi' , 'South Africa' : 'za' ,


...: 'Nepal' : '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.

Determinare se un dizionario è vuoto


La funzione incorporata len restituisce il numero di coppie chiave-valore in un dizionario:

In [3]: len (country_codes)


Fuori [3]: 3

Puoi usare un dizionario come condizione per determinare se è vuoto: una dizione non vuota
ary restituisce True:

lecca qui per visualizzare l'immagine del codice

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]:

lecca qui per visualizzare l'immagine del codice

In [5]: country_codes.clear ()

In [6]: if country_codes:
...: print ( 'country_codes non è vuoto' )
...: altro :
...: print ( 'country_codes è vuoto' )
...:
country_codes è vuoto

6.2.2 Iterazione in un dizionario


Il seguente dizionario associa le stringhe monthname ai valori int che rappresentano il file
numero di giorni nel mese corrispondente. Tieni presente che più chiavi possono avere l'estensione
stesso valore:

lecca qui per visualizzare l'immagine del codice

In [1]: days_per_month = { 'January' : 31 , 'February' : 28 , 'March' : 31 }

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.

L'istruzione for seguente esegue l'iterazione delle coppie chiave-valore di days_per_month.

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

In [3]: per mese, giorni in days_per_month.items ():


...: print (f " {month} has {days} days" )
...:
Gennaio ha 31 giorni
Febbraio ha 28 giorni
Marzo ha 31 giorni

6.2.3 Operazioni di base del dizionario


Per questa sezione, iniziamo creando e visualizzando il dizionario

numeri romani. Forniamo intenzionalmente il valore errato 100 per la chiave "X",
che correggeremo a breve:

lecca qui per visualizzare l'immagine del codice

In [1]: roman_numerals = { 'I' : 1 , 'II' : 2 , 'III' : 3 , 'V' : 5 , 'X' : 100 }

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 [3]: roman_numerals [ 'V' ]


Fuori [3]: 5

Aggiornamento del valore di una coppia chiave-valore esistente


Puoi aggiornare il valore associato a una chiave in un'istruzione di assegnazione, cosa che facciamo qui
per sostituire il valore errato associato alla chiave "X":

lecca qui per visualizzare l'immagine del codice

In [4]: ​roman_numerals [ 'X' ] = 10

In [5]: roman_numerals
Uscita [5]: {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 10}

Aggiunta di una nuova coppia chiave-valore


C
Pagina 230
L'assegnazione di un valore a una chiave inesistente inserisce la coppia chiave-valore nel dizionario:

lecca qui per visualizzare l'immagine del codice

In [6]: roman_numerals [ 'L' ] = 50

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.

Rimozione di una coppia chiave-valore

Puoi eliminare una coppia chiave-valore da un dizionario con l'istruzione del:

lecca qui per visualizzare l'immagine del codice

In [8]: del roman_numerals [ 'III' ]

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:

lecca qui per visualizzare l'immagine del codice

In [10]: roman_numerals.pop ( 'X' )


Fuori [10]: 10

In [11]: roman_numerals
Fuori [11]: {'I': 1, 'II': 2, 'V': 5, 'L': 50}

Tentativo di accesso a una chiave inesistente

L'accesso a una chiave inesistente produce un KeyError:

lecca qui per visualizzare l'immagine del codice


n [12]: roman_numerals [ 'III' ]

KeyError Traceback (la chiamata più recente per ultima)

<ipythoninput12ccd50c7f0c8b> in <module> () Pagina 231


> 1 roman_numerals ['III']

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:

lecca qui per visualizzare l'immagine del codice

In [13]: roman_numerals.get ( 'III' )

In [14]: roman_numerals.get ( 'III' , 'III non nel dizionario' )


Out [14]: "III non nel dizionario"

In [15]: roman_numerals.get ( 'V' )


Fuori [15]: 5

Verifica se un dizionario contiene una chiave specificata

Gli operatori in e non in possono determinare se un dizionario contiene una chiave specificata:

lecca qui per visualizzare l'immagine del codice

In [16]: "V" in roman_numerals


Out [16]: Vero

In [17]: "III" in roman_numerals


Out [17]: Falso

In [18]: "III" non in roman_numerals


Out [18]: Vero

6.2.4 Chiavi e valori dei metodi del dizionario

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:

lecca qui per visualizzare l'immagine del codice

Y
C
Pagina 232
In [1]: months = { 'January' : 1 , 'February' : 2 , 'March' : 3 }

In [2]: per month_name in months.keys ():


...: print (month_name, end = '' )
...:
Gennaio febbraio marzo

In [3]: per month_number in months.values ​():


...: print (month_number, end = '' )
...:
123

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:

lecca qui per visualizzare l'immagine del codice

In [4]: ​months_view = months.keys ()

In [5]: per la chiave in months_view:


...: print (key, end = '' )
...:
Gennaio febbraio marzo

Successivamente, aggiungiamo una nuova coppia chiave-valore a mesi e visualizziamo il dizionario aggiornato:

lecca qui per visualizzare l'immagine del codice

In [6]: mesi ["dicembre"] = 12

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:

lecca qui per visualizzare l'immagine del codice

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 .

Conversione di chiavi, valori e coppie chiave-valore del dizionario in elenchi

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

funzione lista. La modifica di questi elenchi non modifica il dizionario corrispondente:

lecca qui per visualizzare l'immagine del codice

In [9]: list (months.keys ())


In uscita [9]: ['Gennaio', 'Febbraio', 'Marzo', 'Dicembre']
In [10]: list (months.values ​())
Uscita [10]: [1, 2, 3, 12]

In [11]: list (months.items ())


Out [11]: [('January', 1), ('February', 2), ('March', 3), ('December', 12]

le chiavi in ​ordine ordinato

Per elaborare le chiavi in ordine ordinato , è possibile utilizzare la funzione incorporata ordinata come segue:

lecca qui per visualizzare l'immagine del codice

In [12]: per month_name in ordinato (months.keys ()):


...: print (month_name, end = '' )
...:
Febbraio dicembre gennaio marzo

6.2.5 Confronti di dizionari

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 (==)

su True se entrambi i dizionari hanno le stesse coppie chiave-valore, indipendentemente dall'ordine in


quali coppie chiave-valore sono state aggiunte a ciascun dizionario:

lecca qui per visualizzare l'immagine del codice

In [1]: country_capitals1 = { "Belgium" : "Brussels" ,


...: 'Haiti' : 'PortauPrince' }
...:

In [2]: country_capi