Sei sulla pagina 1di 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 orpsales@pearsoned.com
o (800) 3823419.

Per richieste di informazioni sulle vendite governative, contattare


overnmentsales@pearsoned.com .

Per domande sulle vendite al di fuori degli Stati Uniti, contattare ntlcs@pearson.com .

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 eitel@deitel.com .

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

eitel@deitel.com

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:

eitel@deitel.com

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:

eitel@deitel.com

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 eitel@deitel.com .

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_capitals2 = { 'Nepal' : 'Kathmandu' ,


...: 'Uruguay' : 'Montevideo' }
...:

In [3]: country_capitals3 = { 'Haiti' : 'PortauPrince' ,


...: "Belgium" : "Brussels" }
...:

In [4]: ​country_capitals1 == country_capitals2


Fuori [4]: ​Falso

In [5]: country_capitals1 == country_capitals3


Out [5]: Vero

In [6]: country_capitals1! = Country_capitals2


Out [6]: Vero

6.2.6 Esempio: Dizionario dei voti degli studenti


Il seguente script rappresenta il libro dei voti di un insegnante come un dizionario che mappa
il nome di ogni studente (una stringa) a un elenco di numeri interi contenente i voti di quello studente
tre esami. In ogni iterazione del ciclo che visualizza i dati (righe 13-17), noi
decomprimere una coppia chiave-valore nelle variabili nome e voti contenenti uno studente

nome e l'elenco corrispondente di tre gradi. La riga 14 usa la funzione incorporata sum to
totalizza i voti di un dato studente, quindi la riga 15 calcola e visualizza la media di quello studente
dividendo il totale per il numero di voti per quello studente (len (voti)). Righe 16–

17 tengono traccia del totale dei voti di tutti e quattro gli studenti e del numero di voti per tutti
gli studenti, rispettivamente. La riga 19 stampa la media della classe di tutti i voti degli studenti
tutti gli esami.
lecca qui per visualizzare l'immagine del codice

1 # fig06_01.py
2 "" "Usare un dizionario per rappresentare il registro dei voti di un insegnante." ""

3 grade_book = { Pagina 235


4 "Susan" : [ 92 , 85 , 100 ],
5 "Eduardo": [ 83 , 95 , 79 ],
6 "Azizi" : [ 91 , 89 , 82 ],
7 "Pantipa" : [ 97 , 91 , 92 ]
8 }
9
10 all_grades_total = 0
11 all_grades_count = 0
12
13 per nome, voti in grade_book.items ():
14 totale = somma (voti)
15 print (f 'La media per {nome} è {total / len (voti): .2 f} ' )
16 all_grades_total + = total
17 all_grades_count + = len (voti)
18
19 print (f "La media della classe è: {all_grades_total / all_grades_count: .2 f}

lecca qui per visualizzare l'immagine del codice

La media per Susan è 92,33


La media per Eduardo è 85,67
La media per Azizi è 87,33
La media per Pantipa è 93,33
La media della classe è: 89.67

2
6.2.7 Esempio: conteggio parole
2
Tecniche come il conteggio della frequenza delle parole vengono spesso utilizzate per analizzare le opere pubblicate.
Ad esempio, alcune persone credono che le opere di William Shakespeare potrebbero effettivamente farlo
sono stati scritti da Sir Francis Bacon, Christopher Marlowe o altri. Confrontando il
le frequenze delle parole delle loro opere con quelle di Shakespeare possono rivelare lo stile di scrittura
analogie. Vedremo altre tecniche di analisi documentale nel linguaggio naturale
Capitolo Processing (NLP).

Il seguente script crea un dizionario per contare il numero di occorrenze di ciascuno


parola in una stringa. Le righe 4-5 creano una stringa di testo che divideremo in parole: un processo
noto come tokenizzazione di una stringa . Python concatena automaticamente le stringhe separate
da spazi tra parentesi. La riga 7 crea un dizionario vuoto. Le chiavi del dizionario
saranno le parole univoche ei suoi valori saranno conteggi interi di quante volte ciascuno
la parola appare nel testo.

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

1 # fig06_02.py
2 "" "Tokenizzazione di una stringa e conteggio di parole uniche." ""
3
4 text = ( 'questo è un testo di esempio con più parole'
5 "questo è più testo di esempio con alcune parole diverse" )
6
7 word_counts = {}
8
9 # conta le occorrenze di ogni parola unica
10 per la parola in text.split ():
11 if word in word_counts:
12 word_counts [word] + = 1 # aggiorna la coppia di valori chiave esistente
13 altro :
14 word_counts [word] = 1 # inserisce una nuova coppia di valori-chiave
15
16 print (f ' { "WORD" : < 12 } COUNT' )
17
18 per parola, conta in ordinato (word_counts.items ()):
19 print (f ' {word: < 12 } {count} ' )
20
21 print ( '\ nNumero di parole univoche:' , len (word_counts))

lecca qui per visualizzare l'immagine del codice

CONTE DI PAROLE
diverso 1
è2
più 1
campione 2
diversi 1
alcuni 1
testo 2
questo 2
con 2
parole 2
Numero di parole uniche: 10

La riga 10 tokenizza il testo chiamando il metodo di stringa split , che separa le parole

utilizzando l'argomento stringa delimitatore del metodo. Se non fornisci un argomento,


split usa uno spazio. Il metodo restituisce un elenco di token (ovvero le parole nel testo).
Le righe 10-14 scorrono l'elenco di parole. Per ogni parola, la riga 11 determina
se quella parola (la chiave) è già nel dizionario. In tal caso, la riga 12 lo incrementa

conteggio delle parole, altrimenti la riga 14 inserisce una nuova coppia chiave-valore per quella parola con un

C
Pagina 237
conteggio iniziale di 1.

Le righe 16–21 riassumono i risultati in una tabella a due colonne contenente ogni parola e la sua
conteggio corrispondente. L'istruzione for nelle righe 18 e 19 itera attraverso il

coppie chiave-valore del dizionario. Decomprime ogni chiave e valore nella parola delle variabili
e contare, quindi li visualizza in due colonne. La riga 21 mostra il numero di unici
parole.

Collezioni del modulo libreria standard Python

La libreria standard Python contiene già la funzionalità di conteggio che noi


implementato usando il dizionario e il ciclo nelle righe 10-14. Il modulo

collezioni contiene il tipo Counter , che riceve un iterabile e riepiloga


i suoi elementi. Reimplementiamo lo script precedente in meno righe di codice con

Contatore:

lecca qui per visualizzare l'immagine del codice

In [1]: dalle collezioni importa Counter

In [2]: text = ( "questo è un testo di esempio con diverse parole"


...: "questo è più testo di esempio con alcune parole diverse" )
...:
In [3]: counter = Counter (text.split ())

In [4]: per parola, conta in ordinato (counter.items ()):


...: print (f ' {word: < 12 } {count} ' )
...:
diverso 1
è2
più 1
campione 2
diversi 1
alcuni 1
testo 2
questo 2
con 2
parole 2

In [5]: print ( 'Numero di chiavi univoche:' , len (counter.keys ()))


Numero di chiavi univoche: 10

Snippet [3] crea il contatore, che riepiloga l'elenco delle stringhe restituite da

text.split (). Nello snippet [4], gli elementi del metodo Counter restituiscono ogni stringa e il relativo
conteggio associato come tupla. Usiamo la funzione incorporata ordinata per ottenere un elenco di queste tuple

C
Pagina 238
in ordine crescente. Per impostazione predefinita, ordinato ordina le tuple in base ai loro primi elementi. Se quelli
sono identici, quindi esamina il secondo elemento e così via. L'istruzione for itera
sull'elenco ordinato risultante, visualizzando ogni parola e conteggio in due colonne.

6.2.8 Aggiornamento del metodo del dizionario

È possibile inserire e aggiornare le coppie chiave-valore utilizzando l' aggiornamento del metodo del dizionario . Primo,
creiamo un dizionario country_codes vuoto:

In [1]: country_codes = {}

La seguente chiamata di aggiornamento riceve un dizionario di coppie chiave-valore da inserire o aggiornare:

lecca qui per visualizzare l'immagine del codice

In [2]: country_codes.update ({ 'South Africa' : 'za' })

In [3]: country_codes
In uscita [3]: {'South Africa': 'za'}

L'aggiornamento del metodo può convertire gli argomenti delle parole chiave in coppie chiave-valore da inserire. Il
la chiamata successiva converte automaticamente il nome del parametro Australia nella stringa

key "Australia" e associa il valore "ar" a tale chiave:

lecca qui per visualizzare l'immagine del codice

In [4]: ​country_codes.update (Australia = 'ar' )

In [5]: country_codes
Fuori [5]: {'South Africa': 'za', 'Australia': 'ar'}

Lo snippet [4] ha fornito un codice paese errato per l'Australia. Correggiamo questo

utilizzando un altro argomento di parola chiave per aggiornare il valore associato a "Australia":

lecca qui per visualizzare l'immagine del codice


In [6]: country_codes.update (Australia = 'au' )

In [7]: country_codes
Fuori [7]: {'South Africa': 'za', 'Australia': 'au'}

C
Pagina 239
L'aggiornamento del metodo può anche ricevere un oggetto iterabile contenente coppie chiave-valore, come
un elenco di tuple a due elementi.

6.2.9 Comprensioni del dizionario


Le comprensioni del dizionario forniscono una comoda notazione per la generazione rapida
dizionari, spesso mappando un dizionario a un altro. Ad esempio, in un dizionario
con valori univoci , puoi invertire le coppie chiave-valore:

lecca qui per visualizzare l'immagine del codice

In [1]: months = { 'January' : 1 , 'February' : 2 , 'March' : 3 }

In [2]: months2 = {number: name for name, number in months.items ()}

In [3]: months2
Uscita [3]: {1: 'gennaio', 2: 'febbraio', 3: 'marzo'}

Le parentesi graffe delimitano una comprensione del dizionario e l'espressione a sinistra di


La clausola for specifica una coppia chiave-valore nel formato chiave : valore . La comprensione
itera attraverso months.items (), decomprimendo ogni coppia chiave-valore tupla nel file
nome e numero delle variabili. L'espressione numero: nome inverte la chiave e
valore, in modo che il nuovo dizionario associ i numeri dei mesi ai nomi dei mesi.

E se i mesi contenessero valori duplicati ? Dato che queste diventano le chiavi in ​mesi2,
il tentativo di inserire una chiave duplicata aggiorna semplicemente il valore della chiave esistente. Quindi se

Originariamente "febbraio" e "marzo" erano entrambi mappati a 2, come avrebbe fatto il codice precedente
hanno prodotto

{1: 'January', 2: 'March'}

Una comprensione del dizionario può anche mappare i valori di un dizionario a nuovi valori. Il
la seguente comprensione converte un dizionario di nomi ed elenchi di voti in un file
dizionario dei nomi e medie dei voti. Le variabili k e v comunemente significano
chiave e valore :

lecca qui per visualizzare l'immagine del codice

In [4]: ​grades = { 'Sue' : [ 98 , 87 , 94 ], 'Bob' : [ 84 , 95 , 91 ]}

In [5]: grades2 = {k: sum (v) / len (v) for k, v in grades.items ()}

C
Pagina 240
In [6]: gradi2
Uscita [6]: {'Sue': 93.0, 'Bob': 90.0}

La comprensione scompatta ogni tupla restituita da grades.items () in k (il


nome) ev (l'elenco dei voti). Quindi, la comprensione crea una nuova coppia chiave-valore

con la chiave k e il valore di sum (v) / len (v), che media gli elementi della lista.
6.3 SET
Un set è una raccolta non ordinata di valori univoci . I set possono contenere solo immutabili
oggetti, come stringhe, int, float e tuple che contengono solo elementi immutabili.
Sebbene i set siano iterabili, non sono sequenze e non supportano l'indicizzazione e
affettare con parentesi quadre, []. I dizionari inoltre non supportano la suddivisione in sezioni.

Creazione di un set con parentesi graffe


Il codice seguente crea un set di stringhe denominate colors:

lecca qui per visualizzare l'immagine del codice

In [1]: colors = { 'red' , 'orange' , 'yellow' , 'green' , 'red' , 'blue' }

In [2]: colori
In uscita [2]: {"blue", "green", "orange", "red", "yellow"}

Notare che la stringa duplicata "rossa" è stata ignorata (senza causare un errore). Un
un uso importante dei set è l' eliminazione dei duplicati , che è automatica quando si crea un file
impostato. Inoltre, i valori del set risultante non vengono visualizzati nello stesso ordine in cui erano
elencato nello snippet [1]. Sebbene i nomi dei colori siano visualizzati in ordine ordinato, i set lo sono
non ordinato . Non dovresti scrivere codice che dipende dall'ordine dei loro elementi.

Determinazione della lunghezza di un set

È possibile determinare il numero di elementi in un set con la funzione len incorporata:

In [3]: len (colori)


Fuori [3]: 5

Verificare se un valore è in un set

È possibile verificare se un set contiene un valore particolare utilizzando in e not in

C
Pagina 241
operatori:

lecca qui per visualizzare l'immagine del codice

In [4]: "rosso" nei colori


Out [4]: ​vero

In [5]: "viola" nei colori


Fuori [5]: Falso

In [6]: "viola" non nei colori


Out [6]: Vero

Iterazione attraverso un set


Gli insiemi sono iterabili, quindi puoi elaborare ogni elemento dell'insieme con un ciclo for:

lecca qui per visualizzare l'immagine del codice

In [7]: per il colore nei colori:


...: print (color.upper (), end = '' )
...:
ROSSO VERDE GIALLO BLU ARANCIONE
Gli insiemi non sono ordinati , quindi non c'è alcun significato per l'ordine di iterazione.

Creazione di un set con la funzione set incorporato

È possibile creare un set da un'altra raccolta di valori utilizzando la funzione set incorporata
—Qui creiamo un elenco che contiene diversi valori interi duplicati e utilizziamo tale elenco come

argomento di set:

lecca qui per visualizzare l'immagine del codice

In [8]: numeri = elenco (intervallo ( 10 )) + elenco (intervallo ( 5 ))

In [9]: numeri
Uscita [9]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4]

In [10]: set (numeri)


Fuori [10]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Se è necessario creare un set vuoto, è necessario utilizzare la funzione set con empty

parentesi, piuttosto che parentesi graffe vuote, {}, che rappresentano un dizionario vuoto:

C
Pagina 242
In [11]: set ()
Uscita [11]: set ()

Python mostra un set vuoto come set () per evitare confusione con la stringa di Python

rappresentazione di un dizionario vuoto ({}).

Frozenset: un tipo di set immutabile


I set sono mutabili -È possibile aggiungere e rimuovere elementi, ma insieme elementi deve essere
immutabile . Pertanto, un insieme non può avere altri insiemi come elementi. Un frozenset è un file
insieme immutabile : non può essere modificato dopo averlo creato, quindi un insieme può contenere congelamenti
come elementi. La funzione incorporata frozenset crea un frozenset da qualsiasi iterabile.

6.3.1 Confronto di insiemi


Vari operatori e metodi possono essere utilizzati per confrontare gli insiemi. I seguenti set contengono
gli stessi valori, quindi == restituisce True e! = restituisce False.

lecca qui per visualizzare l'immagine del codice

In [1]: { 1 , 3 , 5 } == { 3 , 5 , 1 }
Out [1]: vero

In [2]: { 1 , 3 , 5 }! = { 3 , 5 , 1 }
Fuori [2]: Falso

L'operatore <verifica se l'insieme alla sua sinistra è un sottoinsieme appropriato di quello alla sua destra
- cioè, tutti gli elementi nell'operando di sinistra sono nell'operando di destra e gli insiemi lo sono
non uguale:

lecca qui per visualizzare l'immagine del codice

In [3]: { 1 , 3 , 5 } <{ 3 , 5 , 1 }
Fuori [3]: Falso

In [4]: ​{ 1 , 3 , 5 } <{ 7 , 3 , 5 , 1 }
Out [4]: ​vero
L'operatore <= verifica se l'insieme alla sua sinistra è un sottoinsieme improprio di quello alla sua
a destra, ovvero tutti gli elementi nell'operando di sinistra si trovano nell'operando di destra e negli insiemi
potrebbe essere uguale:

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

In [5]: { 1 , 3 , 5 } <= { 3 , 5 , 1 }
Out [5]: Vero

In [6]: { 1 , 3 } <= { 3 , 5 , 1 }
Out [6]: Vero

Puoi anche verificare la presenza di un sottoinsieme non corretto con il metodo set issubset :

lecca qui per visualizzare l'immagine del codice

In [7]: { 1 , 3 , 5 } .issubset ({ 3 , 5 , 1 })
Out [7]: Vero

In [8]: { 1 , 2 } .issubset ({ 3 , 5 , 1 })
Fuori [8]: Falso

L'operatore> verifica se l'insieme alla sua sinistra è un superset appropriato di quello alla sua
right, ovvero tutti gli elementi nell'operando di destra si trovano nell'operando di sinistra e in quello di sinistra
operando ha più elementi:

lecca qui per visualizzare l'immagine del codice

In [9]: { 1 , 3 , 5 }> { 3 , 5 , 1 }
Fuori [9]: Falso

In [10]: { 1 , 3 , 5 , 7 }> { 3 , 5 , 1 }
Out [10]: Vero

L'operatore> = verifica se l'insieme alla sua sinistra è un superset errato di quello a


è a destra, ovvero tutti gli elementi nell'operando di destra si trovano nell'operando di sinistra e il
gli insiemi potrebbero essere uguali:

lecca qui per visualizzare l'immagine del codice

In [11]: { 1 , 3 , 5 }> = { 3 , 5 , 1 }
Out [11]: Vero

In [12]: { 1 , 3 , 5 }> = { 3 , 1 }
Out [12]: Vero

In [13]: { 1 , 3 }> = { 3 , 1 , 7 }
Out [13]: Falso

C
Pagina 244

Puoi anche verificare la presenza di un superset improprio con il metodo set issuperset :

lecca qui per visualizzare l'immagine del codice

In [14]: { 1 , 3 , 5 } .issuperset ({ 3 , 5 , 1 })
Out [14]: Vero
In [15]: { 1 , 3 , 5 } .issuperset ({ 3 , 2 })
Out [15]: Falso

L'argomento per issubset o issuperset può essere qualsiasi iterabile. Quando uno di questi

metodi riceve un argomento iterabile non impostato, prima converte l'iterabile in un insieme, quindi
esegue l'operazione.

6.3.2 Operazioni matematiche sugli insiemi


Questa sezione presenta gli operatori matematici del tipo di insieme |, & e ^ e il

metodi corrispondenti.

Unione

L' unione di due set è un set composto da tutti gli elementi unici di entrambi i set. tu
può calcolare l'unione con il | operatore o con il metodo union del tipo set :

lecca qui per visualizzare l'immagine del codice

In [1]: { 1 , 3 , 5 } | { 2 , 3 , 4 }
Fuori [1]: {1, 2, 3, 4, 5}

In [2]: { 1 , 3 , 5 } .union ([ 20 , 20 , 3 , 40 , 40 ])
Fuori [2]: {1, 3, 5, 20, 40}

Gli operandi degli operatori di insieme binario, come |, devono essere entrambi set. Il corrispondente
I metodi set possono ricevere qualsiasi oggetto iterabile come argomento: abbiamo passato una lista. Quando un
Il metodo set matematico riceve un argomento iterabile non impostato, prima converte il file
iterabile a un insieme, quindi applica l'operazione matematica. Anche in questo caso, sebbene i nuovi set '
le rappresentazioni di stringa mostrano i valori in ordine crescente, non dovresti scrivere codice
dipende da questo.

Intersezione

L' intersezione di due insiemi è un insieme costituito da tutti gli elementi unici che i due

C
Pagina 245
i set hanno in comune. Puoi calcolare l'intersezione con l' operatore & o con

il metodo di intersezione del tipo di set :

lecca qui per visualizzare l'immagine del codice

In [3]: { 1 , 3 , 5 } e { 2 , 3 , 4 }
Fuori [3]: {3}

In [4]: ​{ 1 , 3 , 5 } .intersection ([ 1 , 2 , 2 , 3 , 3 , 4 , 4 ])
Fuori [4]: ​{1, 3}

Differenza

La differenza tra due insiemi è un insieme costituito dagli elementi nell'operando di sinistra
che non si trovano nell'operando corretto. Puoi calcolare la differenza con l' operatore

o con il metodo della differenza del tipo impostato :

lecca qui per visualizzare l'immagine del codice

In [5]: { 1 , 3 , 5 } { 2 , 3 , 4 }
Fuori [5]: {1, 5}

In [6]: { 1 , 3 , 5 , 7 } .difference ([ 2 , 2 , 3 , 3 , 4 , 4 ])
Uscita [6]: {1, 5, 7}

Differenza simmetrica

La differenza simmetrica tra due insiemi è un insieme costituito dagli elementi di


entrambi i set che non sono in comune tra loro. Puoi calcolare il simmetrico
differenza con l' operatore ^ o con symmetric_difference del tipo set

metodo:

lecca qui per visualizzare l'immagine del codice

In [7]: { 1 , 3 , 5 } ^ { 2 , 3 , 4 }
Fuori [7]: {1, 2, 4, 5}

In [8]: { 1 , 3 , 5 , 7 } .symmetric_difference ([ 2 , 2 , 3 , 3 , 4 , 4 ])
Fuori [8]: {1, 2, 4, 5, 7}

Disarticolare

Due insiemi sono disgiunti se non hanno elementi comuni. Puoi determinare

C
Pagina 246
questo con il metodo isdisjoint del tipo set :

lecca qui per visualizzare l'immagine del codice

In [9]: { 1 , 3 , 5 } .isdisjoint ({ 2 , 4 , 6 })
Out [9]: Vero

In [10]: { 1 , 3 , 5 } .isdisjoint ({ 4 , 6 , 1 })
Out [10]: Falso

6.3.3 Operatori e metodi degli insiemi modificabili


Gli operatori e i metodi presentati nella sezione precedente risultano ciascuno in un nuovo insieme.
Qui discutiamo operatori e metodi che modificano un insieme esistente .

Operazioni matematiche sugli insiemi mutevoli


Come l'operatore |, l' assegnazione aumentata di unione | = esegue un'operazione di unione impostata,

ma | = modifica il suo operando sinistro:

lecca qui per visualizzare l'immagine del codice

In [1]: numeri = { 1 , 3 , 5 }

In [2]: numeri | = { 2 , 3 , 4 }

In [3]: numeri
Fuori [3]: {1, 2, 3, 4, 5}

Allo stesso modo, il metodo di aggiornamento del tipo di set esegue un'operazione di unione che modifica il set
su cui è chiamato, l'argomento può essere qualsiasi iterabile:

lecca qui per visualizzare l'immagine del codice

In [4]: ​numbers.update (range ( 10 ))

In [5]: numeri
Uscita [5]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Gli altri metodi degli insiemi modificabili sono:

assegnazione aumentata di intersezione & =

C
Pagina 247
assegnazione aumentata di differenza =

assegnazione aumentata a differenza simmetrica ^ =

ei metodi corrispondenti con argomenti iterabili sono:

intersection_update

differenziale_update

symmetric_difference_update

Metodi per aggiungere e rimuovere elementi

Il metodo set add inserisce il suo argomento se l'argomento non è già nel set;
in caso contrario, il set rimane invariato:

lecca qui per visualizzare l'immagine del codice

In [6]: numbers.add ( 17 )

In [7]: numbers.add ( 3 )

In [8]: numeri
Fuori [8]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17}

Il metodo set remove rimuove il suo argomento dal set: si verifica un'eccezione KeyError se il
il valore non è nel set:

lecca qui per visualizzare l'immagine del codice

In [9]: numbers.remove ( 3 )

In [10]: numeri
Fuori [10]: {0, 1, 2, 4, 5, 6, 7, 8, 9, 17}

Il metodo discard rimuove anche il suo argomento dall'insieme ma non causa un


eccezione se il valore non è nel set.

Puoi anche rimuovere un elemento set arbitrario e restituirlo con pop , ma i set lo sono
non ordinato, quindi non sai quale elemento verrà restituito:

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

In [11]: numbers.pop ()
Uscita [11]: 0

In [12]: numeri
Fuori [12]: {1, 2, 4, 5, 6, 7, 8, 9, 17}
Un KeyError si verifica se il set è vuoto quando chiami pop.

Infine, il metodo clear svuota il set su cui è chiamato:

In [13]: numbers.clear ()

In [14]: numeri
Uscita [14]: set ()

6.3.4 Imposta comprensioni


Come le comprensioni del dizionario, definisci le comprensioni degli insiemi tra parentesi graffe. Facciamo
creare un nuovo set contenente solo i valori pari univoci nei numeri dell'elenco:

lecca qui per visualizzare l'immagine del codice

In [1]: numeri = [ 1 , 2 , 2 , 3 , 4 , 5 , 6 , 6 , 7 , 8 , 9 , 10 , 10 ]

In [2]: evens = {item for item in numbers if item% 2 == 0 }

In [3]: pari
Uscita [3]: {2, 4, 6, 8, 10}

6.4 INTRO ALLA DATA SCIENCE: DYNAMIC


VISUALIZZAZIONI
La sezione Intro to Data Science del capitolo precedente ha introdotto la visualizzazione. Noi
simulava il lancio di un dado a sei facce e utilizzava la visualizzazione di Seaborn e Matplotlib
librerie per creare un grafico a barre statiche di qualità della pubblicazione che mostri le frequenze e
percentuali di ogni valore di lancio. In questa sezione, facciamo "prendere vita" le cose con
visualizzazioni dinamiche .

La legge dei grandi numeri

C
Pagina 249
hen abbiamo introdotto la generazione randomnumber, abbiamo detto che if random

la funzione randrange del modulo produce effettivamente numeri interi a caso, quindi ogni numero
nell'intervallo specificato ha la stessa probabilità (o probabilità) di essere scelto ogni volta
la funzione viene chiamata. Per un dado a sei facce, ogni valore da 1 a 6 dovrebbe verificarsi un ottavo
th
del tempo, quindi la probabilità che uno qualsiasi di questi valori si verifichi è 1/6 o circa
16,667%.

Nella sezione successiva, creiamo ed eseguiamo un dierolling dinamico (cioè animato )


script di simulazione. In generale, vedrai che più tiri tentiamo, più vicini ciascuno
la percentuale del valore del dado sul totale dei tiri arriva al 16,667% e l'altezza delle barre
gradualmente diventare più o meno lo stesso. Questa è una manifestazione della legge dei grandi numeri .

6.4.1 Come funziona la visualizzazione dinamica


Le trame prodotte con Seaborn e Matplotlib nell'Intro ai dati del capitolo precedente
La sezione Scienza ti aiuta ad analizzare i risultati per un numero fisso di tiri di dado dopo il
la simulazione viene completata. Questa sezione migliora quel codice con Matplotlib

l'animazione del modulo FuncAnimation funzione, che aggiorna il grafico a barre


dinamicamente . Vedrai le barre, le frequenze e le percentuali "prendere vita",
aggiornamento continuo man mano che si verificano i rulli.
Fotogrammi di animazione

FuncAnimation guida un'animazione framebyframe . Ogni fotogramma dell'animazione


specifica tutto ciò che dovrebbe cambiare durante un aggiornamento della trama. Stringendo insieme
molti di questi aggiornamenti nel tempo creano l'effetto di animazione. Tu decidi cosa ciascuno
frame viene visualizzato con una funzione definita dall'utente e passata a FuncAnimation.

Ogni fotogramma dell'animazione:

lancia i dadi un numero di volte specificato (da 1 a quante ne desideri), aggiornando


frequenze del dado con ogni lancio,

cancella la trama attuale,

creare un nuovo set di barre che rappresentano le frequenze aggiornate e

creare nuova frequenza e testo percentuale per ogni barra.

In genere, la visualizzazione di più fotogrammi al secondo produce un'animazione più fluida. Per
Ad esempio, i videogiochi con elementi in rapido movimento cercano di visualizzare almeno 30 fotogrammi per

W
Pagina 250
secondo e spesso di più. Sebbene tu specifichi il numero di millisecondi tra
fotogrammi di animazione, il numero effettivo di fotogrammi al secondo può essere influenzato dal file
quantità di lavoro che esegui in ogni fotogramma e la velocità del processore del tuo computer.
Questo esempio mostra un fotogramma di animazione ogni 33 millisecondi, cedendo
circa 30 (1000/33) fotogrammi per secondo. Prova valori più grandi e più piccoli per vedere
come influenzano l'animazione. La sperimentazione è importante per sviluppare il meglio
visualizzazioni.

Esecuzione di RollDieDynamic.py

Nella sezione Intro to Data Science del capitolo precedente, abbiamo sviluppato il file static
visualizzazione interattiva in modo da poter vedere come il codice aggiorna il grafico a barre mentre lo fai
eseguire ogni istruzione. Il grafico a barre effettivo con le frequenze e le percentuali finali
è stato disegnato una sola volta.

Per questa visualizzazione dinamica, i risultati dello schermo si aggiornano frequentemente in modo che tu possa vedere
l'animazione. Molte cose cambiano continuamente: le lunghezze delle barre, i
frequenze e percentuali sopra le barre, la spaziatura e le etichette sugli assi e il
numero totale di tiri di dado mostrato nel titolo della trama. Per questo motivo, presentiamo questo
visualizzazione come un copione, piuttosto che svilupparlo interattivamente.

Lo script accetta due argomenti della riga di comando:

number_of_frames: il numero di frame di animazione da visualizzare. Questo valore


determina il numero totale di volte in cui FuncAnimation aggiorna il grafico. Per

ogni fotogramma dell'animazione, FuncAnimation chiama una funzione definita dall'utente (in this
esempio, update) per specificare come modificare il grafico.

rolls_per_frame: il numero di volte in cui tirare il dado in ogni fotogramma dell'animazione.


Useremo un ciclo per tirare il dado questo numero di volte, quindi riassumeremo i risultati
aggiorna il grafico con barre e testo che rappresentano le nuove frequenze.

Per capire come utilizziamo questi due valori, considera il seguente comando:

ipython RollDieDynamic.py 6000 1


In questo caso, FuncAnimation chiama la nostra funzione di aggiornamento 6000 volte, lanciando un dado
per frame per un totale di 6000 rotoli. Ciò consente di vedere le barre, le frequenze e
le percentuali si aggiornano un tiro alla volta. Sul nostro sistema, questa animazione ha richiesto circa 3,33
minuti (6000 fotogrammi / 30 fotogrammi al secondo / 60 secondi al minuto) per mostrarti

Pagina 251
solo 6000 tiri di dado.

La visualizzazione dei fotogrammi dell'animazione sullo schermo è un input-output relativamente lento


funzionamento rispetto ai rotoli di dado, che avvengono sulla super veloce CPU del computer
velocità. Se tiriamo un solo dado per fotogramma di animazione, non saremo in grado di eseguire un grande
numero di rotoli in un ragionevole lasso di tempo. Inoltre, per piccoli numeri di rotoli, sei
è improbabile che le percentuali di dadi convergono sul loro previsto 16,667% dei tiri totali.

Per vedere la legge dei grandi numeri in azione, puoi aumentare la velocità di esecuzione di
tirando il dado più volte per fotogramma dell'animazione. Considera il seguente comando:

ipython RollDieDynamic.py 10000600

In questo caso, FuncAnimation chiamerà la nostra funzione di aggiornamento 10.000 volte, eseguendo
600 rotoli per cornice per un totale di 6.000.000 rotoli. Sul nostro sistema, ci sono voluti circa 5,55
minuti (10.000 fotogrammi / 30 fotogrammi al secondo / 60 secondi al minuto), ma
visualizzato circa 18.000 rulli al secondo (30 fotogrammi al secondo * 600 rulli
perframe), così abbiamo potuto vedere rapidamente le frequenze e le percentuali convergere sui loro
valori attesi di circa 1.000.000 di rotoli per faccia e 16,667% per faccia.

Sperimenta con il numero di rotoli e fotogrammi finché non senti che il programma è
aiutandoti a visualizzare i risultati nel modo più efficace. È divertente e istruttivo guardarlo
esegui e modificalo finché non sei soddisfatto della qualità dell'animazione.

Esecuzioni di esempio

Abbiamo acquisito le seguenti quattro schermate durante ciascuna delle due esecuzioni di esempio. Nel
il primo, le schermate mostrano il grafico dopo appena 64 tiri di dado, poi di nuovo dopo 604 di
6000 tiri di dado totali. Esegui questo script dal vivo per vedere nel tempo come si aggiornano le barre
dinamicamente. Nella seconda esecuzione, le catture dello schermo mostrano il grafico dopo 7200
tiri di dado e di nuovo dopo 166.200 dei 6.000.000 di tiri. Con più rotoli, puoi
vedere le percentuali che si avvicinano ai valori attesi del 16,667% come previsto dal
legge dei grandi numeri.

Pagina 252
.4.2 Implementazione di una visualizzazione dinamica
Lo script che presentiamo in questa sezione utilizza le stesse funzionalità di Seaborn e Matplotlib
mostrato nella sezione Intro to Data Science del capitolo precedente. Abbiamo riorganizzato il codice
da utilizzare con le capacità di animazione di Matplotlib .

Importazione del modulo di animazione Matplotlib

Ci concentriamo principalmente sulle nuove funzionalità utilizzate in questo esempio. La riga 3 importa il file
Modulo di animazione Matplotlib.

lecca qui per visualizzare l'immagine del codice

1 # RollDieDynamic.py

6
C

2 "" "Rappresentazione grafica dinamica delle frequenze dei lanci di dadi." "" Pagina 253
3 da matplotlib importazione di animazione
4 importa matplotlib.pyplot come plt
5 importazione casuale
6 import Seaborn come sns
7 import sys
8

Aggiornamento delle funzioni

Le righe 9–27 definiscono la funzione di aggiornamento che FuncAnimation chiama una volta per animazione

telaio. Questa funzione deve fornire almeno un argomento. Le righe 9-10 mostrano il file
inizio della definizione della funzione. I parametri sono:

frame_number: il valore successivo dall'argomento frames di FuncAnimation,


di cui parleremo tra poco. Sebbene FuncAnimation richieda l'aggiornamento
funzione per avere questo parametro, non lo usiamo in questa funzione di aggiornamento.

tiri: il numero di tiri di dado per fotogramma dell'animazione.

facce: i valori delle facce della fustella utilizzati come etichette lungo l' asse x del grafico .
frequenze: l'elenco in cui riassumiamo le frequenze dello stampo.

Discuteremo il resto del corpo della funzione nelle prossime sottosezioni.

lecca qui per visualizzare l'immagine del codice

9 aggiornamento def (frame_number, roll, faces, frequencies):


10 "" "Configura i contenuti del grafico a barre per ogni fotogramma dell'animazione." ""

Aggiornamento delle funzioni: lancio del dado e aggiornamento dell'elenco delle frequenze

Le linee 12-13 tirano i tempi di lancio del dado e incrementano le frequenze appropriate

elemento per ogni rotolo. Nota che sottraiamo 1 dal valore del dado (da 1 a 6) prima
incrementando l'elemento frequenze corrispondenti, come vedrai, frequenze

è un elenco di sei elementi (definito nella riga 36), quindi i suoi indici vanno da 0 a 5.

lecca qui per visualizzare l'immagine del codice

11 # lancia il dado e aggiorna le frequenze


12 per i in gamma (rotoli):

13 frequenze [random.randrange ( 1 , 7 ) 1 ] + = 1 Pagina 254


14

Aggiornamento delle funzioni: configurazione del grafico a barre e del testo

Linea 16 in aggiornamento chiamate di funzione del modulo matplotlib.pyplot CLA (assi chiare)

per rimuovere gli elementi del grafico a barre esistenti prima di disegnarne di nuovi per il file
fotogramma di animazione corrente. Abbiamo discusso il codice nelle righe 17–27 nel precedente
sezione Intro to Data Science del capitolo. Le righe 17-20 creano le barre, impostano il grafico a barre
titolo, impostare le x ed y asse etichette e scalare la trama per fare spazio per la frequenza e
testo percentuale sopra ogni barra. Le righe 23–27 visualizzano la frequenza e il testo percentuale.

lecca qui per visualizzare l'immagine del codice

15 # riconfigurare il grafico per le frequenze del die aggiornate


16 plt.cla () # cancella i vecchi contenuti della figura corrente
17 assi = sns. barplot (facce, frequenze, tavolozza = 'luminoso' ) # ne bar
18 axes.set_title (f 'Die Frequencies for {sum (frequencies) :,} Rolls' )
19 assi.set (xlabel = 'Die Value' , ylabel = 'Frequency' )
20 assi.set_ylim (top = max (frequenze) * 1.10 ) # scala asse y dello 0%
21
22 # frequenza di visualizzazione e percentuale sopra ogni patch (barra)
23 per bar, frequenza in zip (axes.patches, frequenze):
24 text_x = bar.get_x () + bar.get_width () / 2.0
25 text_y = bar.get_height ()
26 text = f ' {frequenza :,} \ n {frequenza / somma (frequenze) :. 3%}
27 assi.text (text_x, text_y, text, ha = 'center' , va = 'bottom' )
28

Variabili utilizzate per configurare il grafico e mantenere lo stato

Le righe 30 e 31 utilizzano l'elenco argv del modulo sys per ottenere la riga di comando dello script

argomenti. La riga 33 specifica lo stile "whitegrid" di Seaborn. La linea 34 chiama il

funzione figure del modulo matplotlib.pyplot per ottenere l'oggetto Figure in cui

FuncAnimation visualizza l'animazione. L'argomento della funzione è il titolo della finestra.


Come vedrai presto, questo è uno degli argomenti obbligatori di FuncAnimation. La riga 35 crea

un elenco contenente i valori delle facce 1–6 della fustella da visualizzare sull'asse x del grafico. La riga 36 crea
l'elenco delle frequenze a sei elementi con ogni elemento inizializzato a 0: lo aggiorniamo
i conteggi della lista con ogni tiro di dado.

lecca qui per visualizzare l'immagine del codice

29 # legge gli argomenti della riga di comando per il numero di frame e roll per frame

30 number_of_frames = int (sys.argv [ 1 ]) Pagina 255


31 rolls_per_frame = int (sys.argv [ 2 ])
32
33 sns.set_style ( 'whitegrid' ) # sfondo bianco con griglie grigie
34 figure = plt. Figure ( 'Rotolare un dado a sei facce' ) # Figura per l'animazione
35 valori = lista (intervallo ( 1 , 7 )) # facce dado per la visualizzazione sull'asse x
36 frequenze = [ 0 ] * 6 # elenco di sei elementi delle frequenze del dado
37

allingando la funzione FuncAnimation del modulo di animazione

Le righe 39–41 chiamano la funzione FuncAnimation del modulo di animazione Matplotlib a


aggiorna dinamicamente il grafico a barre. La funzione restituisce un oggetto che rappresenta il file
animazione. Sebbene non venga utilizzato in modo esplicito, è necessario memorizzare il riferimento al file
animazione; in caso contrario, Python termina immediatamente l'animazione e restituisce il suo file
memoria al sistema.

lecca qui per visualizzare l'immagine del codice

38 # configura e avvia l'animazione che richiama l'aggiornamento della funzione


39 die_animation = animation.FuncAnimation (
40 cifre, aggiorna, ripeti = False , frames = number_of_frames, interva =
41 farg = (rolls_per_frame, valori, frequenze))
42
43 plt. Mostra () # finestra di visualizzazione

FuncAnimation ha due argomenti obbligatori:

figura: l'oggetto Figura in cui visualizzare l'animazione e

aggiornamento: la funzione da chiamare una volta per fotogramma dell'animazione.

In questo caso, passiamo anche i seguenti argomenti di parole chiave opzionali:

ripeti: Falso termina l'animazione dopo il numero di fotogrammi specificato. Se

True (impostazione predefinita), quando l'animazione viene completata, viene riavviata dall'inizio.

frames : il numero totale di frame di animazione, che controlla quante volte


FunctAnimation chiama update. Passare un numero intero equivale a passare un file
intervallo: ad esempio, 600 significa intervallo (600). FuncAnimation passa un valore
da questo intervallo come primo argomento in ogni chiamata da aggiornare.

C
C
Pagina 256
intervallo : il numero di millisecondi (33, in questo caso) tra l'animazione
frame (il valore predefinito è 200). Dopo ogni chiamata per l'aggiornamento, FuncAnimation attende 33
millisecondi prima di effettuare la chiamata successiva.

fargs (abbreviazione di " function arguments") - Una tupla di altri argomenti da passare a
funzione specificata nel secondo argomento di FuncAnimation. Gli argomenti tu
specificati nella tupla fargs corrispondono ai parametri di aggiornamento roll, faces e
frequenze (riga 9).

Per un elenco degli altri argomenti facoltativi di FuncAnimation, vedere

ttps: //matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html

Infine, la riga 43 mostra la finestra.

6.5 WRAP-UP
In questo capitolo, abbiamo discusso il dizionario di Python e le raccolte di set. Abbiamo detto cosa a
dizionario è e ha presentato diversi esempi. Abbiamo mostrato la sintassi delle coppie chiave-valore
e ha mostrato come usarli per creare dizionari con elenchi di chiavi separati da virgole–
coppie di valori tra parentesi graffe, {}. Hai anche creato dizionari con dizionario

comprensioni.

Hai utilizzato le parentesi quadre, [], per recuperare il valore corrispondente a una chiave e per inserire
e aggiorna le coppie chiave-valore. Hai anche utilizzato l'aggiornamento del metodo del dizionario per modificare un file

valore associato alla chiave. Hai ripetuto le chiavi, i valori e gli elementi di un dizionario.

Hai creato serie di valori immutabili univoci. Hai confrontato i set con il confronto
operatori, insiemi combinati con operatori e metodi di insieme, valori di insiemi modificati con l'estensione
operazioni sugli insiemi mutabili e insiemi creati con comprensioni di insiemi Hai visto che i set lo sono
mutevole. I Frozenset sono immutabili, quindi possono essere usati come elementi set e Frozenset.

Nella sezione Introduzione alla scienza dei dati, abbiamo continuato la nostra introduzione alla visualizzazione di
presentando la simulazione del dierolling con un grafico a barre dinamico per rendere la legge del grande
numeri "prendono vita". Inoltre, alle funzionalità Seaborn e Matplotlib mostrate in
Nella sezione Intro to Data Science del capitolo precedente, abbiamo utilizzato FuncAnimation di Matplotlib
funzione per controllare un'animazione frameebyframe. FuncAnimation ha chiamato una funzione we

definito che specifica cosa visualizzare in ogni fotogramma dell'animazione.

Pagina 257
Nel prossimo capitolo, discuteremo della programmazione orientata agli array con il popolare NumPy
biblioteca. Come vedrai, la raccolta ndarray di NumPy può contenere fino a due ordini di
magnitude più veloce rispetto all'esecuzione di molte delle stesse operazioni con il builtin di Python
elenchi. Questa potenza tornerà utile per le odierne applicazioni Big Data.
io
Pagina 258

Playlist

storia . Programmazione orientata agli array con NumPy


Obiettivi
opiche

In questo capitolo potrai:


guadagnando Pat

Scopri come gli array differiscono dagli elenchi.


ffers & Dea

Usa gli ndarrays ad alte prestazioni del modulo numpy.


ighlights

Confronta le prestazioni di elenco e ndarray con IPython% timeit magic.


ettings

Usa ndarrays per archiviare e recuperare i dati in modo efficiente.


Supporto

Crea e inizializza ndarrays.


Disconnessione

Fare riferimento ai singoli elementi ndarray.

Scorri tra gli ndarrays.

Crea e manipola ndarrays multidimensionali.

Eseguire comuni manipolazioni ndarray.

Crea e manipola i panda in serie monodimensionali e bidimensionali

DataFrames.

Personalizza gli indici di serie e DataFrame.

Calcola le statistiche descrittive di base per i dati in una serie e in un DataFrame.


Personalizza la precisione del numero in virgola mobile nella formattazione dell'output dei panda.

Contorno

7
Pagina 259
.1 Introduzione

.2 Creazione di array da dati esistenti

.3 attributi array

.4 Riempimento di array con valori specifici

.5 Creazione di array da intervalli

.6 Prestazioni tra elenchi e array: presentazione di% timeit

.7 Operatori di array

.8 Metodi di calcolo NumPy

.9 Funzioni universali

.10 Indicizzazione e sezionamento

.11 Visualizzazioni: copie poco profonde

.12 Copie profonde

.13 Rimodellamento e trasposizione

.14 Introduzione alla scienza dei dati: panda Series e DataFrame

.14.1 Serie panda

.14.2 DataFrame

.15 WrapUp

7.1 INTRODUZIONE
La libreria NumPy (Numerical Python) è apparsa per la prima volta nel 2006 ed è la preferita
Implementazione di array Python. Offre un elevato rendimento, riccamente funzionale n
tipo di array dimensionale chiamato ndarray , a cui da questo punto in avanti faremo riferimento con

il suo sinonimo, array. NumPy è una delle tante librerie opensource che il
La distribuzione di Anaconda Python viene installata. Le operazioni sugli array sono fino a due ordini di

7
Pagina 260
magnitudo più veloce di quelle sugli elenchi. In un mondo bigdata in cui le applicazioni possono funzionare
enormi quantità di elaborazione su grandi quantità di dati basati su array, questa prestazione
il vantaggio può essere critico. Secondo libraries.io, oltre 450 librerie Python

dipendono da NumPy. Molte popolari biblioteche di data science come Pandas, SciPy
(Scientific Python) e Keras (per il deep learning) sono basati o dipendono da NumPy.
In questo capitolo, esploriamo le funzionalità di base dell'array. Gli elenchi possono avere più file
dimensioni. In genere si elaborano elenchi multidimensionali con loop o elenchi nidificati
comprensioni con clausole for multiple. Un punto di forza di NumPy è "orientato all'array"

programmazione ", che utilizza la programmazione in stile funzionale con iterazione interna a
rendere le manipolazioni degli array concise e dirette, eliminando i tipi di bug
ciò può verificarsi con l' iterazione esterna di cicli programmati esplicitamente.

Nella sezione Intro to Data Science di questo capitolo, iniziamo la nostra introduzione multisezione
alla libreria panda che utilizzerai in molti dei capitoli dei case study di data science. Grande
le applicazioni dati spesso necessitano di raccolte più flessibili rispetto agli array di NumPy—
raccolte che supportano tipi di dati misti, indicizzazione personalizzata, dati mancanti, dati
non strutturati in modo coerente e dati che devono essere manipolati in forme
appropriato per i database e i pacchetti di analisi dei dati utilizzati. Ti presenteremo
panda arraylike serie unidimensionale e DataFrame bidimensionali e
iniziare a dimostrare le loro potenti capacità. Dopo aver letto questo capitolo, lo sarai
familiarità con quattro raccolte simili ad array: elenchi, array, serie e DataFrame.

Aggiungeremo un quinto - tensori - nel capitolo "Apprendimento profondo".

7.2 CREAZIONE DI ARRAY DA DATI ESISTENTI


La documentazione di NumPy consiglia di importare il modulo numpy come np in modo che
puoi accedere ai suoi membri con "np.":

In [1]: importa numpy come np

Il modulo numpy fornisce varie funzioni per la creazione di array. Qui usiamo il

funzione array , che riceve come argomento un array o un'altra raccolta di file
elementi e restituisce un nuovo array contenente gli elementi dell'argomento. Passiamo a
elenco:

lecca qui per visualizzare l'immagine del codice

In [2]: numbers = np.array ([ 2 , 3 , 5 , 7 , 11 ])

C
Pagina 261
La funzione array copia il contenuto del suo argomento nell'array. Diamo un'occhiata al file
tipo di oggetto restituito dall'array di funzioni e visualizzarne il contenuto:

lecca qui per visualizzare l'immagine del codice

In [3]: digitare (numeri)


Out [3]: numpy.ndarray

In [4]: ​numeri
Uscita [4]: ​array ([2, 3, 5, 7, 11])

Nota che il tipo è numpy.ndarray, ma tutti gli array vengono visualizzati come "array". quando
emettendo un array, NumPy separa ogni valore dal successivo con una virgola e a
spazio e rightaligns tutti i valori usando la stessa larghezza del campo. Determina il campo
larghezza in base al valore che occupa il maggior numero di posizioni dei caratteri. Nel
in questo caso, il valore 11 occupa le due posizioni dei caratteri, quindi tutti i valori lo sono

formattato in campi a due caratteri. Ecco perché c'è uno spazio iniziale tra [e

2.

Argomenti multidimensionali
La funzione array copia le dimensioni del suo argomento. Creiamo un array da un file
elenco due volte per tre colonne:

lecca qui per visualizzare l'immagine del codice

In [5]: np.array ([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]])


Fuori [5]:
matrice ([[1, 2, 3],
[4, 5, 6]])

NumPy autoformatta gli array, in base al loro numero di dimensioni, allineando il file

colonne all'interno di ogni riga.

7.3 ARRAY ATTRIBUTI


Un oggetto array fornisce attributi che consentono di scoprire informazioni su di esso
struttura e contenuti. In questa sezione useremo i seguenti array:

lecca qui per visualizzare l'immagine del codice

C
Pagina 262
In [1]: importa numpy come np

In [2]: numeri interi = np.array ([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]])

In [3]: numeri interi


Fuori [3]:
matrice ([[1, 2, 3],
[4, 5, 6]])

In [4]: ​floats = np.array ([ 0.0 , 0.1 , 0.2 , 0.3 , 0.4 ])

In [5]: floats
Uscita [5]: array ([0., 0.1, 0.2, 0.3, 0.4])

NumPy non visualizza gli 0 finali a destra del separatore decimale in virgola mobile
valori.

Determinazione del tipo di elemento di un array

La funzione array determina il tipo di elemento di un array dagli elementi del suo argomento.
Puoi controllare il tipo di elemento con l' attributo dtype di un array :

lecca qui per visualizzare l'immagine del codice

In [6]: integers.dtype
Uscita [6]: dtype ('int64') # int32 su alcune piattaforme

In [7]: floats.dtype
Uscita [7]: dtype ('float64')

Come vedrai nella prossima sezione, varie funzioni di creazione di array ricevono un dtype
argomento della parola chiave in modo da poter specificare il tipo di elemento di un array.

Per motivi di prestazioni, NumPy è scritto nel linguaggio di programmazione C e utilizza


Tipi di dati di C. Per impostazione predefinita, NumPy memorizza interi come valori int64 di tipo NumPy—

che corrispondono a interi a 64 bit (8 byte) in C e memorizzano i numeri in virgola mobile


come valori float64 di tipo NumPy, che corrispondono a 64 bit (8 byte) mobili

valori in punti in C.Nei nostri esempi, più comunemente vedrai i tipi int64,
float64, bool (per Boolean) e object per dati non numerici (come le stringhe). Il
l'elenco completo dei tipi supportati è a

ttps: //docs.scipy.org/doc/numpy/user/basics.types.html .

Determinazione delle dimensioni di un array

hC
Pagina 263
L'attributo ndim contiene il numero di dimensioni e l'attributo di un array

shape contiene una tupla che specifica le dimensioni di un array:

lecca qui per visualizzare l'immagine del codice

In [8]: integers.ndim
Fuori [8]: 2

In [9]: floats.ndim
Fuori [9]: 1

In [10]: integers.shape
Uscita [10]: (2, 3)

In [11]: floats.shape
Uscita [11]: (5,)

Qui, gli interi hanno 2 righe e 3 colonne (6 elementi) e float è uno


dimensionale, quindi lo snippet [11] mostra una tupla di un elemento (indicata dalla virgola)

contenente il numero di elementi float (5).

Determinazione del numero di elementi e della dimensione degli elementi di un array

È possibile visualizzare il numero totale di elementi di un array con la dimensione dell'attributo e l' estensione
numero di byte richiesti per memorizzare ogni elemento con itemize :

lecca qui per visualizzare l'immagine del codice

In [12]: integers.size
Fuori [12]: 6

In [13]: integers.itemsize # 4 se il compilatore C usa int a 32 bit


Uscita [13]: 8

In [14]: floats.size
Fuori [14]: 5

In [15]: floats.itemsize
Fuori [15]: 8

Si noti che la dimensione dei numeri interi è il prodotto dei valori della tupla della forma, due righe di

tre elementi ciascuno per un totale di sei elementi. In ogni caso, la dimensione dell'articolo è 8 perché

interi contiene valori int64 e float contiene valori float64, ciascuno dei quali
occupano 8 byte.

io
C terating Attraverso gli elementi di un array multidimensionale

Iterazione attraverso gli elementi di un array multidimensionale Pagina 264

Generalmente manipolerai gli array usando una programmazione concisa in stile funzionale
tecniche. Tuttavia, poiché gli array sono iterabili , è possibile utilizzare l'iterazione esterna se

ti piacerebbe:
lecca qui per visualizzare l'immagine del codice

In [16]: per riga in numeri interi:


...: per colonna nella riga:
...: print (colonna, fine = '' )
...: Stampa()
...:
123
456

È possibile iterare attraverso un array multidimensionale come se fosse monodimensionale da


usando il suo attributo flat :

lecca qui per visualizzare l'immagine del codice

In [17]: for i in integers.flat:


...: print (i, end = '' )
...:
123456

7.4 RIEMPIMENTO DI ARRAY CON VALORI SPECIFICI


NumPy fornisce funzioni zeri , uno e full per la creazione di array contenenti 0,

1s o un valore specificato, rispettivamente. Per impostazione predefinita, zero e uno creano array
contenente valori float64. Mostreremo come personalizzare il tipo di elemento

momentaneamente. Il primo argomento di queste funzioni deve essere un numero intero o una tupla di
numeri interi che specificano le dimensioni desiderate. Per un numero intero, ogni funzione restituisce uno
matrice dimensionale con il numero di elementi specificato:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: np.zeros ( 5 )
Uscita [2]: array ([0., 0., 0., 0., 0.])

C
Pagina 265
Per una tupla di numeri interi, queste funzioni restituiscono un array multidimensionale con l'estensione
dimensioni specificate. È possibile specificare il tipo di elemento dell'array con gli zeri e

argomento della parola chiave dtype della funzione one:

lecca qui per visualizzare l'immagine del codice

In [3]: np.ones (( 2 , 4 ), dtype = int)


Fuori [3]:
matrice ([[1, 1, 1, 1],
[1, 1, 1, 1]])

L'array restituito da full contiene elementi con il valore del secondo argomento e

genere:

lecca qui per visualizzare l'immagine del codice

In [4]: ​np.full (( 3 , 5 ), 13 )
Fuori [4]:
matrice ([[13, 13, 13, 13, 13],
[13, 13, 13, 13, 13],
[13, 13, 13, 13, 13]])
7.5 CREAZIONE DI ARRAY DA GAMME
NumPy fornisce funzioni ottimizzate per la creazione di array da intervalli. Ci concentriamo su
semplici intervalli interi e in virgola mobile equidistanti, ma NumPy supporta anche
1
intervalli non lineari.

1
ttps: //docs.scipy.org/doc/numpy/reference/routines.array
reation.html .

Creazione di intervalli interi con arange

Usiamo la funzione arange di NumPy per creare intervalli interi, in modo simile all'utilizzo di builtin
gamma di funzioni. In ogni caso, arange determina prima il numero dell'array risultante

di elementi, alloca la memoria, quindi memorizza l'intervallo di valori specificato nel file

Vettore:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

cC
h
In [2]: np.arange ( 5 ) Pagina 266
Uscita [2]: array ([0, 1, 2, 3, 4])

In [3]: np.arange ( 5 , 10 )
Uscita [3]: array ([5, 6, 7, 8, 9])

In [4]: ​np.arange ( 10 , 1 , 2 )
Uscita [4]: ​array ([10, 8, 6, 4, 2])

Sebbene sia possibile creare array passando intervalli come argomenti, utilizzare sempre arange

poiché è ottimizzato per gli array. Presto mostreremo come determinare il tempo di esecuzione di
varie operazioni in modo da poter confrontare le loro prestazioni.

Creazione di intervalli in virgola mobile con linspace

Puoi produrre intervalli di virgola mobile equidistanti con linspace di NumPy

funzione. I primi due argomenti della funzione specificano i valori iniziale e finale in
l'intervallo e il valore finale è incluso nella matrice. La parola chiave facoltativa

l'argomento num specifica il numero di valori equidistanti da produrre: questo


il valore predefinito dell'argomento è 50:

lecca qui per visualizzare l'immagine del codice

In [5]: np.linspace ( 0.0 , 1.0 , num = 5 )


Uscita [5]: array ([0., 0.25, 0.5, 0.75, 1.])

Rimodellare un array

Puoi anche creare un array da un intervallo di elementi, quindi utilizzare il metodo array

rimodellare per trasformare la matrice unidimensionale in una matrice multidimensionale. Andiamo


creare un array contenente i valori da 1 a 20, quindi rimodellarlo in quattro
righe per cinque colonne:

lecca qui per visualizzare l'immagine del codice

In [6]: np.arange ( 1 , 21 ) .reshape ( 4 , 5 )


Fuori [6]:
matrice ([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])

Notare le chiamate al metodo concatenate nello snippet precedente. Innanzitutto, arange produce un file

C
Pagina 267
matrice contenente i valori 1–20. Quindi chiamiamo reshape su quell'array per ottenere il 4
by5 array visualizzato.

Puoi rimodellare qualsiasi matrice, a condizione che la nuova forma abbia lo stesso numero di file
elementi come l'originale. Quindi un array monodimensionale a sei elementi può diventare un 3by2

o 2by3 array e viceversa, ma tentando di rimodellare un array di 15 elementi in un file


4by4 array (16 elementi) provoca un ValueError.

Visualizzazione di array di grandi dimensioni

Quando si visualizza un array, se ci sono 1000 o più elementi, NumPy lascia il centro

righe, colonne o entrambe dall'output. I seguenti frammenti generano 100.000


elementi. Il primo caso mostra tutte e quattro le righe ma solo la prima e le ultime tre dei file
25.000 colonne. La notazione ... rappresenta i dati mancanti. Il secondo caso mostra
la prima e l'ultima tre delle 100 righe e le prime e le ultime tre delle 1000 colonne:

lecca qui per visualizzare l'immagine del codice

In [7]: np.arange ( 1 , 100001 ) .reshape ( 4 , 25000 )


Fuori [7]:
matrice ([[1, 2, 3, ..., 24998, 24999, 25000],
[25001, 25002, 25003, ..., 49998, 49999, 50000],
[50001, 50002, 50003, ..., 74998, 74999, 75000],
[75001, 75002, 75003, ..., 99998, 99999, 100000]])

In [8]: np.arange ( 1 , 100001 ) .reshape ( 100 , 1000 )


Fuori [8]:
matrice ([[1, 2, 3, ..., 998, 999, 1000],
[1001, 1002, 1003, ..., 1998, 1999, 2000],
[2001, 2002, 2003, ..., 2998, 2999, 3000],
...,
[97001, 97002, 97003, ..., 97998, 97999, 98000],
[98001, 98002, 98003, ..., 98998, 98999, 99000],
[99001, 99002, 99003, ..., 99998, 99999, 100000]])

7.6 ELENCO VS. PRESTAZIONI DI ARRAY: INTRODUZIONE


% TIMEIT
La maggior parte delle operazioni sugli array viene eseguita molto più velocemente delle operazioni sugli elenchi corrispondenti.
Per dimostrare, useremo il comando magico IPython % timeit , che moltiplicherà il
durata media delle operazioni. Tieni presente che i tempi visualizzati sul tuo sistema possono variare
da quello che mostriamo qui.

T
C iming la creazione di una lista contenente i risultati di 6.000.000 di dadi

Cronometrare la creazione di un elenco contenente i risultati di 6.000.000 di dadi Pagina 268

Abbiamo dimostrato di lanciare un dado a sei facce 6.000.000 di volte. Qui, usiamo il random

la funzione randrange del modulo con una lista di comprensione per creare una lista di sei milioni

il dado rotola e calcola l'operazione utilizzando% timeit. Nota che abbiamo usato la linea
carattere di continuazione (\) per dividere l'istruzione nello snippet [2] su due righe:
lecca qui per visualizzare l'immagine del codice

In [1]: importa casuale

In [2]:% timeit rolls_list = \


...: [random.randrange ( 1 , 7 ) for i in range ( 0 , 6_000_000 )]
6,29 s ± 119 ms per loop (media ± dev. Std. Di 7 analisi, 1 loop ciascuna)

Per impostazione predefinita,% timeit esegue un'istruzione in un ciclo e lo esegue sette volte. Se
non indichi il numero di loop,% timeit sceglie un valore appropriato. Nel nostro

test, operazioni che in media hanno richiesto più di 500 millisecondi ripetute solo una volta,
e le operazioni che hanno richiesto meno di 500 millisecondi sono state ripetute 10 volte o più.

Dopo aver eseguito l'istruzione,% timeit mostra l' esecuzione media dell'istruzione

tempo, così come la deviazione standard di tutte le esecuzioni. In media,% timeit


indica che sono stati necessari 6,29 secondi per creare l'elenco con una deviazione standard di 119
millisecondi (ms). In totale, lo snippet precedente ha impiegato circa 44 secondi per eseguire il file

snippet sette volte.

Cronometrare la creazione di una matrice contenente i risultati di 6.000.000 di die


rotoli

Ora, usiamo la funzione randint dal modulo numpy.random per creare un file

serie di 6.000.000 di dado

lecca qui per visualizzare l'immagine del codice

In [3]: importa numpy come np

In [4]:% timeit rolls_array = np.random.randint ( 1 , 7 , 6_000_000 )


72,4 ms ± 635 µs per loop (media ± dev. Std. Di 7 analisi, 10 loop ciascuna)

In media,% timeit indica che ci sono voluti solo 72,4 millisecondi con uno standard
deviazione di 635 microsecondi (µs) per creare l'array. In totale, lo snippet precedente

ha impiegato poco meno di mezzo secondo per essere eseguito sul nostro computer, circa 1/100 del tempo

C
Pagina 269
snippet [2] richiesto per l'esecuzione. L'operazione è due ordini di grandezza più veloce con

Vettore!

60.000.000 e 600.000.000 di dadi

Ora creiamo un array di 60.000.000 di tiri di dado:

lecca qui per visualizzare l'immagine del codice

In [5]:% timeit rolls_array = np.random.randint ( 1 , 7 , 60_000_000 )


873 ms ± 29,4 ms per loop (media ± dev. Std. Di 7 analisi, 1 loop ciascuna)

In media, sono stati necessari solo 873 millisecondi per creare l'array.

Infine, facciamo 600.000.000 milioni di tiri di dado:

lecca qui per visualizzare l'immagine del codice

In [6]:% timeit rolls_array = np.random.randint ( 1 , 7 , 600_000_000 )


10,1 s ± 232 ms per loop (media ± dev. Std. Di 7 analisi, 1 loop ciascuna)
Ci sono voluti circa 10 secondi per creare 600.000.000 di elementi con NumPy contro circa 6
secondi per creare solo 6.000.000 di elementi con una comprensione della lista.

Sulla base di questi studi sui tempi, è possibile vedere chiaramente perché gli array sono preferiti agli elenchi

per operazioni ad alta intensità di calcolo. Negli studi di casi di data science, inseriremo il file
mondi ad alta intensità di big data e AI. Vedremo come l'hardware intelligente,
software, comunicazioni e progetti di algoritmi si combinano per soddisfare le esigenze spesso enormi
sfide informatiche delle applicazioni odierne.

Personalizzazione delle iterazioni% timeit

Il numero di iterazioni all'interno di ogni ciclo% timeit e il numero di cicli sono

personalizzabile con le opzioni n e r. Quanto segue esegue lo snippet [4]


2
istruzione tre volte per ciclo ed esegue il ciclo due volte:

2
Per la maggior parte dei lettori, l'uso delle impostazioni predefinite di% timeit dovrebbe andare bene.

lecca qui per visualizzare l'immagine del codice

In [7]:% timeit n 3 r 2 rolls_array = np.random.randint ( 1 , 7 , 6_000_000 )


85,5 ms ± 5,32 ms per loop (media ± dev. Std. Di 2 analisi, 3 loop ciascuna)

C
Pagina 270

Altri IPython Magics

IPython fornisce dozzine di magie per una varietà di attività: per un elenco completo, vedere il
3
Documentazione di IPython magics. Eccone alcuni utili:

ttp: //ipython.readthedocs.io/en/stable/interactive/magics.html .

% di carico per leggere il codice in IPython da un file locale o da un URL.

% salva per salvare i frammenti in un file.

% run per eseguire un file .py da IPython.

% di precisione per modificare la precisione in virgola mobile predefinita per gli output IPython.

% cd per cambiare directory senza dover prima uscire da IPython.

% edit per avviare un editor esterno, utile se è necessario apportare modifiche più complesse
frammenti.

% history per visualizzare un elenco di tutti gli snippet e i comandi che hai eseguito nel file
sessione IPython corrente.

7.7 OPERATORI ARRAY


NumPy fornisce molti operatori che ti consentono di scrivere semplici espressioni che
eseguire operazioni su interi array. Qui, dimostriamo l'aritmetica tra

matrici e valori numerici e tra matrici della stessa forma.

Operazioni aritmetiche con array e valori numerici individuali

Per prima cosa, eseguiamo operazioni aritmetiche per elementi con array e valori numerici utilizzando
operatori aritmetici e assegnazioni aumentate. Vengono applicate le operazioni elementwise
a ogni elemento, quindi lo snippet [4] moltiplica ogni elemento per 2 e lo snippet [5] cubi
ogni elemento. Ciascuno restituisce un nuovo array contenente il risultato:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

hC
Pagina 271
In [2]: numbers = np.arange ( 1 , 6 )

In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])

In [4]: ​numeri * 2
Uscita [4]: ​array ([2, 4, 6, 8, 10])

In [5]: numeri ** 3
Uscita [5]: array ([1, 8, 27, 64, 125])

In [6]: numbers # numbers è invariato dagli operatori aritmetici


Uscita [6]: array ([1, 2, 3, 4, 5])

Il frammento [6] mostra che gli operatori aritmetici non hanno modificato i numeri. Operatori +
e * sono commutativi , quindi lo snippet [4] potrebbe anche essere scritto come 2 * numeri.

Le assegnazioni aumentate modificano ogni elemento nell'operando sinistro.

lecca qui per visualizzare l'immagine del codice

In [7]: numeri + = 10

In [8]: numeri
Uscita [8]: array ([11, 12, 13, 14, 15])

Trasmissione

Normalmente, le operazioni aritmetiche richiedono come operandi due array della stessa dimensione
e forma . Quando un operando è un valore singolo, chiamato scalare , NumPy esegue il
calcoli elementwise come se lo scalare fosse un array della stessa forma dell'altro
operando, ma con il valore scalare in tutti i suoi elementi. Questo si chiama trasmissione .
Gli snippet [4], [5] e [7] utilizzano ciascuno questa funzionalità. Ad esempio, lo snippet [4] è
equivalente a:

lecca qui per visualizzare l'immagine del codice

numeri * [ 2 , 2 , 2 , 2 , 2 ]

La trasmissione può anche essere applicata tra array di diverse dimensioni e forme,

consentendo alcune manipolazioni concise e potenti. Mostreremo più esempi di


trasmissione più avanti nel capitolo, quando introdurremo le funzioni universali di NumPy.

UN
C Operazioni ritmetiche tra array

Operazioni aritmetiche tra array Pagina 272

È possibile eseguire operazioni aritmetiche e assegnazioni aumentate tra array


della stessa forma. Moltiplichiamo i numeri degli array unidimensionali e

numbers2 (creato di seguito) che contengono ciascuno cinque elementi:


lecca qui per visualizzare l'immagine del codice

In [9]: numbers2 = np.linspace ( 1.1 , 5.5 , 5 )

In [10]: numbers2
Uscita [10]: array ([1.1, 2.2, 3.3, 4.4, 5.5])

In [11]: numeri * numeri2


Uscita [11]: array ([12.1, 26.4, 42.9, 61.6, 82.5])

Il risultato è un nuovo array formato moltiplicando gli array per elemento in ciascuno
operando: 11 * 1.1, 12 * 2.2, 13 * 3.3, ecc. Aritmetica tra array di numeri interi

e i numeri in virgola mobile danno come risultato una matrice di numeri in virgola mobile.

Confronto di array

È possibile confrontare array con valori individuali e con altri array. Confronti
vengono eseguite elementwise . Tali confronti producono matrici di valori booleani in

il cui valore True o False di ogni elemento indica il risultato del confronto:

lecca qui per visualizzare l'immagine del codice

In [12]: numeri
Uscita [12]: array ([11, 12, 13, 14, 15])

In [13]: numeri> = 13
Out [13]: array ([False, False, True, True, True])

In [14]: numbers2
Uscita [14]: array ([1.1, 2.2, 3.3, 4.4, 5.5])

In [15]: numbers2 <numbers


Out [15]: array ([True, True, True, True, True])

In [16]: numeri == numeri2


Out [16]: array ([False, False, False, False, False])

In [17]: numeri == numeri


Out [17]: array ([True, True, True, True, True])

C
Pagina 273
Snippet [13] utilizza la trasmissione per determinare se ogni elemento di numeri è
maggiore o uguale a 13. Gli snippet rimanenti confrontano i corrispondenti
elementi di ogni operando array.

7.8 METODI DI CALCOLO DEL NUMERO


Un array dispone di vari metodi che eseguono calcoli utilizzando il suo contenuto. Per impostazione predefinita,
questi metodi ignorano la forma dell'array e utilizzano tutti gli elementi nei calcoli.

Ad esempio, il calcolo della media di un array totalizza tutti i suoi elementi indipendentemente dal suo
forma, quindi divide per il numero totale di elementi. Puoi eseguirli
calcoli anche su ogni dimensione. Ad esempio, in un array bidimensionale, tu
può calcolare la media di ogni riga e la media di ogni colonna.

Considera una matrice che rappresenta i voti di quattro studenti su tre esami:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: grades = np.array ([[ 87 , 96 , 70 ], [ 100 , 87 , 90 ],


...: [ 94 , 77 , 90 ], [ 100 , 81 , 82 ]])
...:

In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90],
[94, 77, 90],
[100, 81, 82]])

Possiamo usare metodi per calcolare somma , min , max , media , std (deviazione standard) e

var (varianza): ciascuna è una riduzione della programmazione in stile funzionale :

lecca qui per visualizzare l'immagine del codice

In [4]: ​grades.sum ()
Uscita [4]: ​1054

In [5]: grades.min ()
Uscita [5]: 70

In [6]: grades.max ()
Uscita [6]: 100

In [7]: grades.mean ()

Uscita [7]: 87.83333333333333 Pagina 274

In [8]: grades.std ()
Uscita [8]: 8.792357792739987

In [9]: grades.var ()
Uscita [9]: 77.30555555555556

Calcoli per riga o colonna

Molti metodi di calcolo possono essere eseguiti su dimensioni di array specifiche, note come
gli assi dell'array . Questi metodi ricevono un argomento della parola chiave dell'asse che specifica
quale dimensione utilizzare nel calcolo, offrendo un modo rapido per eseguire
calcoli per riga o colonna in un array bidimensionale.

Supponi di voler calcolare il voto medio di ogni esame , rappresentato dal


colonne di voti. Specificando axis = 0 si esegue il calcolo su tutti i valori di riga

all'interno di ogni colonna:

lecca qui per visualizzare l'immagine del codice

In [10]: grades.mean (axis = 0 )


Out [10]: array ([95.25, 85.25, 83.])

Quindi 95.25 sopra è la media dei voti della prima colonna (87, 100, 94 e 100),

85.25 è la media dei voti della seconda colonna (96, 87, 77 e 81) e 83 è il
media dei voti della terza colonna (70, 90, 90 e 82). Ancora una volta, NumPy non lo fa

visualizzare gli 0 finali a destra del punto decimale in "83.". Nota anche che lo fa

visualizzare tutti i valori degli elementi nella stessa larghezza del campo, motivo per cui "83". è seguito da
due spazi.

Allo stesso modo, specificando axis = 1 si esegue il calcolo su tutti i valori di colonna all'interno

ogni singola riga. Possiamo calcolare il voto medio di ogni studente per tutti gli esami
uso:
lecca qui per visualizzare l'immagine del codice

In [11]: grades.mean (axis = 1 )


Uscita [11]: array ([84.33333333, 92.33333333, 87., 87.66666667])

Questo produce quattro medie, una per ciascuno dei valori in ogni riga. Quindi 84.33333333 è

C
Pagina 275
la media dei voti della riga 0 (87, 96 e 70) e le altre medie sono per il
righe rimanenti.

Gli array NumPy hanno molti più metodi di calcolo. Per l'elenco completo, vedere

ttps: //docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

7.9 FUNZIONI UNIVERSALI


NumPy offre dozzine di funzioni universali autonome (o ufunc ) che eseguono
varie operazioni elementwise. Ciascuno svolge il proprio compito utilizzando uno o due array o

argomenti simili ad array (come elenchi). Alcune di queste funzioni vengono chiamate quando usi
operatori come + e * sugli array. Ciascuno restituisce un nuovo array contenente i risultati.

Creiamo un array e calcoliamo la radice quadrata dei suoi valori, usando sqrt

funzione universale :

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: numbers = np.array ([ 1 , 4 , 9 , 16 , 25 , 36 ])

In [3]: np.sqrt (numeri)


Uscita [3]: array ([1., 2., 3., 4., 5., 6.])

Aggiungiamo due array con la stessa forma, utilizzando la funzione aggiungi universale:

lecca qui per visualizzare l'immagine del codice

In [4]: ​numbers2 = np.arange ( 1 , 7 ) * 10

In [5]: numbers2
Uscita [5]: array ([10, 20, 30, 40, 50, 60])

In [6]: np.add (numbers, numbers2)


Uscita [6]: array ([11, 24, 39, 56, 75, 96])

L'espressione np.add (numbers, numbers2) è equivalente a:

numeri + numeri 2

B
C roadcasting con funzioni universali
h

Trasmissione con funzioni universali Pagina 276

Usiamo la funzione moltiplica universale per moltiplicare ogni elemento di numeri2

dal valore scalare 5:

lecca qui per visualizzare l'immagine del codice


In [7]: np.multiply (numbers2, 5 )
Uscita [7]: matrice ([50, 100, 150, 200, 250, 300])

L'espressione np.multiply (numbers2, 5) è equivalente a:

numeri2 * 5

Rimodelliamo numbers2 in un array 2by3, quindi moltiplichiamo i suoi valori per uno
matrice dimensionale di tre elementi:

lecca qui per visualizzare l'immagine del codice

In [8]: numbers3 = numbers2.reshape ( 2 , 3 )

In [9]: numbers3
Fuori [9]:
matrice ([[10, 20, 30],
[40, 50, 60]])

In [10]: numbers4 = np.array ([ 2 , 4 , 6 ])

In [11]: np.multiply (numbers3, numbers4)


Fuori [11]:
matrice ([[20, 80, 180],
[80, 200, 360]])

Questo funziona perché numbers4 ha la stessa lunghezza di ogni riga di numbers3, quindi
NumPy può applicare l'operazione di moltiplicazione trattando numbers4 come se fosse il file

seguente matrice:

matrice ([[2, 4, 6],


[2, 4, 6]])

Se una funzione universale riceve due array di forme diverse che non supportano
broadcasting, si verifica un ValueError. Puoi visualizzare le regole di trasmissione su:

C
Pagina 277
ttps: //docs.scipy.org/doc/numpy/user/basics.broadcasting.html

Altre funzioni universali


La documentazione di NumPy elenca le funzioni universali in cinque categorie: matematica,
trigonometria, manipolazione dei bit, confronto e virgola mobile. La tabella seguente elenca
alcune funzioni di ciascuna categoria. Puoi visualizzare l'elenco completo, le loro descrizioni
e ulteriori informazioni sulle funzioni universali su:

ttps: //docs.scipy.org/doc/numpy/reference/ufuncs.html

NumPy funzioni universali

Matematica: aggiungi, sottrai, moltiplica, dividi, resto, exp, log, sqrt,

potenza e altro ancora.

Trigonometria: sin, cos, tan, hypot, arcsin, arccos, arctan e


Di Più.

Manipolazione di bit: bitwise_and, bitwise_or, bitwise_xor, invert,

shift_sinistra e shift_destra.

Confronto: maggiore, maggiore_uguale, minore, minore_uguale, uguale,

non_uguale, logico_e, logico_or, logico_xor, logico_not,

minimo, massimo e altro.

Virgola mobile: pavimento, soffitto, isinf, isnan, fabs, trunc e altro ancora.

7.10 INDICATRICE E AFFETTARE


Gli array monodimensionali possono essere indicizzati e suddivisi in sezioni utilizzando la stessa sintassi e
tecniche che abbiamo dimostrato nel capitolo "Sequenze: elenchi e tuple". Qui noi
concentrarsi sulle capacità di indicizzazione e sezionamento specifiche degli array.

Indicizzazione con array bidimensionali

Pagina 278
Per selezionare un elemento in un array bidimensionale, specificare una tupla contenente il
indici di riga e colonna dell'elemento tra parentesi quadre (come nello snippet [4]):

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: grades = np.array ([[ 87 , 96 , 70 ], [ 100 , 87 , 90 ],


...: [ 94 , 77 , 90 ], [ 100 , 81 , 82 ]])
...:

In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90],
[94, 77, 90],
[100, 81, 82]])

In [4]: ​voti [ 0 , 1 ] # riga 0, colonna 1


Uscita [4]: ​96

Selezione di un sottoinsieme di righe di un array bidimensionale

Per selezionare una singola riga, specificare solo un indice tra parentesi quadre:

lecca qui per visualizzare l'immagine del codice

In [5]: voti [ 1 ]
Uscita [5]: array ([100, 87, 90])

Per selezionare più righe sequenziali, utilizzare la notazione delle sezioni:

lecca qui per visualizzare l'immagine del codice

In [6]: voti [ 0 : 2 ]
Fuori [6]:
matrice ([[87, 96, 70],
[100, 87, 90]])

Per selezionare più righe non sequenziali, utilizzare un elenco di indici di riga:

In [7]: voti [[ 1 , 3 ]]
Fuori [7]:
matrice ([[100, 87, 90],
[100, 81, 82]])

C
Pagina 279

Selezione di un sottoinsieme di colonne di una matrice bidimensionale

È possibile selezionare sottoinsiemi delle colonne fornendo una tupla che specifica le righe e
colonna (e) da selezionare. Ciascuno può essere un indice specifico, una sezione o un elenco. Selezioniamo solo il file
elementi nella prima colonna:

lecca qui per visualizzare l'immagine del codice

In [8]: voti [:, 0 ]


Uscita [8]: array ([87, 100, 94, 100])

Lo 0 dopo la virgola indica che stiamo selezionando solo la colonna 0. Il: prima di
la virgola indica quali righe all'interno di quella colonna selezionare. In questo caso ,: è una fetta
che rappresenta tutte le righe. Potrebbe anche essere un numero di riga specifico, una sezione che rappresenta un file
sottoinsieme delle righe o un elenco di indici di riga specifici da selezionare, come negli snippet [5] - [7].

È possibile selezionare colonne consecutive utilizzando una sezione:

In [9]: voti [:, 1 : 3 ]


Fuori [9]:
matrice ([[96, 70],
[87, 90],
[77, 90],
[81, 82]])

o colonne specifiche utilizzando un elenco di indici di colonna:

In [10]: voti [:, [ 0 , 2 ]]


Fuori [10]:
matrice ([[87, 70],
[100, 90],
[94, 90],
[100, 82]])

7.11 VISUALIZZAZIONI: COPIE RIDOTTE


Il capitolo precedente ha introdotto gli oggetti di visualizzazione , ovvero gli oggetti che "vedono" i dati
altri oggetti, piuttosto che avere le proprie copie dei dati. Le viste sono copie superficiali.
Vari metodi di matrice e operazioni di suddivisione in sezioni producono visualizzazioni dei dati di un array.

La visualizzazione del metodo array restituisce un nuovo oggetto array con una visualizzazione dell'array originale

C
Pagina 280
dati dell'oggetto. Per prima cosa, creiamo un array e una vista di quell'array:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np


In [2]: numbers = np.arange ( 1 , 6 )

In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])

In [4]: ​numbers2 = numbers.view ()

In [5]: numbers2
Uscita [5]: array ([1, 2, 3, 4, 5])

Possiamo usare la funzione id incorporata per vedere che numeri e numeri2 sono diversi

oggetti:

In [6]: id (numeri)
Uscita [6]: 4462958592

In [7]: id (numbers2)
Uscita [7]: 4590846240

Per dimostrare che numbers2 visualizza gli stessi dati dei numeri, modifichiamo un elemento in

numeri, quindi visualizzare entrambi gli array:

lecca qui per visualizzare l'immagine del codice

In [8]: numeri [ 1 ] * = 10

In [9]: numbers2
Uscita [9]: array ([1, 20, 3, 4, 5])

In [10]: numeri
Uscita [10]: array ([1, 20, 3, 4, 5])

Allo stesso modo, la modifica di un valore nella vista cambia anche quel valore nell'array originale:

In [11]: numbers2 [ 1 ] / = 10

In [12]: numeri
Uscita [12]: array ([1, 2, 3, 4, 5])

In [13]: numbers2 Pagina 281


Uscita [13]: array ([1, 2, 3, 4, 5])

Vista in sezioni

Le sezioni creano anche viste. Facciamo di numbers2 una sezione che visualizzi solo i primi tre

elementi di numeri:

In [14]: numbers2 = numbers [ 0 : 3 ]


In [15]: numbers2
Uscita [15]: array ([1, 2, 3])

Di nuovo, possiamo confermare che i numeri e i numeri2 sono oggetti diversi con id:

In [16]: id (numeri)
Uscita [16]: 4462958592

In [17]: id (numbers2)
Uscita [17]: 4590848000
Possiamo confermare che numbers2 è una visualizzazione solo dei primi tre elementi di numeri
tentativo di accedere a numbers2 [3], che produce un IndexError:

lecca qui per visualizzare l'immagine del codice

In [18]: numbers2 [ 3 ]

IndexError Traceback (la chiamata più recente last


ipythoninput18582053f52daa> in <module> ()
> 1 numeri2 [ 3 ]

IndexError : l'indice 3 è fuori dai limiti per l'asse 0 con dimensione 3

Ora, modifichiamo un elemento condiviso da entrambi gli array, quindi visualizziamoli. Di nuovo, lo vediamo

numbers2 è una visualizzazione dei numeri:

lecca qui per visualizzare l'immagine del codice

In [19]: numeri [ 1 ] * = 20

In [20]: numeri
Uscita [20]: array ([1, 2, 3, 4, 5])

C
<

In [21]: numbers2 Pagina 282


Uscita [21]: array ([1, 40, 3])

7.12 COPIE PROFONDE


Sebbene le viste siano oggetti array separati , risparmiano memoria condividendo i dati degli elementi

da altri array. Tuttavia, quando si condividono valori mutabili , a volte è necessario


per creare una copia completa con copie indipendenti dei dati originali. Questo è specialmente
importante nella programmazione multicore, dove potrebbero essere parti separate del programma
tentare di modificare i propri dati allo stesso tempo, eventualmente corrompendoli.

La copia del metodo array restituisce un nuovo oggetto array con una copia completa dell'originale

dati dell'oggetto array. Per prima cosa, creiamo un array e una copia completa di quell'array:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: numbers = np.arange ( 1 , 6 )

In [3]: numeri
Uscita [3]: array ([1, 2, 3, 4, 5])

In [4]: ​numbers2 = numbers.copy ()

In [5]: numbers2
Uscita [5]: array ([1, 2, 3, 4, 5])

Per dimostrare che numbers2 ha una copia separata dei dati in numbers, modifichiamo un file
elemento in numeri, quindi visualizza entrambi gli array:

lecca qui per visualizzare l'immagine del codice

In [6]: numeri [ 1 ] * = 10

In [7]: numeri
Uscita [7]: array ([1, 20, 3, 4, 5])

In [8]: numbers2
Uscita [8]: array ([1, 2, 3, 4, 5])

Come puoi vedere, il cambiamento appare solo in numeri.

M
C Copia odule: copie superficiali e profonde per altri tipi di Python

Copia del modulo: copie superficiali e profonde per altri tipi di Python Pagina 283

Oggetti

Nei capitoli precedenti abbiamo trattato la copia superficiale . In questo capitolo abbiamo spiegato come
per copiare in profondità gli oggetti dell'array utilizzando il loro metodo di copia. Se hai bisogno di copie profonde di altri file

tipi di oggetti Python, passali alla funzione di copia profonda del modulo di copia .

7.13 RIMODELLAMENTO E TRASPORTO


Abbiamo utilizzato il metodo array reshape per produrre array bidimensionali da uno
gamme dimensionali. NumPy fornisce vari altri modi per rimodellare gli array.

rimodellare e ridimensionare

I metodi degli array reshape e resize consentono entrambi di modificare un array


dimensioni. Il metodo reshape restituisce una vista (copia superficiale) dell'array originale con
le nuove dimensioni. Esso non modifica dell'array originale:

lecca qui per visualizzare l'immagine del codice

In [1]: importa numpy come np

In [2]: grades = np.array ([[ 87 , 96 , 70 ], [ 100 , 87 , 90 ]])

In [3]: voti
Fuori [3]:
matrice ([[87, 96, 70],
[100, 87, 90]])

In [4]: ​grades.reshape ( 1 , 6 )
Uscita [4]: ​array ([[87, 96, 70, 100, 87, 90]])

In [5]: voti
Fuori [5]:
matrice ([[87, 96, 70],
[100, 87, 90]])

Il metodo resize modifica la forma dell'array originale :

lecca qui per visualizzare l'immagine del codice

In [6]: grades.resize ( 1 , 6 )

In [7]: voti
Uscita [7]: array ([[87, 96, 70, 100, 87, 90]])

fC latten vs. ravel

Pagina 284
flatten vs. ravel
Puoi prendere un array multidimensionale e appiattirlo in una singola dimensione con l'estensione
metodi di appiattimento e sbavatura . Il metodo flatten copia in profondità i dati dell'array originale:
lecca qui per visualizzare l'immagine del codice

In [8]: grades = np.array ([[ 87 , 96 , 70 ], [ 100 , 87 , 90 ]])

In [9]: voti
Fuori [9]:
matrice ([[87, 96, 70],
[100, 87, 90]])

In [10]: flattened = grades.flatten ()

In [11]: appiattito
Uscita [11]: array ([87, 96, 70, 100, 87, 90])

In [12]: voti
Fuori [12]:
matrice ([[87, 96, 70],
[100, 87, 90]])

Per confermare che voti e appiattiti non condividono i dati, modifichiamo un elemento

di appiattito, quindi visualizza entrambi gli array:

lecca qui per visualizzare l'immagine del codice

In [13]: appiattito [ 0 ] = 100

In [14]: appiattito
Uscita [14]: array ([100, 96, 70, 100, 87, 90])

In [15]: voti
Fuori [15]:
matrice ([[87, 96, 70],
[100, 87, 90]])

Il metodo ravel produce una vista della matrice originale, che condivide i gradi

dati dell'array:

lecca qui per visualizzare l'immagine del codice

In [16]: raveled = grades.ravel ()

In [17]: sfilacciato Pagina 285


Uscita [17]: array ([87, 96, 70, 100, 87, 90])

In [18]: voti
Fuori [18]:
matrice ([[87, 96, 70],
[100, 87, 90]])

Per confermare che i voti e le denunce condividono gli stessi dati, modifichiamo un elemento di

sfilacciato, quindi visualizzare entrambi gli array:

lecca qui per visualizzare l'immagine del codice

In [19]: raveled [ 0 ] = 100

In [20]: sfilacciato
Uscita [20]: array ([100, 96, 70, 100, 87, 90])

In [21]: voti
Fuori [21]:
matrice ([[100, 96, 70],
[100, 87, 90]])
Trasposizione di righe e colonne

È possibile trasporre rapidamente le righe e le colonne di un array, ovvero "capovolgere" l'array, quindi
le righe diventano le colonne e le colonne diventano le righe. L' attributo T.

restituisce una vista trasposta (copia superficiale) dell'array. La matrice dei voti originale
rappresenta i voti di due studenti (le righe) su tre esami (le colonne). Facciamo
trasporre le righe e le colonne per visualizzare i dati come voti su tre esami (il
righe) per due studenti (le colonne):

In [22]: voti.T
Fuori [22]:
matrice ([[100, 100],
[96, 87],
[70, 90]])

La trasposizione non modifica l'array originale:

In [23]: voti
Fuori [23]:
matrice ([[100, 96, 70],
[100, 87, 90]])

H
C impilamento orizzontale e verticale

Impilamento orizzontale e verticale Pagina 286

È possibile combinare array aggiungendo più colonne o più righe, note come orizzontali
accatastamento e accatastamento verticale . Creiamo un altro array di voti 2 per 3:

lecca qui per visualizzare l'immagine del codice

In [24]: grades2 = np.array ([[ 94 , 77 , 90 ], [ 100 , 81 , 82 ]])

Supponiamo che i voti2 rappresentino tre voti aggiuntivi per i due studenti in
la matrice dei voti. Possiamo combinare gradi e grades2 con NumPy di hstack
(stack orizzontale) passando una tupla contenente gli array da combinare.
Le parentesi extra sono necessarie perché hstack si aspetta un argomento:

lecca qui per visualizzare l'immagine del codice

In [25]: np.hstack ((voti, voti2))


Fuori [25]:
matrice ([[100, 96, 70, 94, 77, 90],
[100, 87, 90, 100, 81, 82]])

Successivamente, supponiamo che i voti2 rappresentino altri due voti degli studenti su tre esami.
In questo caso, possiamo combinare voti e voti2 con vstack di NumPy (vertical

stack) funzione :

lecca qui per visualizzare l'immagine del codice

In [26]: np.vstack ((grades, grades2))


Fuori [26]:
matrice ([[100, 96, 70],
[100, 87, 90],
[94, 77, 90],
[100, 81, 82]])
7.14 INTRO A DATA SCIENCE: SERIE PANDAS E
DATAFRAMES
L'array di NumPy è ottimizzato per dati numerici omogenei a cui si accede tramite numero intero
indici. La scienza dei dati presenta richieste uniche per le quali dati più personalizzati
sono necessarie strutture. Le applicazioni per big data devono supportare tipi di dati misti,
indicizzazione personalizzata, dati mancanti, dati non strutturati in modo coerente e dati che

C
Pagina 287
deve essere manipolato in forme appropriate per i database e l'analisi dei dati
pacchetti che usi.

Pandas è la libreria più popolare per gestire tali dati. Fornisce due chiavi
raccolte che utilizzerai in molte delle nostre sezioni Introduzione alla scienza dei dati e
in tutti i casi di studio della scienza dei dati— Serie per raccolte unidimensionali e

DataFrame per raccolte bidimensionali. Puoi usare il MultiIndex dei panda per
manipolare dati multidimensionali nel contesto di Series e DataFrame.

Wes McKinney ha creato i panda nel 2008 mentre lavorava nell'industria. Il nome panda è
derivato dal termine "dati del pannello", ovvero i dati per le misurazioni nel tempo, ad esempio
prezzi delle azioni o letture storiche della temperatura. McKinney aveva bisogno di una libreria in cui il file
le stesse strutture di dati potrebbero gestire dati sia temporali che non basati sull'ora con il supporto
per l'allineamento dei dati, i dati mancanti, la manipolazione dei dati di stili di database comuni e
4
Di Più.

4
McKinney, Wes. Python per l'analisi dei dati: data wrangling con Panda, NumPy,
e IPython , pagg. 123 165. Sebastopol, CA: OReilly Media, 2018.

NumPy e i panda sono intimamente legati. Serie e DataFrames utilizzano array


"sotto il cappuccio." Serie e DataFrame sono argomenti validi per molti NumPy

operazioni. Allo stesso modo, gli array sono argomenti validi per molti Series e DataFrame
operazioni.

5
Pandas è un argomento enorme: il PDF della sua documentazione è di oltre 2000 pagine. In questo
e le sezioni Intro to Data Science dei prossimi capitoli, presentiamo un'introduzione a
panda. Discutiamo le sue raccolte Series e DataFrames e le usiamo a supporto

della preparazione dei dati. Vedrai che Series e DataFrames ti rendono facile
eseguire attività comuni come selezionare elementi in vari modi, filtrare / mappare / ridurre
operazioni (centrali per la programmazione in stile funzionale e big data), matematiche
operazioni, visualizzazione e altro ancora.

5
Per la documentazione più recente sui panda, vedere

ttp: //pandas.pydata.org/pandasdocs/stable/ .

7.14.1 Serie panda

Una serie è un array unidimensionale migliorato. Mentre gli array usano solo zero
Gli indici interi basati su serie supportano l'indicizzazione personalizzata, inclusi anche quelli non interi

indici come stringhe. Le serie offrono anche funzionalità aggiuntive che le rendono di più

nh
Pagina 288
conveniente per molte attività orientate alla datascience. Ad esempio, Series potrebbe avere
dati mancanti e molte operazioni della serie ignorano i dati mancanti per impostazione predefinita.

Creazione di una serie con indici predefiniti


Per impostazione predefinita, una serie ha indici interi numerati in sequenza da 0. Quanto segue
crea una serie di voti degli studenti da un elenco di numeri interi:

lecca qui per visualizzare l'immagine del codice

In [1]: importa i panda come pd

In [2]: grades = pd.Series ([87, 100, 94])

L'inizializzatore può anche essere una tupla, un dizionario, un array, un'altra serie o un singolo
valore. Mostreremo momentaneamente un singolo valore.

Visualizzazione di una serie

Pandas mostra una serie in formato a due colonne con gli indici allineati a sinistra a sinistra

colonna ei valori allineati a destra nella colonna di destra. Dopo aver elencato la serie
elements, pandas mostra il tipo di dati (dtype) degli elementi dell'array sottostante:

In [3]: voti
Fuori [3]:
0 87
1 100
2 94
dtype: int64

Nota quanto è facile visualizzare una serie in questo formato, rispetto al corrispondente
codice per la visualizzazione di una lista nello stesso formato a due colonne.

Creazione di una serie con tutti gli elementi che hanno lo stesso valore

Puoi creare una serie di elementi che hanno tutti lo stesso valore:

lecca qui per visualizzare l'immagine del codice

In [4]: ​pd.Series ( 98.6 , intervallo ( 3 ))


Fuori [4]:
0 98.6
1 98.6

2 98.6 Pagina 289


dtype: float64

Il secondo argomento è un oggetto iterabile monodimensionale (come un elenco, un array o un file

range) contenente gli indici delle serie. Il numero di indici determina il numero
di elementi.

Accesso agli elementi di una serie

È possibile accedere agli elementi di una serie tramite parentesi quadre contenenti un indice:

In [5]: voti [ 0 ]
Uscita [5]: 87

Produzione di statistiche descrittive per una serie

Series fornisce molti metodi per attività comuni, inclusa la produzione di vari
statistiche descrittive. Qui mostriamo count, mean, min, max e std (standard

deviazione):
lecca qui per visualizzare l'immagine del codice

In [6]: grades.count ()
Fuori [6]: 3

In [7]: grades.mean ()
Uscita [7]: 93.66666666666667

In [8]: grades.min ()
Uscita [8]: 87

In [9]: grades.max ()
Uscita [9]: 100

In [10]: grades.std ()
Uscita [10]: 6.506407098647712

Ognuno di questi è una riduzione dello stile funzionale. Il metodo Calling Series descrive
produce tutte queste statistiche e molto altro:

lecca qui per visualizzare l'immagine del codice

In [11]: grades.describe ()
Fuori [11]:

contare 3.000000 Pagina 290


media 93,666667
std 6.506407
min 87.000000
25% 90.500000
50% 94.000000
75% 97.000000
max 100.000000
dtype: float64

Il 25%, il 50% e il 75% sono quartili :

Il 50% rappresenta la mediana dei valori ordinati.

Il 25% rappresenta la mediana della prima metà dei valori ordinati.

Il 75% rappresenta la mediana della seconda metà dei valori ordinati.

Per i quartili, se ci sono due elementi intermedi, la loro media è quella di quel quartile
mediano. Abbiamo solo tre valori nella nostra serie, quindi il quartile del 25% è la media di

87 e 94, e il quartile del 75% è la media di 94 e 100. Insieme, il


l'intervallo interquartile è il 75% del quartile meno il 25% del quartile, che è un altro
misura della dispersione, come la deviazione standard e la varianza. Naturalmente, quartili e
intervallo interquartile sono più utili in set di dati più grandi.

Creazione di una serie con indici personalizzati

È possibile specificare indici personalizzati con l'argomento della parola chiave index:

lecca qui per visualizzare l'immagine del codice

In [12]: grades = pd.Series ([ 87 , 100 , 94 ], index = [ 'Wally' , 'Eva' , 'Sam' ]

n [13]: voti
Fuori [13]:
Wally 87
Eva 100
Sam 94
dtype: int64

In questo caso, abbiamo utilizzato indici di stringa, ma puoi utilizzare altri tipi immutabili, tra cui
interi che non iniziano da 0 e interi non consecutivi. Ancora una volta, nota quanto bene e
panda concisamente formatta una serie per la visualizzazione.

D
C inizializzatori ictionary
io

Inizializzatori di dizionario Pagina 291

Se si inizializza una serie con un dizionario, le sue chiavi diventano gli indici della serie e
i suoi valori diventano i valori dell'elemento della serie:

lecca qui per visualizzare l'immagine del codice

In [14]: grades = pd.Series ({ 'Wally' : 87 , 'Eva' : 100 , 'Sam' : 94 })

In [15]: voti
Fuori [15]:
Wally 87
Eva 100
Sam 94
dtype: int64

Accesso agli elementi di una serie tramite indici personalizzati

In una serie con indici personalizzati, è possibile accedere ai singoli elementi tramite quadrato

parentesi che contengono un valore di indice personalizzato:

In [16]: voti [ "Eva" ]


Fuori [16]: 100

Se gli indici personalizzati sono stringhe che potrebbero rappresentare identificatori Python validi, panda
li aggiunge automaticamente alla serie come attributi a cui è possibile accedere tramite un punto (.),
come in:

In [17]: gradi.Wally
Uscita [17]: 87

Series ha anche incorporato attributi. Ad esempio, l' attributo dtype restituisce


tipo di elemento dell'array sottostante:

In [18]: grades.dtype
Out [18]: dtype ('int64')

e l' attributo values restituisce l'array sottostante:

lecca qui per visualizzare l'immagine del codice

In [19]: grades.values

Uscita [19]: array ([87, 100, 94]) Pagina 292

Creazione di una serie di stringhe


Se una serie contiene stringhe, puoi usare il suo attributo str per chiamare i metodi stringa
gli elementi. Innanzitutto, creiamo una serie di stringhe correlate all'hardware:

lecca qui per visualizzare l'immagine del codice

In [20]: hardware = pd.Series ([ 'Hammer' , 'Saw' , 'Wrench' ])

In [21]: hardware
Fuori [21]:
0 Hammer
1 sega
2 chiave
dtype: oggetto

Si noti che i panda anche rightaligns valori degli elementi di stringa e che la DTYPE per le stringhe

è oggetto.

Chiamiamo il metodo stringa contiene su ogni elemento per determinare se il valore di


ogni elemento contiene una "a" minuscola:

lecca qui per visualizzare l'immagine del codice

In [22]: hardware.str.contains ( 'a' )


Fuori [22]:
0 Vero
1 Vero
2 Falso
dtype: bool

Pandas restituisce una serie contenente valori bool che indicano il metodo contiene

risultato per ogni elemento: l'elemento con indice 2 ("Chiave inglese") non contiene una "a",
quindi il suo elemento nella serie risultante è False. Nota che i panda gestiscono l'iterazione

internamente per te: un altro esempio di programmazione in stile funzionale. Lo str


attributo fornisce molti metodi di elaborazione delle stringhe simili a quelli di Python
tipo di stringa. Per un elenco, vedere:
ttps: //pandas.pydata.org/pandas

ocs / stabile / API.html # stringhandling .

Di seguito viene utilizzato il metodo stringa upper per produrre una nuova serie contenente il file

C
dh
Pagina 293
versioni maiuscole di ogni elemento nell'hardware:

lecca qui per visualizzare l'immagine del codice

In [23]: hardware.str.upper ()
Fuori [23]:
0 MARTELLO
1 SEGA
2 CHIAVE
dtype: oggetto

7.14.2 DataFrame

Un DataFrame è un array bidimensionale avanzato. Come Series, DataFrames può


hanno indici di riga e di colonna personalizzati e offrono operazioni e funzionalità aggiuntive
che li rendono più convenienti per molte attività orientate alla datascience. DataFrames
supporta anche i dati mancanti. Ogni colonna in un DataFrame è una serie. La serie
che rappresenta ogni colonna può contenere diversi tipi di elementi, come vedrai presto quando
discutiamo del caricamento di set di dati in DataFrame.
Creazione di un DataFrame da un dizionario

Creiamo un DataFrame da un dizionario che rappresenta i voti degli studenti su tre


esami:

lecca qui per visualizzare l'immagine del codice

In [1]: importa i panda come pd

In [2]: grades_dict = { 'Wally' : [ 87 , 96 , 70 ], 'Eva' : [ 100 , 87 , 90 ],


...: "Sam" : [ 94 , 77 , 90 ], "Katie" : [ 100 , 81 , 82 ],
...: "Bob" : [ 83 , 65 , 85 ]}
...:

In [3]: grades = pd.DataFrame (grades_dict)

In [4]: ​voti
Fuori [4]:
Wally Eva Sam Katie Bob
0 87100 94100 83
1 96 87 77 81 65
2 70 90 90 82 85

Pandas visualizza DataFrame in formato tabulare con gli indici allineati a sinistra nel file

C
Pagina 294
colonna indice e i valori delle colonne rimanenti allineati a destra . Le chiavi del dizionario
diventano i nomi delle colonne ei valori associati a ciascuna chiave diventano l'elemento
valori nella colonna corrispondente. A breve, mostreremo come "capovolgere" le righe e
colonne. Per impostazione predefinita, gli indici di riga sono numeri interi generati automaticamente a partire da 0.

Personalizzazione degli indici di un DataFrame con l'attributo index

Avremmo potuto specificare indici personalizzati con l'argomento della parola chiave index quando abbiamo

ha creato il DataFrame, come in:

lecca qui per visualizzare l'immagine del codice

pd.DataFrame (grades_dict, index = [ 'Test1' , 'Test2' , 'Test3' ])

Usiamo l' attributo index per cambiare gli indici del DataFrame da sequenziali

numeri interi alle etichette:

lecca qui per visualizzare l'immagine del codice

In [5]: grades.index = [ "Test1" , "Test2" , "Test3" ]

In [6]: voti
Fuori [6]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test2 96 87 77 81 65
Test3 70 90 90 82 85

Quando si specificano gli indici, è necessario fornire una raccolta unidimensionale che abbia
lo stesso numero di elementi quante sono le righe nel DataFrame; in caso contrario, a

Si verifica ValueError. Series fornisce anche un attributo di indice per modificare un file
indici delle serie esistenti.
Accesso alle colonne di un DataFrame
Uno dei vantaggi dei panda è che puoi esaminare rapidamente e comodamente i tuoi dati in formato
molti modi diversi, inclusa la selezione di porzioni di dati. Cominciamo ottenendo
I voti di Eva per nome, che mostra la sua colonna come una serie:

In [7]: voti [ "Eva" ]


Fuori [7]:
Test1 100

Test2 87 Pagina 295


Test3 90
Nome: Eva, dtype: int64

Se le stringhe columnname di un DataFrame sono identificatori Python validi, puoi usarle


come attributi. Otteniamo i voti di Sam con l' attributo Sam :

In [8]: grades.Sam
Fuori [8]:
Test1 94
Test2 77
Test3 90
Nome: Sam, dtype: int64

Selezione di righe tramite gli attributi loc e iloc

Sebbene DataFrames supporti funzionalità di indicizzazione con [], la documentazione di pandas

consiglia di utilizzare gli attributi loc, iloc, at e iat, ottimizzati per


accedi a DataFrame e fornisci anche funzionalità aggiuntive oltre a ciò che puoi fare
solo con []. Inoltre, la documentazione afferma che l'indicizzazione con [] spesso produce un file
copia dei dati, che è un errore logico se si tenta di assegnare nuovi valori al file

DataFrame assegnando al risultato dell'operazione [].

È possibile accedere a una riga tramite la sua etichetta tramite l' attributo loc del DataFrame . Il seguente
elenca tutti i voti nella riga "Test1":

lecca qui per visualizzare l'immagine del codice

In [9]: grades.loc [ 'Test1' ]


Fuori [9]:
Wally 87
Eva 100
Sam 94
Katie 100
Bob 83
Nome: Test1, dtype: int64

È inoltre possibile accedere alle righe tramite indici interi a base zero utilizzando l' attributo iloc (i
in iloc significa che è usato con indici interi). Di seguito sono elencati tutti i voti in
la seconda riga:

lecca qui per visualizzare l'immagine del codice

C
Pagina 296
In [10]: grades.iloc [ 1 ]
Fuori [10]:
Wally 96
Eva 87
Sam 77
Katie 81
Bob 65
Nome: Test2, dtype: int64

Selezione di righe tramite sezioni ed elenchi con gli attributi loc e iloc

L'indice può essere una sezione . Quando si utilizzano sezioni contenenti etichette con loc, l'intervallo

specificato include l'indice alto ('Test3'):

lecca qui per visualizzare l'immagine del codice

In [11]: grades.loc [ 'Test1' : 'Test3' ]


Fuori [11]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test2 96 87 77 81 65
Test3 70 90 90 82 85

Quando si utilizzano sezioni contenenti indici interi con iloc, l'intervallo specificato esclude

l'indice alto (2):

lecca qui per visualizzare l'immagine del codice

In [12]: grades.iloc [ 0 : 2 ]
Fuori [12]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test2 96 87 77 81 65

Per selezionare righe specifiche , utilizza un elenco anziché la notazione slice con loc o iloc:

lecca qui per visualizzare l'immagine del codice

In [13]: grades.loc [[ 'Test1' , 'Test3' ]]


Fuori [13]:
Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test3 70 90 90 82 85

In [14]: grades.iloc [[ 0 , 2 ]]

Fuori [14]: Pagina 297


Wally Eva Sam Katie Bob
Test1 87100 94100 83
Test3 70 90 90 82 85

Selezione di sottoinsiemi di righe e colonne


Finora abbiamo selezionato solo intere righe. Puoi concentrarti su piccoli sottoinsiemi di un DataFrame

selezionando righe e colonne utilizzando due sezioni, due elenchi o una combinazione di sezioni e
elenchi.

Supponi di voler visualizzare solo i voti di Eva e Katie nei Test1 e Test2. Noi
può farlo usando loc con uno slice per le due righe consecutive e un elenco per le due
colonne non consecutive:

lecca qui per visualizzare l'immagine del codice

In [15]: grades.loc [ 'Test1' : 'Test2' , [ 'Eva' , 'Katie' ]]


Fuori [15]:
Eva Katie
Test1 100100
Test2 87 81

La sezione "Test1": "Test2" seleziona le righe per Test1 e Test2. L'elenco ["Eva",

"Katie"] seleziona solo i voti corrispondenti da queste due colonne.

Usiamo iloc con un elenco e una fetta per selezionare il primo e il terzo test e i primi tre
colonne per questi test:

lecca qui per visualizzare l'immagine del codice

In [16]: grades.iloc [[ 0 , 2 ], 0 : 3 ]
Fuori [16]:
Wally Eva Sam
Test1 87100 94
Test3 70 90 90

Indicizzazione booleana

Una delle funzionalità di selezione più potenti dei panda è l'indicizzazione booleana . Per
esempio, selezioniamo tutti i voti A, ovvero quelli che sono maggiori o uguali a 90:

lecca qui per visualizzare l'immagine del codice

C
Pagina 298
In [17]: voti [voti> = 90 ]
Fuori [17]:
Wally Eva Sam Katie Bob
Test1 NaN 100,0 94,0 100,0 NaN
Test2 96,0 NaN NaN NaN NaN
Test3 NaN 90,0 90,0 NaN NaN

Pandas controlla ogni grado per determinare se il suo valore è maggiore o uguale a 90
e, in tal caso, lo include nel nuovo DataFrame. Gradi per i quali la condizione è False
sono rappresentati come NaN (non un numero) nel nuovo DataFrame. NaN è panda

notazione per i valori mancanti.

Selezioniamo tutti i gradi B nell'intervallo 80-89:

lecca qui per visualizzare l'immagine del codice

In [18]: voti [(voti> = 80 ) & (voti < 90 )]


Fuori [18]:
Wally Eva Sam Katie Bob
Test1 87,0 NaN NaN NaN 83,0
Test2 NaN 87,0 NaN 81,0 NaN
Test3 NaN NaN NaN 82,0 85,0

Gli indici booleani di Pandas combinano più condizioni con l'operatore Python e
(AND bit per bit), non l'operatore e booleano. Per o le condizioni, utilizzare | (OR bit per bit).

NumPy supporta anche l'indicizzazione booleana per gli array, ma ne restituisce sempre uno
matrice dimensionale contenente solo i valori che soddisfano la condizione.

Accesso a una cella DataFrame specifica per riga e colonna

È possibile utilizzare gli attributi at e iat di un DataFrame per ottenere un singolo valore da un file

DataFrame. Come loc e iloc, at usa etichette e iat usa indici interi. In ciascuna
caso, gli indici di riga e di colonna devono essere separati da una virgola. Selezioniamo Eva's

Grado Test2 (87) e grado Test3 di Wally (70)


lecca qui per visualizzare l'immagine del codice

In [19]: grades.at [ 'Test2' , 'Eva' ]


Fuori [19]: 87

In [20]: grades.iat [ 2 , 0 ]
Uscita [20]: 70

C
Pagina 299
È inoltre possibile assegnare nuovi valori a elementi specifici. Cambiamo il grado Test2 di Eva in

100 usando at, quindi cambiarlo di nuovo in 87 usando iat:

lecca qui per visualizzare l'immagine del codice

In [21]: grades.at [ 'Test2' , 'Eva' ] = 100

In [22]: grades.at [ 'Test2' , 'Eva' ]


Fuori [22]: 100

In [23]: grades.iat [ 1 , 2 ] = 87

In [24]: grades.iat [ 1 , 2 ]
Uscita [24]: 87,0

Statistiche descrittive

Sia Series che DataFrame hanno un metodo di descrizione che calcola di base
statistiche descrittive per i dati e li restituisce come DataFrame. In un DataFrame,
le statistiche sono calcolate per colonna (di nuovo, presto vedrai come capovolgere le righe e
colonne):

lecca qui per visualizzare l'immagine del codice

In [25]: grades.describe ()
Fuori [25]:
Wally Eva Sam Katie Bob
conteggio 3.000000 3.000000 3.000000 3.000000 3.000000
media 84.333333 92.333333 87.000000 87.666667 77.666667
std 13.203535 6.806859 8.888194 10.692677 11.015141
min 70.000000 87.000000 77.000000 81.000000 65.000000
25% 78.500000 88.500000 83.500000 81.500000 74.000000
50% 87.000000 90.000000 90.000000 82.000000 83.000000
75% 91.500000 95.000000 92.000000 91.000000 84.000000
max 96.000000 100.000000 94.000000 100.000000 85.000000

Come puoi vedere, la descrizione ti offre un modo rapido per riassumere i tuoi dati. Piacevolmente

dimostra la potenza della programmazione orientata agli array con un linguaggio pulito e conciso
chiamata in stile funzionale. Pandas gestisce internamente tutti i dettagli del calcolo di questi
statistiche per ogni colonna. Potresti essere interessato a vedere statistiche simili sui test
bytest in modo da poter vedere come si comportano tutti gli studenti nei test 1, 2 e 3: lo faremo
mostra come farlo a breve.

Per impostazione predefinita, panda calcola le statistiche descrittive con valori in virgola mobile e

C
Pagina 300
li visualizza con sei cifre di precisione. Puoi controllare la precisione e altro
impostazioni predefinite con la funzione set_option dei panda :

lecca qui per visualizzare l'immagine del codice


In [26]: pd.set_option ( 'precision' , 2 )

In [27]: grades.describe ()
Fuori [27]:
Wally Eva Sam Katie Bob
conteggio 3.00 3.00 3.00 3.00 3.00
media 84,33 92,33 87,00 87,67 77,67
standard 13,20 6,81 8,89 10,69 11,02
min 70,00 87,00 77,00 81,00 65,00
25% 78,50 88,50 83,50 81,50 74,00
50% 87,00 90,00 90,00 82,00 83,00
75% 91,50 95,00 92,00 91,00 84,00
max 96,00 100,00 94,00 100,00 85,00

Per i voti degli studenti, la più importante di queste statistiche è probabilmente la media. Puoi
calcola quello per ogni studente semplicemente chiamando mean sul DataFrame:

In [28]: grades.mean ()
Fuori [28]:
Wally 84.33
Eva 92.33
Sam 87.00
Katie 87.67
Bob 77.67
dtype: float64

Tra poco mostreremo come ottenere la media dei voti di tutti gli studenti su ogni test
in una riga di codice aggiuntivo.

Trasposizione del DataFrame con l'attributo T.

Puoi trasporre rapidamente le righe e le colonne, in modo che le righe diventino le colonne,
e le colonne diventano le righe, utilizzando l' attributo T :

lecca qui per visualizzare l'immagine del codice

In [29]: voti.T
Fuori [29]:
Test1 Test2 Test3
Wally 87 96 70
Eva 100 87 90

Sam 94 77 90 Pagina 301


Katie 100 81 82
Bob 83 65 85

T restituisce una vista trasposta (non una copia) del DataFrame.

Supponiamo che invece di ottenere le statistiche di riepilogo dallo studente, tu voglia ottenere
loro tramite prova. Chiama semplicemente descrivere sui voti T, come in:

lecca qui per visualizzare l'immagine del codice

In [30]: grades.T.describe ()
Fuori [30]:
Test1 Test2 Test3
contare 5,00 5,00 5,00
media 92,80 81,20 83,40
standard 7,66 11,54 8,23
min 83,00 65,00 70,00
25% 87,00 77,00 82,00
50% 94,00 81,00 85,00
75% 100,00 87,00 90,00
max 100,00 96,00 90,00

Per vedere la media dei voti di tutti gli studenti su ogni test, basta chiamare mean sulla T

attributo:

In [31]: grades.T.mean ()
Fuori [31]:
Test1 92.8
Test2 81.2
Test3 83.4
dtype: float64

Ordinamento per righe in base ai rispettivi indici

Ordinerai spesso i dati per una più facile leggibilità. Puoi ordinare un DataFrame in base alle sue righe o

colonne, in base ai loro indici o valori. Ordiniamo le righe in base ai loro indici in
ordine discendente utilizzando sort_index e l'argomento della parola chiave ascending = False

(l'impostazione predefinita è ordinare in ordine crescente ). Ciò restituisce un nuovo DataFrame contenente
i dati ordinati:

lecca qui per visualizzare l'immagine del codice

In [32]: grades.sort_index (ascending = False )

Fuori [32]: Pagina 302


Wally Eva Sam Katie Bob
Test3 70 90 90 82 85
Test2 96 87 77 81 65
Test1 87100 94100 83

Ordinamento per indici di colonna


Ora ordiniamo le colonne in ordine crescente (da sinistra a destra) in base ai loro nomi di colonna.
Il passaggio dell'argomento della parola chiave axis = 1 indica che si desidera ordinare la colonna
indici, anziché gli indici di riga: axis = 0 (impostazione predefinita) ordina gli indici di riga :

lecca qui per visualizzare l'immagine del codice

In [33]: grades.sort_index (axis = 1 )


Fuori [33]:
Bob Eva Katie Sam Wally
Test1 83100100 94 87
Test2 65 87 81 77 96
Test3 85 90 82 90 70

Ordinamento per valori di colonna

Supponiamo di voler vedere i voti di Test1 in ordine decrescente in modo da poter vedere il file

i nomi degli studenti in ordine di grado più alto o più basso. Possiamo chiamare il metodo
sort_values come segue:

lecca qui per visualizzare l'immagine del codice

In [34]: grades.sort_values ​(by = "Test1" , axis = 1 , ascending = False )


Fuori [34]:
Eva Katie Sam Wally Bob
Test1 100100 94 87 83
Test2 87 81 77 96 65
Test3 90 82 90 70 85
Gli argomenti della parola chiave by e axis lavorano insieme per determinare quali valori saranno

smistato. In questo caso, ordiniamo in base ai valori della colonna (asse = 1) per Test1.

Certo, potrebbe essere più facile leggere i voti e i nomi se fossero in una colonna, quindi
possiamo invece ordinare il DataFrame trasposto. Qui, non era necessario specificare il file

argomento della parola chiave axis, perché sort_values ​ordina i dati in una colonna specificata per
predefinito:

lecca qui per visualizzare l'immagine del codice Pagina 303

In [35]: grades.T.sort_values ​(by = 'Test1' , ascending = False )


Fuori [35]:
Test1 Test2 Test3
Eva 100 87 90
Katie 100 81 82
Sam 94 77 90
Wally 87 96 70
Bob 83 65 85

Infine, poiché stai ordinando solo i voti del Test1, potresti non voler vedere l'altro

prove a tutti. Quindi, combiniamo la selezione con l'ordinamento:

lecca qui per visualizzare l'immagine del codice

In [36]: grades.loc [ 'Test1' ] .sort_values ​(ascending = False )


Fuori [36]:
Katie 100
Eva 100
Sam 94
Wally 87
Bob 83
Nome: Test1, dtype: int64

Copia e ordinamento sul posto

Per impostazione predefinita, sort_index e sort_values ​restituiscono una copia dell'originale

DataFrame, che potrebbe richiedere una notevole quantità di memoria in un'applicazione per big data. Puoi
ordinare il DataFrame in posizione , invece di copiare i dati. A tale scopo, passare la parola chiave
argomento inplace = True per sort_index o sort_values.

Abbiamo mostrato molte caratteristiche della serie Panda e DataFrame. Nel prossimo capitolo

Introduzione alla sezione Data Science, useremo Series e DataFrames per il munging dei dati -
pulizia e preparazione dei dati da utilizzare nel database o nel software di analisi.

7.15 WRAP-UP
Questo capitolo ha esplorato l'uso dei ndarrays ad alte prestazioni di NumPy per l'archiviazione e

recupero dei dati e per eseguire manipolazioni di dati comuni in modo conciso e con
ridotta possibilità di errori con la programmazione in stile funzionale. Ci riferiamo a ndarrays

semplicemente dal loro sinonimo, array.

C
Pagina 304
Gli esempi del capitolo hanno dimostrato come creare, inizializzare e fare riferimento a un individuo
elementi di array unidimensionali e bidimensionali. Abbiamo utilizzato gli attributi per determinare un file

dimensione, forma e tipo di elemento dell'array. Abbiamo mostrato le funzioni che creano array di 0,
1s, valori specifici o valori di intervalli. Abbiamo confrontato l'elenco e le prestazioni dell'array con il
IPython% timeit magic e ha visto che gli array sono fino a due ordini di grandezza più veloci.

Abbiamo utilizzato operatori di array e funzioni universali NumPy per eseguire elementwise

calcoli su ogni elemento di array che hanno la stessa forma. Hai visto anche quello
NumPy utilizza la trasmissione per eseguire operazioni elementwise tra array e

valori scalari e tra array di forme diverse. Abbiamo introdotto vari builtin

metodi di array per eseguire calcoli utilizzando tutti gli elementi di un array e noi
ha mostrato come eseguire quei calcoli riga per riga o colonna per colonna. Noi
ha dimostrato varie funzionalità di suddivisione e indicizzazione degli array che sono più potenti
rispetto a quelli forniti dalle raccolte incorporate di Python. Abbiamo dimostrato vari modi per farlo
rimodellare gli array. Abbiamo discusso su come eseguire la copia superficiale e la copia profonda di array e altro
Oggetti Python.

Nella sezione Intro to Data Science, abbiamo iniziato la nostra introduzione multisezione a
popolare libreria di panda che utilizzerai in molti dei capitoli dei case study di data science.
Hai visto che molte applicazioni per big data richiedono raccolte più flessibili rispetto a NumPy

array, raccolte che supportano tipi di dati misti, indicizzazione personalizzata, dati mancanti, dati
non è strutturato in modo coerente e i dati devono essere manipolati in moduli
appropriato per i database e i pacchetti di analisi dei dati utilizzati.

Abbiamo mostrato come creare e manipolare Serie unidimensionali simili ad array di panda
e DataFrame bidimensionali. Abbiamo personalizzato gli indici di serie e DataFrame.

Hai visto gli output ben formattati dei panda e hai personalizzato la precisione del galleggiamento
valori in punti. Abbiamo mostrato vari modi per accedere e selezionare i dati in Series e

DataFrames. Abbiamo utilizzato il metodo Descrivere per calcolare le statistiche descrittive di base per
Serie e DataFrames. Abbiamo mostrato come trasporre le righe DataFrame e
colonne tramite l'attributo T. Hai visto diversi modi per ordinare i DataFrame usando il loro indice
valori, i nomi delle loro colonne, i dati nelle loro righe e i dati nelle loro colonne. Tu sei
ora ha familiarità con quattro potenti raccolte di tipo array: elenchi, array, serie e

DataFrame e i contesti in cui utilizzarli. Aggiungeremo un quinto - tensori - nel file


Capitolo "Deep Learning".

Nel prossimo capitolo, daremo uno sguardo più approfondito alle stringhe, alla formattazione delle stringhe e alle stringhe
metodi. Introduciamo anche espressioni regolari, che useremo per trovare modelli in
testo. Le funzionalità che vedrai ti aiuteranno a prepararti per il " Linguaggio naturale

T
N
Pagina 305
capitolo rocessing (PNL) "e altri capitoli chiave sulla scienza dei dati. Nel prossimo capitolo
Nell'introduzione alla sezione Data Science, introdurremo il munging dei dati dei panda , che prepara i dati per
utilizzare nel database o nel software di analisi. Nei capitoli successivi, useremo i panda per
analisi di base delle serie temporali e introduzione alle funzionalità di visualizzazione dei panda.
https://avxhm.se/blogs/hill0

P
Pagina 306

tory . Corde: uno sguardo più profondo


Obiettivi
foto

In questo capitolo potrai:


rning Pat

Comprendere l'elaborazione del testo.


fers & Dea

Usa metodi stringa.


hlights

Formatta il contenuto della stringa.


ttings

Concatena e ripeti le stringhe.


Supporto
Elimina gli spazi bianchi dalle estremità delle stringhe.
Disconnessione
Cambia i caratteri da minuscolo a maiuscolo e viceversa.

Confronta le stringhe con gli operatori di confronto.

Cerca nelle stringhe sottostringhe e sostituisci le sottostringhe.

Dividi le stringhe in gettoni.

Concatena le stringhe in una singola stringa con un separatore specificato tra gli elementi.

Crea e usa espressioni regolari per abbinare modelli nelle stringhe, sostituire le sottostringhe
e convalidare i dati.

Usa metacaratteri delle espressioni regolari, quantificatori, classi di caratteri e raggruppamenti.

Comprendi quanto siano critiche le manipolazioni delle stringhe per l'elaborazione del linguaggio naturale.

Comprendere i termini della scienza dei dati data munging, data wrangling e data cleaning,
e usa espressioni regolari per munge i dati nei formati preferiti.

8
Pagina 307
Contorno

.1 Introduzione

.2 Formattazione delle stringhe

.2.1 Tipi di presentazione

.2.2 Larghezze dei campi e allineamento

.2.3 Formattazione numerica

.2.4 Metodo di formattazione della stringa

.3 Concatenazione e ripetizione di stringhe

.4 Rimozione di spazi bianchi dalle stringhe

.5 Modifica delle maiuscole / minuscole

.6 Operatori di confronto per stringhe

.7 Ricerca di sottostringhe

.8 Sostituzione di sottostringhe

.9 Divisione e unione di stringhe

.10 Caratteri e metodi di verifica dei caratteri

.11 Corde grezze

.12 Introduzione alle espressioni regolari

.12.1 re Modulo e funzione fullmatch

.12.2 Sostituzione di sottostringhe e suddivisione di stringhe

.12.3 Altre funzioni di ricerca; accesso alle corrispondenze

.13 Introduzione alla scienza dei dati: panda, espressioni regolari e scambio di dati

.14 WrapUp

8
Pagina 308

.1 INTRODUZIONE
Abbiamo introdotto le stringhe, la formattazione delle stringhe di base e diversi operatori di stringa e
metodi. Hai visto che le stringhe supportano molte delle stesse operazioni di sequenza delle liste
e tuple, e quelle stringhe, come le tuple, sono immutabili. Ora, diamo uno sguardo più approfondito
stringhe e introdurre espressioni regolari e il modulo re, che useremo per abbinare
1
modelli nel testo. Le espressioni regolari sono particolarmente importanti nei dati ricchi di oggi
applicazioni. Le funzionalità qui presentate ti aiuteranno a prepararti per il " aturale
anguage Processing (NLP) ”e altri capitoli chiave sulla scienza dei dati. Nella PNL
capitolo, esamineremo altri modi per far sì che i computer manipolino e persino "comprendano"
testo. La tabella seguente mostra molte applicazioni relative all'elaborazione delle stringhe e all'NLP. Nel
nella sezione Introduzione alla scienza dei dati, introduciamo brevemente i dati
pulizia / munging / wrangling con Pandas Series e DataFrames.

1
Vedremo nei capitoli del caso di studio della scienza dei dati che la ricerca di pattern nel testo è un
parte cruciale dell'apprendimento automatico.

String e
PNL
applicazioni

Anagrammi

Automatizzato
classificazione di
scritto
Traduzione interlinguistica
compiti a casa

Documento legale
Automatizzato Classificazione dello spam
preparazione
sistemi di insegnamento
Motori Speechtotext
Monitoraggio dei social media
Classificazione
post Correttori ortografici
articoli

Linguaggio naturale Steganografia


Chatbot
comprensione

Compilatori e Editor di testo


Analisi delle opinioni

8LN
Pagina 309
interpreti Software di composizione delle pagine Motori Texttospeech

Scrittura creativa Palindromi Web scraping

Crittografia Etichettatura di parti di discorso Chi ha scritto


Le opere di Shakespeare?
Documento Progetto Gutenberg gratuito
classificazione libri Nuvole di parole

Documento Leggere libri, articoli, Giochi di parole


somiglianza documentazione e
conoscenza assorbente Scrittura medica
Documento diagnosi da raggi X,
riepilogo Motori di ricerca scansioni, esami del sangue

Libro elettronico Analisi del sentiment e molti altri


lettori
Intercettazione di una frode

Grammatica
dama

8.2 FORMATTAZIONE DELLE STRINGHE


La corretta formattazione del testo semplifica la lettura e la comprensione dei dati. Qui, vi presentiamo
molte funzionalità di formattazione del testo.

8.2.1 Tipi di presentazione


Hai visto la formattazione di base delle stringhe con fstrings. Quando specifichi un segnaposto per un file
value in una stringa f, Python assume che il valore debba essere visualizzato come una stringa a meno che
si specifica un altro tipo. In alcuni casi, il tipo è obbligatorio. Ad esempio, formatta
il valore del float 17.489 arrotondato alla posizione dei centesimi:

In [1]: f " { 17.489 : .2 f} "


Uscita [1]: '17 .49 '

Pagina 310
Python supporta la precisione solo per i valori floatingpoint e Decimal. La formattazione è

tipo dipendente —se provi a usare .2f per formattare una stringa come 'ciao', un ValueError
si verifica. Quindi è richiesto il tipo di presentazione f nell'identificatore di formato .2f. It
indica quale tipo viene formattato in modo che Python possa determinare se l'altro
le informazioni di formattazione sono consentite per quel tipo. Qui, mostriamo alcuni comuni
tipi di presentazione. Puoi visualizzare l'elenco completo su

ttps: //docs.python.org/3/library/string.html#formatspec

Interi

Il tipo di presentazione d formatta i valori interi come stringhe:

In [2]: f ' { 10 : d} '


Uscita [2]: "10"

Esistono anche tipi di presentazione intera (b, oex o X) che formattano i numeri interi usando
2
i sistemi numerici binari, ottali o esadecimali.

2
Vedere l'appendice in linea Sistemi numerici per informazioni su binario, ottale e
sistemi numerici esadecimali.

Personaggi

Il tipo di presentazione c formatta un codice di caratteri interi come corrispondente


carattere:

lecca qui per visualizzare l'immagine del codice

In [3]: f ' { 65 : c} { 97 : c} '


Uscita [3]: "A a"
stringhe

Il tipo di presentazione s è l'impostazione predefinita. Se si specifica esplicitamente s, il valore da formattare


deve essere una variabile che fa riferimento a una stringa, un'espressione che produce una stringa o un file
stringa letterale, come nel primo segnaposto di seguito. Se non specifichi un tipo di presentazione,
come nel secondo segnaposto sotto, i valori non di stringa come il numero intero 7 vengono convertiti in
stringhe:

lecca qui per visualizzare l'immagine del codice

C
h

Pagina 311
In [4]: ​f ' { "hello" : s} { 7 } '
Uscita [4]: ​"ciao 7"

In questo frammento, "ciao" è racchiuso tra virgolette doppie. Ricorda che non puoi posizionare
virgolette singole all'interno di una stringa con virgolette singole.

Valori a virgola mobile e decimali

Hai utilizzato il tipo di presentazione f per formattare i valori in virgola mobile e decimale. Per
valori estremamente grandi e piccoli di questi tipi, notazione esponenziale (scientifica)
può essere utilizzato per formattare i valori in modo più compatto. Mostriamo la differenza tra f
e e per un valore grande, ciascuno con tre cifre di precisione a destra del decimale
punto:

lecca qui per visualizzare l'immagine del codice

In [5]: from decimal import Decimal

In [6]: f ' {Decimal ( "10000000000000000000000000.0" ): .3 f} '


Uscita [6]: "10000000000000000000000000.000"

In [7]: f ' {Decimal ( "10000000000000000000000000.0" ): .3 e} '


Uscita [7]: "1.000e + 25"

Per il tipo di presentazione e nello snippet [5], il valore formattato 1.000e + 25 è


equivalente a

25
1.000 x 10

Se preferisci una E maiuscola per l'esponente, usa il tipo di presentazione E invece di e.

8.2.2 Larghezze dei campi e allineamento


In precedenza, utilizzavi le larghezze dei campi per formattare il testo in un numero di caratteri specificato
posizioni. Per impostazione predefinita, Python right0aligns numeri e leftaligns altri valori tali
come stringhe: racchiudiamo i risultati di seguito tra parentesi ([]) in modo da poter vedere come i valori
allineare nel campo:

lecca qui per visualizzare l'immagine del codice

In [1]: f '[ { 27 : 10 d} ]'

Uscita [1]: "[27]" Pagina 312

In [2]: f "[ { 3.5 : 10 f} ]"


Uscita [2]: "[3.500000]"
In [3]: f '[ { "hello" : 10 } ]'
Uscita [3]: "[ciao]"

Snippet [2] mostra che Python formatta valori float con sei cifre di precisione per
a destra del punto decimale per impostazione predefinita. Per i valori che hanno meno caratteri di
larghezza del campo, le posizioni dei caratteri rimanenti vengono riempite con spazi. Valori con più
i caratteri rispetto alla larghezza del campo utilizzano tutte le posizioni dei caratteri necessarie.

Specificare in modo esplicito l'allineamento a sinistra ea destra in un campo

Ricorda che puoi specificare l'allineamento sinistro e destro con <e>:

lecca qui per visualizzare l'immagine del codice

In [4]: ​f '[ { 27 : < 15 d} ]'


Uscita [4]: ​"[27]"

In [5]: f "[ { 3.5 : < 15 f} ]"


Uscita [5]: "[3.500000]"

In [6]: f '[ { "hello" :> 15 } ]'


Uscita [6]: "[ciao]"

Centrare un valore in un campo

Inoltre, puoi centrare i valori:

lecca qui per visualizzare l'immagine del codice

In [7]: f '[ { 27 : ^ 7 d} ]'


Uscita [7]: "[27]"

In [8]: f "[ { 3.5 : ^ 7.1 f} ]"


Uscita [8]: "[3.5]"

In [9]: f '[ { "hello" : ^ 7 } ]'


Uscita [9]: "[ciao]"

Il centraggio tenta di distribuire ugualmente a


a sinistra ea destra del valore formattato. Python posiziona lo spazio extra a destra se un file

C
Pagina 313
rimane un numero dispari di posizioni dei caratteri.

8.2.3 Formattazione numerica


Sono disponibili numerose funzionalità di formattazione numerica.

Formattazione di numeri positivi con segni

A volte è desiderabile forzare il segno su un numero positivo:

In [1]: f "[ { 27 : + 10 d} ]"


Uscita [1]: "[+27]"

Il + prima della larghezza del campo specifica che un numero positivo deve essere preceduto da un +.
Un numero negativo inizia sempre con a. Per riempire i caratteri rimanenti del campo
con 0 anziché spazi, inserire uno 0 prima della larghezza del campo (e dopo il + se c'è
uno):
In [2]: f "[ { 27 : + 010 d} ]"
Uscita [2]: "[+000000027]"

Utilizzo di uno spazio in cui apparirà un segno + con un valore positivo

Uno spazio indica che i numeri positivi dovrebbero mostrare un carattere spazio nel segno
posizione. Ciò è utile per allineare valori positivi e negativi a scopo di visualizzazione:

lecca qui per visualizzare l'immagine del codice

In [3]: print (f ' { 27 : d} \ n { 27 : d} \ n { 27 : d} ' )


27
27
27

Nota che i due numeri con uno spazio nei loro identificatori di formato si allineano. Se la larghezza di un campo
è specificato, lo spazio dovrebbe apparire prima della larghezza del campo.

Cifre di raggruppamento

È possibile formattare i numeri con migliaia di separatori utilizzando una virgola (,) , come
segue:

In [4]: ​f ' { 12345678:, d} '

Uscita [4]: ​'12, 345,678 ' Pagina 314

In [5]: f ' { 123.456,78 :, 0,2 f} '


Uscita [5]: "123,456,78"

8.2.4 Metodo del formato della stringa


Le stringhe di Python sono state aggiunte al linguaggio nella versione 3.6. Prima di allora, la formattazione
è stato eseguito con il formato del metodo stringa . In effetti, la formattazione di fstring è basata su
le capacità del metodo di formattazione. Ti mostriamo il metodo di formattazione qui perché
lo incontrerai nel codice scritto prima di Python 3.6. Vedrai spesso il formato

metodo nella documentazione di Python e nei numerosi libri e articoli di Python


scritto prima dell'introduzione di fstrings. Tuttavia, si consiglia di utilizzare il più recente f
formattazione delle stringhe che abbiamo presentato fino a questo punto.

Chiami il formato del metodo su una stringa di formato contenente segnaposto parentesi graffa ({}) ,
possibilmente con specificatori di formato. Si passano al metodo i valori da formattare. Facciamo
formattare il valore float 17.489 arrotondato alla posizione dei centesimi:

lecca qui per visualizzare l'immagine del codice

In [1]: ' {: .2 f} ' .format ( 17.489 )


Uscita [1]: '17 .49 '

In un segnaposto, se è presente un identificatore di formato, lo fai precedere da due punti (:), come in f

stringhe. Il risultato della chiamata di formattazione è una nuova stringa contenente i risultati formattati.

Segnaposto multipli

Una stringa di formato può contenere più segnaposto, nel qual caso il metodo di formato
gli argomenti corrispondono ai segnaposto da sinistra a destra:
lecca qui per visualizzare l'immagine del codice

In [2]: " {} {} " .format ( "Amanda" , "Cyan" )


Uscita [2]: "Amanda Cyan"

Riferimento agli argomenti per numero di posizione

La stringa di formato può fare riferimento ad argomenti specifici in base alla loro posizione nel formato
elenco degli argomenti del metodo, a partire dalla posizione 0:

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

In [3]: " { 0 } { 0 } { 1 } " .format ( "Happy" , "Birthday" )


Uscita [3]: "Happy Happy Birthday"

Nota che abbiamo usato due volte il numero di posizione 0 ("Happy"): puoi fare riferimento a ciascuno di essi
litigare tutte le volte che vuoi e in qualsiasi ordine.

Riferimento ad argomenti di parole chiave

Puoi fare riferimento agli argomenti delle parole chiave tramite le loro chiavi nei segnaposto:

lecca qui per visualizzare l'immagine del codice

In [4]: " {first} {last} " .format (first = "Amanda" , last = "Gray" )
Uscita [4]: ​"Amanda Gray"

In [5]: " {last} {first} " .format (first = "Amanda" , last = "Gray" )
Uscita [5]: "Grey Amanda"

8.3 CONCATENARE E RIPETERE STRINGHE


Nei capitoli precedenti, abbiamo usato l'operatore + per concatenare le stringhe e l'operatore * per
ripetere le stringhe. È inoltre possibile eseguire queste operazioni con assegnazioni aumentate.
Le stringhe non sono modificabili, quindi ogni operazione assegna un nuovo oggetto stringa alla variabile:

lecca qui per visualizzare l'immagine del codice

In [1]: s1 = "happy"

In [2]: s2 = "compleanno"

In [3]: s1 + = '' + s2

In [4]: ​s1
Uscita [4]: ​"buon compleanno"

In [5]: symbol = '>'

In [6]: simbolo * = 5

In [7]: simbolo
Uscita [7]: ">>>>>"

8C .4 RIMUOVERE LO SPAZIO BIANCO DALLE CORDE


Pagina 316
8.4 RIMOZIONE DI WHITESPACE DALLE STRINGHE
Esistono diversi metodi di stringa per rimuovere gli spazi bianchi dalle estremità di una stringa.
Ciascuno restituisce una nuova stringa lasciando l'originale non modificato. Le stringhe sono immutabili, quindi
ogni metodo che sembra modificare una stringa ne restituisce uno nuovo.

Rimozione di spazi bianchi iniziali e finali

Usiamo la striscia del metodo stringa per rimuovere lo spazio bianco iniziale e finale da un file
corda:

lecca qui per visualizzare l'immagine del codice

In [1]: frase = '\ t \ n Questa è una stringa di prova. \ t \ t \ n '

In [2]: phrase.strip ()
Out [2]: "Questa è una stringa di prova."

Rimozione degli spazi bianchi iniziali

Il metodo lstrip rimuove solo gli spazi bianchi iniziali :

lecca qui per visualizzare l'immagine del codice

In [3]: phrase.lstrip ()
Out [3]: 'Questa è una stringa di prova. \ t \ t \ n '

Rimozione degli spazi vuoti finali


Il metodo rstrip rimuove solo gli spazi vuoti finali:

lecca qui per visualizzare l'immagine del codice

In [4]: ​phrase.rstrip ()
Out [4]: ​"\ t \ n Questa è una stringa di prova."

Come dimostrano gli output, questi metodi rimuovono tutti i tipi di spazi, inclusi
spazi, nuove righe e tabulazioni.

8.5 CAMBIARE CASO CARATTERE


Nei capitoli precedenti, hai usato i metodi delle stringhe lower e upper per convertire le stringhe in all

C
Pagina 317
lettere minuscole o tutte maiuscole. Puoi anche modificare le maiuscole di una stringa con
metodi in maiuscolo e titolo.

Mettere in maiuscolo solo il primo carattere di una stringa

Il metodo capitalize copia la stringa originale e restituisce una nuova stringa con solo l'estensione
prima lettera maiuscola (a volte viene chiamata maiuscola della frase ):

lecca qui per visualizzare l'immagine del codice

In [1]: "buon compleanno". Maiuscola ()


Uscita [1]: "Buon compleanno"

Mettere in maiuscolo il primo carattere di ogni parola in una stringa

Il titolo del metodo copia la stringa originale e restituisce una nuova stringa con solo la prima
carattere di ogni parola in maiuscolo (questo è talvolta chiamato maiuscolo del titolo del libro ):
lecca qui per visualizzare l'immagine del codice

In [2]: 'strings: a deeper look'.title ()


Out [2]: "Strings: A Deeper Look"

8.6 OPERATORI DI CONFRONTO PER STRINGHE


Le stringhe possono essere confrontate con gli operatori di confronto. Ricorda che le stringhe sono
confrontati in base ai valori numerici interi sottostanti. Quindi lettere maiuscole
confrontare come meno delle lettere minuscole perché le lettere maiuscole hanno un numero intero inferiore
valori. Ad esempio, "A" è 65 e "a" è 97. Hai visto che puoi controllare il carattere

codici con ord:

lecca qui per visualizzare l'immagine del codice

In [1]: print (f 'A: {ord ( "A" )}; a: {ord ( "a" )} ' )


A: 65; a: 97

Confrontiamo le stringhe "Orange" e "orange" utilizzando gli operatori di confronto:

lecca qui per visualizzare l'immagine del codice

In [2]: "Orange" == "orange"

Fuori [2]: Falso Pagina 318

In [3]: "Orange" ! = "Orange"


Out [3]: Vero

In [4]: "Orange" < "orange"


Out [4]: ​vero

In [5]: "Orange" <= "orange"


Out [5]: Vero

In [6]: "Orange" > "orange"


Fuori [6]: Falso

In [7]: "Orange" > = "orange"


Fuori [7]: Falso

8.7 RICERCA DI SOTTOSTRINGHE


Puoi cercare in una stringa uno o più caratteri adiacenti, noti come sottostringa ,
per contare il numero di occorrenze, determinare se una stringa contiene una sottostringa,
o determinare l'indice in cui risiede una sottostringa in una stringa. Ogni metodo mostrato in
questa sezione confronta i caratteri lessicograficamente utilizzando il valore numerico sottostante
valori.

Conteggio delle occorrenze

Il conteggio del metodo String restituisce il numero di volte in cui il suo argomento ricorre nella stringa su
quale metodo si chiama:

lecca qui per visualizzare l'immagine del codice

In [1]: frase = "essere o non essere questa è la domanda"

In [2]: phrase.count ( 'to' )


Fuori [2]: 2

Se specifichi come secondo argomento un start_index , count ricerca solo la slice


stringa [ start_index :] - cioè da start_index fino alla fine della stringa:

lecca qui per visualizzare l'immagine del codice

In [3]: phrase.count ( 'to' , 12 )


Fuori [3]: 1

C
Pagina 319
Se specifichi come secondo e terzo argomento start_index e end_index ,
count cerca solo la stringa slice [ start_index : end_index ], ovvero da
start_index fino a, ma escluso, end_index :

lecca qui per visualizzare l'immagine del codice

In [4]: ​phrase.count ( 'that' , 12 , 25 )


Fuori [4]: ​1

Come count, ciascuno degli altri metodi di stringa presentati in questa sezione ha start_index

e end_index argomenti per cercare solo una porzione della stringa originale.

Individuazione di una sottostringa in una stringa

L' indice del metodo String cerca una sottostringa all'interno di una stringa e restituisce la prima
indice in cui si trova la sottostringa; in caso contrario, si verifica un'eccezione ValueError:

lecca qui per visualizzare l'immagine del codice

In [5]: phrase.index ( 'be' )


Fuori [5]: 3

Il metodo String rindex esegue la stessa operazione di index, ma cerca nel file
fine della stringa e restituisce l' ultimo indice in cui si trova la sottostringa; in caso contrario, a

ValueError si verifica:

lecca qui per visualizzare l'immagine del codice

In [6]: phrase.rindex ( 'be' )


Fuori [6]: 16

I metodi String find e rfind eseguono le stesse attività di index e rindex ma, if
la sottostringa non viene trovata, restituisce 1 invece di causare un'eccezione ValueError.

Determinare se una stringa contiene una sottostringa

Se hai bisogno di sapere solo se una stringa contiene una sottostringa, usa l'operatore in o no

nel:

lecca qui per visualizzare l'immagine del codice

C
Pagina 320
In [7]: "quello" nella frase
Out [7]: Vero
In [8]: "QUELLO" nella frase
Fuori [8]: Falso

In [9]: "QUELLO" non nella frase


Out [9]: Vero

Individuazione di una sottostringa all'inizio o alla fine di una stringa


Metodi String StartsWith e endswith ritorno True se la stringa inizia con o

termina con una sottostringa specificata:

lecca qui per visualizzare l'immagine del codice

In [10]: phrase.startswith ( 'to' )


Out [10]: Vero

In [11]: frase.startswith ( 'be' )


Out [11]: Falso

In [12]: frase.endswith ( 'domanda' )


Out [12]: Vero

In [13]: phrase.endswith ( 'quest' )


Out [13]: Falso

8.8 SOSTITUZIONE SOTTOSTRINGHE


Una manipolazione del testo comune consiste nell'individuare una sottostringa e sostituirne il valore. Metodo

sostituire richiede due sottostringhe. Cerca una stringa per la sottostringa nella sua prima
argomento e sostituisce ogni occorrenza con la sottostringa nel secondo argomento. Il
restituisce una nuova stringa contenente i risultati. Sostituiamo i caratteri di tabulazione con
virgole:

lecca qui per visualizzare l'immagine del codice

In [1]: values ​= "1 \ t2 \ t3 \ t4 \ t5"

In [2]: values.replace ( '\ t' , ',' )


Fuori [2]: "1,2,3,4,5"

Il metodo di sostituzione può ricevere un terzo argomento opzionale che specifica il massimo

C
Pagina 321
numero di sostituzioni da eseguire.

8.9 SEPARAZIONE E UNIRE LE STRINGHE


Quando leggi una frase, il tuo cervello la scompone in singole parole, o gettoni, ciascuna
di cui trasmette significato. Interpreti come IPython tokenize statement, breaking
in singoli componenti come parole chiave, identificatori, operatori e altro
elementi di un linguaggio di programmazione. I token in genere sono separati da spazi bianchi
caratteri come vuoto, tabulazione e nuova riga, sebbene possano essere utilizzati altri caratteri: il
i separatori sono noti come delimitatori .

Divisione delle corde

Abbiamo mostrato in precedenza che il metodo delle stringhe split senza argomenti tokenizza una stringa
suddividendolo in sottostringhe ad ogni carattere di spazio, quindi restituisce un elenco di token.
Per tokenizzare una stringa con un delimitatore personalizzato (come ogni coppia virgola e spazio),
specifica la stringa delimitatore (come, ',') che split usa per tokenizzare la stringa:
lecca qui per visualizzare l'immagine del codice

In [1]: lettere = "A, B, C, D"

In [2]: letters.split ( ',' )


Fuori [2]: ['A', 'B', 'C', 'D']

Se fornisci un numero intero come secondo argomento, specifica il numero massimo di


si divide. L'ultimo token è il resto della stringa dopo il numero massimo di divisioni:

lecca qui per visualizzare l'immagine del codice

In [3]: letters.split ( ',' , 2 )


Uscita [3]: ['A', 'B', 'C, D']

Esiste anche un metodo rsplit che esegue la stessa attività di split but process
il numero massimo di divisioni dalla fine della stringa all'inizio.

Unire le stringhe

Il join del metodo String concatena le stringhe nel suo argomento, che deve essere un file
iterabile contenente solo valori stringa; in caso contrario, si verifica un'eccezione TypeError. Il separatore
tra gli elementi concatenati c'è la stringa su cui chiami join. Il seguente

C
Pagina 322
codice crea stringhe contenenti elenchi di valori separati da virgole:

lecca qui per visualizzare l'immagine del codice

In [4]: ​letters_list = [ "A" , "B" , "C" , "D" ]


In [5]: ',' .join (letters_list)
Uscita [5]: "A, B, C, D"

Lo snippet successivo unisce i risultati di una comprensione dell'elenco che crea un elenco di stringhe:

lecca qui per visualizzare l'immagine del codice

In [6]: ',' .join ([str (i) for i in range ( 10 )])


Fuori [6]: "0,1,2,3,4,5,6,7,8,9"

Nel capitolo "File ed eccezioni" vedrai come lavorare con i file che contengono
valori separati da virgola. Questi sono noti come file CSV e sono un formato comune per
memorizzazione dei dati che possono essere caricati da applicazioni per fogli di calcolo come Microsoft Excel o
Fogli Google. Nei capitoli del case study sulla scienza dei dati, vedrai tante chiavi
le librerie, come NumPy, Pandas e Seaborn, forniscono funzionalità integrate per lavorare
con dati CSV.

String Methods partition e rpartition

La partizione del metodo String divide una stringa in una tupla di tre stringhe basata su
argomento separatore del metodo . Le tre corde sono

la parte della stringa originale prima del separatore,

il separatore stesso e

la parte della stringa dopo il separatore.


Questo potrebbe essere utile per dividere stringhe più complesse. Considera una stringa che rappresenta
il nome e i voti di uno studente:

"Amanda: 89, 97, 92"

Dividiamo la stringa originale nel nome dello studente, nel separatore ":" e in una stringa

che rappresenta l'elenco dei voti:

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

In [7]: 'Amanda: 89, 97, 92' .partition ( ':' )


Out [7]: ('Amanda', ':', '89, 97, 92 ')

Per cercare invece il separatore dalla fine della stringa, usa il metodo

rpartizione da dividere. Ad esempio, considera la seguente stringa URL:

' ttp: //www.deitel.com/books/PyCDS/table_of_contents.html "

Usiamo rpartition split "table_of_contents.html" dal resto dell'URL:

lecca qui per visualizzare l'immagine del codice

In [8]: url = "http://www.deitel.com/books/PyCDS/table_of_contents.html"

In [9]: rest_of_url, separator, document = url.rpartition ( '/' )

In [10]: document
Uscita [10]: "table_of_contents.html"

In [11]: rest_of_url
Uscita [11]: "http://www.deitel.com/books/PyCDS"

Linee di divisione del metodo stringa

Nel capitolo "File ed eccezioni" leggerai il testo da un file. Se leggi in grande


quantità di testo in una stringa, potresti voler dividere la stringa in un elenco di righe basato
sui caratteri di nuova riga. Il metodo splitlines restituisce un elenco di nuove stringhe che rappresentano
le righe di testo si dividono in corrispondenza di ogni carattere di nuova riga nella stringa originale. Ricorda quel Python
memorizza stringhe multilinea con caratteri \ n incorporati per rappresentare le interruzioni di riga, come
mostrato nello snippet [13]:

lecca qui per visualizzare l'immagine del codice

In [12]: lines = "" "Questa è la riga 1


...: Questa è la riga 2
...: questa è la riga 3 "" "

In [13]: righe
Out [13]: "Questa è la riga 1 \ nQuesta è la riga2 \ nQuesta è la riga3"

C
h

In [14]: lines.splitlines () Pagina 324


Out [14]: ["This is line 1", "This is line2", "This is line3"]
Passando True a splitlines mantiene i newline alla fine di ogni stringa:

lecca qui per visualizzare l'immagine del codice

In [15]: lines.splitlines ( True )


Out [15]: ["Questa è la riga 1 \ n", "Questa è la riga 2 \ n", "Questa è la riga 3"]

8.10 CARATTERI E TEST SUI CARATTERI


METODI
Molti linguaggi di programmazione hanno tipi di stringhe e caratteri separati. In Python, a
è semplicemente una stringa di un carattere.

Python fornisce metodi di stringa per verificare se una stringa corrisponde a determinati
caratteristiche. Ad esempio, il metodo stringa isdigit restituisce True se la stringa è attiva

che chiamate il metodo contiene solo i caratteri numerici (0–9). Potresti usare questo
durante la convalida dell'input dell'utente che deve contenere solo cifre:

lecca qui per visualizzare l'immagine del codice

In [1]: "27" .isdigit ()


Fuori [1]: Falso

In [2]: "27" .isdigit ()


Out [2]: vero

e il metodo stringa isalnum restituisce True se la stringa su cui si chiama il


metodo è alfanumerico, ovvero contiene solo cifre e lettere:

lecca qui per visualizzare l'immagine del codice

In [3]: 'A9876' .isalnum ()


Out [3]: Vero

In [4]: "123 Main Street" .isalnum ()


Fuori [4]: ​Falso

La tabella seguente mostra molti dei metodi di test dei caratteri. Ogni metodo restituisce

C
Pagina 325
anche se la condizione descritta non è soddisfatta:

Metodo String Descrizione

Restituisce True se la stringa contiene solo caratteri alfanumerici


isalnum ()
caratteri (cioè cifre e lettere).

Restituisce True se la stringa contiene solo caratteri alfabetici


isalpha ()
caratteri (cioè lettere).

Restituisce True se la stringa contiene solo un numero intero decimale


isdecimal () caratteri (ovvero, numeri interi in base 10) e non lo fa
contenere un segno + o.

Restituisce True se la stringa contiene solo cifre (ad es. "0",


isdigit ()
"1", "2").

isidentifier () Restituisce True se la stringa rappresenta un identificatore valido .

Restituisce True se tutti i caratteri alfabetici nella stringa lo sono


è più basso()
caratteri minuscoli (ad esempio, "a", "b", "c").

Restituisce True se i caratteri nella stringa rappresentano un

isnumeric () valore numerico senza segno + o e senza segno


punto decimale.

Restituisce True se la stringa contiene solo spazi


isspace ()
personaggi.

F
Pagina 326
Restituisce True se il primo carattere di ogni parola nel file
istitle () stringa è l'unico carattere maiuscolo nella parola.

Restituisce True se tutti i caratteri alfabetici nella stringa lo sono


isupper ()
caratteri maiuscoli (ad es. "A", "B", "C").

8.11 STRINGHE GREZZE


Ricorda che i caratteri backslash nelle stringhe introducono sequenze di escape, come \ n per
nuova riga e \ t per la tabulazione. Quindi, se desideri includere una barra rovesciata in una stringa, devi usare
due caratteri backslash \\. Ciò rende difficile leggere alcune stringhe. Per esempio,
Microsoft Windows utilizza le barre rovesciate per separare i nomi delle cartelle quando si specifica un file
Posizione. Per rappresentare la posizione di un file su Windows, potresti scrivere:

lecca qui per visualizzare l'immagine del codice

In [1]: file_path = "C: \\ MyFolder \\ MySubFolder \\ MyFile.txt"

In [2]: file_path
Uscita [2]: "C: \\ MyFolder \\ MySubFolder \\ MyFile.txt"

In questi casi, le stringhe grezze , precedute dal carattere r, sono più convenienti. Essi

considera ogni barra rovesciata come un carattere normale, piuttosto che l'inizio di una fuga
sequenza:

lecca qui per visualizzare l'immagine del codice


In [3]: file_path = r "C: \ MyFolder \ MySubFolder \ MyFile.txt"

In [4]: ​file_path
Uscita [4]: ​"C: \\ MyFolder \\ MySubFolder \\ MyFile.txt"

Python converte la stringa grezza in una stringa normale che utilizza ancora le due barre rovesciate
caratteri nella sua rappresentazione interna, come mostrato nell'ultimo frammento. Le corde grezze possono
rendi il tuo codice più leggibile, in particolare quando usi le espressioni regolari che noi
discuti nella sezione successiva. Le espressioni regolari spesso contengono molte barre rovesciate
personaggi.

8C .12 INTRODUZIONE ALLE ESPRESSIONI REGOLARI


Pagina 327
.12 INTRODUZIONE ALLE ESPRESSIONI REGOLARI
A volte dovrai riconoscere schemi nel testo, come numeri di telefono, e-mail
indirizzi, codici postali, indirizzi di pagine web, numeri di previdenza sociale e altro ancora. UN
stringa di espressione regolare descrive un modello di ricerca per la corrispondenza dei caratteri in
altre corde.

Le espressioni regolari possono aiutarti a estrarre dati da testo non strutturato, come social
post sui media. Sono anche importanti per garantire che i dati siano nel formato corretto
3
prima di tentare di elaborarlo.

3
L'argomento delle espressioni regolari potrebbe sembrare più impegnativo rispetto alla maggior parte degli altri Python
funzioni che hai utilizzato. Dopo aver imparato questo argomento, scriverai spesso codice più conciso
rispetto alle tradizionali tecniche di elaborazione delle stringhe, accelerando lo sviluppo del codice
processi. Ti occuperai anche di casi marginali a cui potresti non pensare normalmente, forse
evitando insetti sottili.

Convalida dei dati

Prima di lavorare con i dati di testo, userete spesso espressioni regolari per convalidare i dati .
Ad esempio, puoi verificare che:

Un codice postale degli Stati Uniti è composto da cinque cifre (come 02215) o cinque cifre seguite da a
trattino e altre quattro cifre (ad esempio 022154775).

Un cognome stringa contiene solo lettere, spazi, apostrofi e trattini.

Un indirizzo e-mail contiene solo i caratteri consentiti nell'ordine consentito.

Un numero di previdenza sociale statunitense contiene tre cifre, un trattino, due cifre, un trattino
e quattro cifre e aderisce ad altre regole sui numeri specifici che possono essere
utilizzato in ogni gruppo di cifre.

Raramente avrai bisogno di creare le tue espressioni regolari per elementi comuni come questi.
Siti web come

ttps: //regex101.com

ttp: //www.regexlib.com

ttps: //www.regularexpressions.info

8h
Pagina 328
e altri offrono archivi di espressioni regolari esistenti che puoi copiare e utilizzare.
Molti siti come questi forniscono anche interfacce in cui è possibile testare espressioni regolari
per determinare se soddisferanno le tue esigenze.

Altri usi delle espressioni regolari

Oltre a convalidare i dati, le espressioni regolari vengono spesso utilizzate per:

Estrarre i dati dal testo (a volte noto come scraping ), ad esempio, individuare tutto
URL in una pagina web. [Potresti preferire strumenti come BeautifulSoup, XPath e lxml.]

Pulizia dei dati: ad esempio, rimozione dei dati non necessari, rimozione dei duplicati
dati, gestione di dati incompleti, correzione di errori di battitura, garanzia di formati di dati coerenti,
trattare con valori anomali e altro ancora.

Trasforma i dati in altri formati, ad esempio riformattando i dati che erano


raccolti come valori separati da tabulazioni o spazi separati in valori separati da virgole
(CSV) per un'applicazione che richiede che i dati siano in formato CSV.

8.12.1 re Modulo e funzione fullmatch


Per usare le espressioni regolari, importa il modulo re della Python Standard Library :

In [1]: import re

Una delle più semplici funzioni delle espressioni regolari è fullmatch , che controlla se
l' intera stringa nel secondo argomento corrisponde al modello nel primo argomento.

Caratteri letterali corrispondenti

Cominciamo con la corrispondenza dei caratteri letterali , ovvero i caratteri che corrispondono a se stessi:

lecca qui per visualizzare l'immagine del codice

In [2]: pattern = "02215"

In [3]: "Match" se re.fullmatch (pattern, "02215" ) altrimenti "No match"


Out [3]: "Match"

In [4]: "Match" se re.fullmatch (pattern, "51220" ) altrimenti "Nessuna corrispondenza"


Uscita [4]: ​"Nessuna corrispondenza"

C
Pagina 329
Il primo argomento della funzione è il modello di espressione regolare da trovare. Qualsiasi stringa può
essere un'espressione regolare. Il valore del modello di variabile, "02215", contiene solo valori letterali

cifre che corrispondono a se stesse nell'ordine specificato. Il secondo argomento è la stringa


che dovrebbe corrispondere interamente al modello.

Se il secondo argomento corrisponde al modello nel primo argomento, fullmatch restituisce

un oggetto contenente il testo corrispondente, che restituisce True. Diremo di più su


questo oggetto più tardi. Nello snippet [4], anche se il secondo argomento contiene lo stesso
cifre come espressione regolare, sono in un ordine diverso . Quindi non c'è corrispondenza, e

fullmatch restituisce None, che restituisce False.

Metacaratteri, classi di caratteri e quantificatori

Le espressioni regolari contengono tipicamente vari simboli speciali chiamati metacaratteri ,


che sono mostrati nella tabella seguente:
Metacaratteri delle espressioni regolari

[] {} () \ * + ^ $? . |

Il \ metacharacter inizia ciascuna delle classi di caratteri predefinite , ciascuna

corrispondenza di un insieme specifico di caratteri. Convalidiamo un CAP di cinque cifre:

lecca qui per visualizzare l'immagine del codice

In [5]: "Valid" if re.fullmatch (r '\ d {5}' , '02215' ) else "Nonvalid"


Out [5]: "Valid"

In [6]: 'Valid' if re.fullmatch (r '\ d {5}' , '9876' ) else 'Nonvalid'


Uscita [6]: "Non valido"

Nell'espressione regolare \ d {5}, \ d è una classe di caratteri che rappresenta una cifra (0–9). UN
la classe di caratteri è una sequenza di escape di espressioni regolari che corrisponde a un carattere. Per
corrisponde a più di uno, segui la classe di caratteri con un quantificatore . Il quantificatore {5}
ripete \ d cinque volte, come se avessimo scritto \ d \ d \ d \ d \ d, in modo che corrisponda a cinque volte consecutive
cifre. Nello snippet [6], fullmatch restituisce Nessuno perché "9876" ne contiene solo quattro

caratteri di cifre consecutive.

O
C altre classi di caratteri predefinite

Altre classi di caratteri predefinite Pagina 330

La tabella seguente mostra alcune classi di caratteri predefinite comuni e i gruppi di


caratteri che corrispondono. Per far corrispondere qualsiasi metacarattere come valore letterale , farlo precedere da a
barra rovesciata (\). Ad esempio, \\ corrisponde a una barra rovesciata (\) e \ $ corrisponde a un segno di dollaro

($).

Carattere
Partite
classe

\d Qualsiasi cifra (0–9).

\D Qualsiasi carattere che non sia una cifra.

\S Qualsiasi carattere di spazio (come spazi, tabulazioni e nuove righe).

\S Qualsiasi carattere che non sia uno spazio vuoto.

Qualsiasi carattere alfanumerico (chiamato anche alfanumerico


\w carattere ): qualsiasi lettera maiuscola o minuscola, qualsiasi cifra
o un trattino basso

\W Qualsiasi carattere che non sia un carattere di parola.


Classi di caratteri personalizzati

Le parentesi quadre, [], definiscono una classe di caratteri personalizzata che corrisponde a un singolo

carattere. Ad esempio, [aeiou] corrisponde a una vocale minuscola, [AZ] corrisponde a una
lettera maiuscola, [az] corrisponde a una lettera minuscola e [azAZ] corrisponde a qualsiasi

lettera minuscola o maiuscola.

Pagina 331
Convalidiamo un semplice nome senza spazi o punteggiatura. Faremo in modo che sia così
inizia con una lettera maiuscola (A – Z) seguita da un numero qualsiasi di lettere minuscole
(a – z):

lecca qui per visualizzare l'immagine del codice

In [7]: "Valid" se re.fullmatch ( "[AZ] [az] *" , "Wally" ) altrimenti "Non valido"
Uscita [7]: "Valido"

In [8]: "Valid" if re.fullmatch ( "[AZ] [az] *" , "eva" ) else "Nonvalid"


Fuori [8]: "Non valido"

Un nome potrebbe contenere molte lettere. Il quantificatore * corrisponde a zero o più


occorrenze della sottoespressione alla sua sinistra (in questo caso, [az]). Quindi [AZ] [az] *

corrisponde a una lettera maiuscola seguita da zero o più lettere minuscole, come
"Amanda", "Bo" o anche "E".

Quando una classe di caratteri personalizzata inizia con un accento circonflesso (^) , la classe corrisponde a qualsiasi carattere
che è non è specificato. Quindi [^ az] corrisponde a qualsiasi carattere che non sia una lettera minuscola:

lecca qui per visualizzare l'immagine del codice

In [9]: "Match" se re.fullmatch ( "[^ az]" , "A" ) altrimenti "Nessuna corrispondenza"


Fuori [9]: "Match"

In [10]: "Match" se re.fullmatch ( "[^ az]" , "a" ) altrimenti "Nessuna corrispondenza"


Uscita [10]: "Nessuna corrispondenza"

I metacaratteri in una classe di caratteri personalizzata vengono trattati come caratteri letterali, ovvero i caratteri
personaggi stessi. Quindi [* + $] corrisponde a un singolo carattere *, + o $:

lecca qui per visualizzare l'immagine del codice

In [11]: "Match" se re.fullmatch ( "[* + $]" , "*" ) altrimenti "Nessuna corrispondenza"


Fuori [11]: "Match"

In [12]: "Match" se re.fullmatch ( "[* + $]" , "!" ) Altrimenti "Nessuna corrispondenza"


Uscita [12]: "Nessuna corrispondenza"

* rispetto a + Quantifier

Se vuoi richiedere almeno una lettera minuscola nel nome, puoi sostituire *

C
Pagina 332
quantificatore nello snippet [7] con + , che corrisponde ad almeno un'occorrenza di a

sottoespressione:
lecca qui per visualizzare l'immagine del codice

In [13]: "Valid" if re.fullmatch ( "[AZ] [az] +" , "Wally" ) else "Nonvalid"


Out [13]: "Valid"

In [14]: "Valid" if re.fullmatch ( "[AZ] [az] +" , "E" ) else "Nonvalid"


Uscita [14]: "Non valido"

Sia * che + sono avidi: corrispondono al maggior numero di caratteri possibile. Quindi il normale
espressione [AZ] [az] + corrisponde a "Al", "Eva", "Samantha", "Benjamin" e qualsiasi

altre parole che iniziano con una lettera maiuscola seguite almeno una lettera minuscola.

Altri quantificatori
Il ? quantificatore corrisponde a zero o una occorrenza di una sottoespressione:

lecca qui per visualizzare l'immagine del codice

In [15]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labeled' ) else 'No match'
Out [15]: "Match"

In [16]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labeled' ) else 'No match'
Fuori [16]: "Match"

In [17]: 'Match' if re.fullmatch ( ' labell ? Ed' , 'labellled' ) else 'No matc'
ut [17]: "Nessuna corrispondenza"

L'espressione regolare labell? Ed corrisponde a labeled (ortografia inglese britannico) e

etichettato (l'ortografia inglese degli Stati Uniti), ma non la parola errata etichettata. In ciascuna
snippet sopra, i primi cinque caratteri letterali nell'espressione regolare (etichetta) corrispondono
i primi cinque caratteri dei secondi argomenti. Allora io? indica che ci possono essere

zero o uno in più l caratteri prima dei restanti caratteri letterali ed.

Puoi abbinare almeno n occorrenze di una sottoespressione con il quantificatore { n ,} .


La seguente espressione regolare corrisponde a stringhe contenenti almeno tre cifre:

lecca qui per visualizzare l'immagine del codice

C
O

Pagina 333
In [18]: "Match" se re.fullmatch (r '\ d {3,}' , '123' ) altrimenti "Nessuna corrispondenza"
Fuori [18]: "Match"

In [19]: "Match" if re.fullmatch (r '\ d {3,} " , " 1234567890 " ) altrimenti " Nessuna corrispondenza
ut [19]: "Match"

In [20]: "Match" se re.fullmatch (r '\ d {3,}' , '12' ) altrimenti "Nessuna corrispondenza"


Out [20]: "Nessuna corrispondenza"

È possibile trovare una corrispondenza tra n e m (incluse) occorrenze di una sottoespressione con

{ n , m } quantificatore . La seguente espressione regolare corrisponde a stringhe contenenti da 3 a


6 cifre:

lecca qui per visualizzare l'immagine del codice

In [21]: 'Match' if re.fullmatch (r '\ d {3,6}' , '123' ) else 'No match'


Fuori [21]: "Match"

In [22]: 'Match' if re.fullmatch (r '\ d {3,6}' , '123456' ) else 'No match'


Fuori [22]: "Match"

In [23]: "Match" if re.fullmatch (r '\ d {3,6} " , " 1234567 " ) altrimenti " Nessuna corrispondenza "
Uscita [23]: "Nessuna corrispondenza"

In [24]: 'Match' se re.fullmatch (r '\ d {3,6}' , '12' ) altrimenti 'Nessuna corrispondenza'


Out [24]: "Nessuna corrispondenza"

8.12.2 Sostituzione di sottostringhe e suddivisione di stringhe


Il modulo re fornisce la funzione sub per sostituire i pattern in una stringa e function

split per rompere una stringa in pezzi, in base a modelli.

Funzione sub - Sostituzione di modelli

Per impostazione predefinita, la funzione secondaria del modulo re sostituisce tutte le occorrenze di un pattern con
il testo sostitutivo specificato. Convertiamo una stringa delimitata da tabulazione in virgola
delimitato:

lecca qui per visualizzare l'immagine del codice

In [1]: import re

In [2]: re.sub (r '\ t' , ',' , '1 \ t2 \ t3 \ t4' )

C
O

Uscita [2]: "1, 2, 3, 4" Pagina 334

La funzione sub riceve tre argomenti obbligatori:

il modello da abbinare (il carattere di tabulazione '\ t')

il testo sostitutivo (',') e

la stringa da cercare ('1 \ t2 \ t3 \ t4')

e restituisce una nuova stringa. Il conteggio dell'argomento della parola chiave può essere utilizzato per specificare il file
numero massimo di sostituzioni:

lecca qui per visualizzare l'immagine del codice

In [3]: re.sub (r '\ t' , ',' , '1 \ t2 \ t3 \ t4' , count = 2 )


Uscita [3]: "1, 2, 3 \ t4"

Funzione split

La funzione split tokenizza una stringa, utilizzando un'espressione regolare per specificare il file
delimitatore e restituisce un elenco di stringhe. Tokenizziamo una stringa dividendola in qualsiasi
virgola seguita da 0 o più spazi vuoti: \ s è lo spazio bianco
classe di caratteri e * indica zero o più occorrenze del precedente
sottoespressione:

lecca qui per visualizzare l'immagine del codice

In [4]: ​re.split (r ', \ s *' , '1, 2, 3,4, 5,6,7,8' )


Fuori [4]: ​["1", "2", "3", "4", "5", "6", "7", "8"]
Utilizza l'argomento della parola chiave maxsplit per specificare il numero massimo di divisioni:

lecca qui per visualizzare l'immagine del codice

In [5]: re.split (r ', \ s *' , '1, 2, 3,4, 5,6,7,8' , maxsplit = 3 )


Uscita [5]: ['1', '2', '3', '4, 5,6,7,8']

In questo caso, dopo le 3 divisioni, la quarta stringa contiene il resto della stringa originale.

8C .12.3 Altre funzioni di ricerca; Accesso alle partite

8.12.3 Altre funzioni di ricerca; Accesso alle partite Pagina 335

In precedenza abbiamo utilizzato la funzione fullmatch per determinare se un'intera stringa


corrispondeva a un'espressione regolare. Ci sono molte altre funzioni di ricerca. Qui noi
discutere le funzioni cerca, abbina, trova tutto e trova e mostra come farlo
accedere alle sottostringhe corrispondenti.

Ricerca di funzioni: trovare la prima corrispondenza ovunque in una stringa

La ricerca di funzione cerca in una stringa la prima occorrenza di una sottostringa che corrisponde a un file

espressione regolare e restituisce un oggetto match (di tipo SRE_Match ) che contiene l' estensione
sottostringa corrispondente. Il metodo group dell'oggetto match restituisce quella sottostringa:

lecca qui per visualizzare l'immagine del codice

In [1]: import re

In [2]: result = re.search ( 'Python' , 'Python is fun' )

In [3]: result.group () if result else 'not found'


Uscita [3]: "Python"

La ricerca della funzione restituisce Nessuno se la stringa non contiene il modello:

lecca qui per visualizzare l'immagine del codice

In [4]: ​result2 = re.search ( 'fun!' , 'Python is fun' )

In [5]: result2.group () if result2 else 'not found'


Out [5]: "non trovato"

Puoi cercare una corrispondenza solo all'inizio di una stringa con corrispondenza di funzione .

Ignorare maiuscole e minuscole con i flag facoltativi Argomento parola chiave

Molte funzioni del modulo re ricevono un argomento di parola chiave flag opzionale che cambia
come vengono abbinate le espressioni regolari. Ad esempio, le corrispondenze distinguono tra maiuscole e minuscole da
predefinito, ma utilizzando la costante IGNORECASE del modulo re, è possibile eseguire un caso
ricerca insensibile :

lecca qui per visualizzare l'immagine del codice

In [6]: result3 = re.search ( 'Sam' , 'SAM WHITE' , flags = re.IGNORECASE )

C
Pagina 336
In [7]: result3.group () if result3 else 'not found'
Uscita [7]: "SAM"

Qui, "SAM" corrisponde al modello "Sam" perché entrambi hanno anche le stesse lettere
sebbene "SAM" contenga solo lettere maiuscole.

Metacaratteri che limitano le corrispondenze all'inizio o alla fine di una stringa

Il metacarattere ^ all'inizio di un'espressione regolare (e non all'interno di square

parentesi) è un'ancora che indica che l'espressione corrisponde solo all'inizio di a


corda:

lecca qui per visualizzare l'immagine del codice

In [8]: result = re.search ( '^ Python' , 'Python is fun' )

In [9]: result.group () if result else 'not found'


Uscita [9]: "Python"

In [10]: result = re.search ( '^ fun' , 'Python is fun' )

In [11]: result.group () if result else 'not found'


Out [11]: "non trovato"

Allo stesso modo, il metacarattere $ alla fine di un'espressione regolare è un'ancora

indicando che l'espressione corrisponde solo alla fine di una stringa:

lecca qui per visualizzare l'immagine del codice

In [12]: result = re.search ( 'Python $' , 'Python is fun' )

In [13]: result.group () if result else 'not found'


Out [13]: "non trovato"

In [14]: result = re.search ( 'fun $' , 'Python is fun' )

In [15]: result.group () if result else 'not found'


Out [15]: "fun"

Funzione findall e finditer: ricerca di tutte le corrispondenze in una stringa

La funzione findall trova ogni sottostringa corrispondente in una stringa e restituisce un elenco di
sottostringhe corrispondenti. Estraiamo tutti i numeri di telefono degli Stati Uniti da una stringa. Per
semplicità supporremo che i numeri di telefono degli Stati Uniti abbiano il formato ##########:

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

In [16]: contact = "Wally White, Home: 5555551234, Work: 5555554321"

In [17]: re.findall (r '\ d {3} \ d {3} \ d {4}' , contact)


Uscita [17]: ["5555551234", "5555554321"]

La funzione finditer funziona come findall, ma restituisce un iterabile pigro di oggetti match.
Per un gran numero di corrispondenze, l'uso di finditer può far risparmiare memoria perché ritorna
una corrispondenza alla volta, mentre findall restituisce tutte le corrispondenze contemporaneamente:

lecca qui per visualizzare l'immagine del codice

In [18]: per telefono in re.finditer (r '\ d {3} \ d {3} \ d {4}' , contatto):


...: print (phone.group ())
...:
5555551234
5555554321

Acquisizione di sottostringhe in una corrispondenza

Puoi usare i metacaratteri delle parentesi - ( e ) - per catturare sottostringhe in un file


incontro. Ad esempio, acquisiamo come sottostringhe separate il nome e l'indirizzo e-mail
nella stringa di testo:

lecca qui per visualizzare l'immagine del codice

In [19]: text = "Charlie Cyan, email: demo1@deitel.com"

In [20]: pattern = r '([AZ] [az] + [AZ] [az] +), email: (\ w + @ \ w + \. \ W {3})

n [21]: risultato = re.search (pattern, text)

L'espressione regolare specifica due sottostringhe da acquisire, ciascuna indicata con


metacaratteri (e). Questi metacaratteri non influenzano se il pattern è
trovato nella stringa di testo: la funzione match restituisce un oggetto match solo se intero

pattern si trova nella stringa di testo.

Consideriamo l'espressione regolare:

'([AZ] [az] + [AZ] [az] +)' corrisponde a due parole separate da uno spazio. Ogni

C
io

Pagina 338
la parola deve avere una lettera maiuscola iniziale.

", email:" contiene caratteri letterali che corrispondono a se stessi.

(\ w + @ \ w + \. \ w {3}) corrisponde a un semplice indirizzo email composto da uno o più


caratteri alfanumerici (\ w +), il carattere @, uno o più caratteri alfanumerici
caratteri (\ w +), un punto (\.) e tre caratteri alfanumerici (\ w {3}). Noi

ha preceduto il punto con \ perché un punto (.) è un metacarattere di un'espressione regolare che
corrisponde a un carattere.

Il metodo groups dell'oggetto match restituisce una tupla delle sottostringhe catturate:

lecca qui per visualizzare l'immagine del codice

In [22]: result.groups ()
Uscita [22]: ('Charlie Cyan', 'demo1@deitel.com')

Il metodo di gruppo dell'oggetto match restituisce l' intera corrispondenza come una singola stringa:

lecca qui per visualizzare l'immagine del codice

In [23]: result.group ()
Uscita [23]: "Charlie Cyan, email: demo1@deitel.com"

È possibile accedere a ciascuna sottostringa acquisita passando un numero intero al metodo group.
Le sottostringhe catturate sono numerate da 1 (a differenza degli indici di lista, che iniziano da 0):

lecca qui per visualizzare l'immagine del codice


In [24]: result.group ( 1 )
Uscita [24]: "Charlie Cyan"

In [25]: result.group ( 2 )
Uscita [25]: "demo1@deitel.com"

8.13 INTRO A DATA SCIENCE: PANDAS, REGULAR


ESPRESSIONI E MUNGING DEI DATI
I dati non sempre arrivano in forme pronte per l'analisi. Potrebbe, ad esempio, essere in
formato sbagliato, errato o addirittura mancante. L'esperienza nel settore ha dimostrato che i dati

C
Pagina 339
i cientisti possono dedicare fino al 75% del loro tempo alla preparazione dei dati prima di iniziare
studi. La preparazione dei dati per l'analisi è chiamata data munging o data wrangling .
Questi sono sinonimi: da questo punto in avanti diremo mungitura dei dati.

Due dei passaggi più importanti nel munging dei dati sono la pulizia e la trasformazione dei dati
dati nei formati ottimali per i vostri sistemi di database e software di analisi. Alcuni
esempi comuni di pulizia dei dati sono:

eliminare le osservazioni con valori mancanti,

sostituire valori ragionevoli con valori mancanti,

eliminare le osservazioni con valori errati,

sostituire valori ragionevoli con valori errati,

lanciare valori anomali (anche se a volte vorrai mantenerli),

eliminazione dei duplicati (anche se a volte i duplicati sono validi),

trattare con dati incoerenti,

e altro ancora.

Probabilmente stai già pensando che la pulizia dei dati sia un processo difficile e disordinato
dove potresti facilmente prendere decisioni sbagliate che avrebbero un impatto negativo sui tuoi risultati.
Questo è corretto. Quando arriverai ai casi di studio sulla scienza dei dati nei capitoli successivi, lo farai
vedere che la scienza dei dati è più una scienza empirica , come la medicina, e meno una scienza
scienza teorica, come la fisica teorica. Le scienze empiriche basano le loro conclusioni
su osservazioni ed esperienze. Ad esempio, molti farmaci che risolvono efficacemente
problemi medici odierni sono stati sviluppati osservando gli effetti che le prime versioni di
questi farmaci erano su animali da laboratorio e, infine, sugli esseri umani, e si raffinavano gradualmente
ingredienti e dosaggi. Le azioni intraprese dai data scientist possono variare a seconda del progetto
sulla qualità e la natura dei dati ed essere influenzato dall'evoluzione dell'organizzazione e
standard professionali.

Alcune trasformazioni di dati comuni includono:

rimozione di dati e funzionalità non necessari (diremo di più sulle funzionalità nel file data
studi di casi scientifici),

S
Pagina 340
combinando caratteristiche correlate,
campionamento dei dati per ottenere un sottoinsieme rappresentativo (vedremo nel caso della scienza dei dati
studi che il campionamento casuale è particolarmente efficace per questo e diremo perché),

standardizzare i formati dei dati,

dati di raggruppamento,

e altro ancora.

È sempre consigliabile conservare i dati originali. Mostreremo semplici esempi di pulizia


e trasformare i dati nel contesto di Pandas Series e DataFrames.

Pulizia dei dati

Valori di dati errati e valori mancanti possono avere un impatto significativo sull'analisi dei dati. Alcuni dati
gli scienziati sconsigliano qualsiasi tentativo di inserire "valori ragionevoli". Invece, loro
sostengono di contrassegnare chiaramente i dati mancanti e lasciare che sia compito del pacchetto di analisi dei dati
4
gestire il problema. Altri offrono forti cautele.

4
Questa nota a piè di pagina è stata estratta da un commento inviatoci il 20 luglio 2018 da uno dei
revisori di libri, il dottor Alison Sanchez della University of San Diego School of Business.
Ha commentato: essere cauti quando si parla di "sostituzione di valori ragionevoli" per
valori mancanti o cattivi. Un severo avvertimento: "sostituire" valori che aumentano le statistiche
importanza o fornire risultati più "ragionevoli" o "migliori" non è consentito. 'Sostituzione'
i dati non dovrebbero trasformarsi in dati "fudging". La prima regola che i lettori dovrebbero imparare è di non farlo
eliminare o modificare i valori che contraddicono le loro ipotesi. 'Sostituzione ragionevole
valori 'non significa che i lettori dovrebbero sentirsi liberi di cambiare i valori per ottenere i risultati che vogliono
voglio.

Consideriamo un ospedale che registra le temperature dei pazienti (e probabilmente altri vitali
segni) quattro volte al giorno. Supponiamo che i dati siano costituiti da un nome e quattro float
valori, come

[ "Brown, Sue" , 98.6 , 98.4 , 98.7 , 0.0 ]

Le prime tre temperature registrate del paziente precedente sono 99,7, 98,4 e 98,7. Il
l'ultima temperatura era mancante e registrata come 0.0, forse perché il sensore
mal funzionante. La media dei primi tre valori è 98,57, che è quasi normale.

Pagina 341
Tuttavia, se si calcola la temperatura media compreso il valore mancante per
cui 0,0 è stato sostituito, la media è solo 73,93, risultato chiaramente discutibile.
Certamente, i medici non vorrebbero intraprendere azioni correttive drastiche su questo paziente - lo è
fondamentale per "ottenere i dati corretti".

Un modo comune per pulire i dati è sostituire un valore ragionevole per i dati mancanti
temperatura, come la media delle altre letture del paziente. Se l'avessimo fatto
sopra, la temperatura media del paziente rimarrebbe 98,57, molto più probabile
temperatura media, in base alle altre letture.

Convalida dei dati

Cominciamo creando una serie di codici postali a cinque cifre da un dizionario di città
nome / fivedigitZIPCode coppie chiave-valore. Abbiamo inserito intenzionalmente un ZIP non valido
Codice per Miami:
lecca qui per visualizzare l'immagine del codice

In [1]: importa i panda come pd

In [2]: zips = pd.Series ({ 'Boston' : '02215' , 'Miami' : '3310' })

In [3]: zip
Fuori [3]:
Boston 02215
Miami 3310
dtype: oggetto

Sebbene le cerniere sembrino un array bidimensionale, in realtà è unidimensionale. Il


"Seconda colonna" rappresenta i valori del codice postale della serie (dal dizionario
valori) e la "prima colonna" rappresenta i loro indici (dalle chiavi del dizionario).

Possiamo usare espressioni regolari con Panda per convalidare i dati. L' attributo str di a

Series fornisce l'elaborazione delle stringhe e vari metodi di espressione regolare. Usiamo
il metodo di corrispondenza dell'attributo str per verificare se ogni CAP è valido:

lecca qui per visualizzare l'immagine del codice

In [4]: ​zips.str.match (r '\ d {5}' )


Fuori [4]:
Boston True
Miami False
dtype: bool

C
Pagina 342
La corrispondenza del metodo applica l'espressione regolare \ d {5} a ogni elemento della serie,

cercando di garantire che l'elemento sia composto esattamente da cinque cifre. Non
bisogno di scorrere in modo esplicito tutti i codici postali: match lo fa per te. Questo è

un altro esempio di programmazione in stile funzionale con interni piuttosto che esterni
iterazione. Il metodo restituisce una nuova serie contenente True per ogni elemento valido.
In questo caso, il codice postale di Miami non corrisponde, quindi il suo elemento è False.

Esistono diversi modi per gestire i dati non validi. Uno è catturarlo alla fonte e
interagire con la sorgente per correggere il valore. Non è sempre possibile. Per esempio,
i dati potrebbero provenire da sensori ad alta velocità nell'Internet of Things. In ciò
caso, non saremmo in grado di correggerlo alla fonte, quindi potremmo applicare la pulizia dei dati
tecniche. Nel caso del cattivo codice postale di Miami di 3310, potremmo cercare Miami
Codici postali che iniziano con 3310. Ce ne sono due, 33101 e 33109, e potremmo scegliere

uno di quelli.

A volte, piuttosto che abbinare un intero valore a un modello, vorrai sapere


se un valore contiene una sottostringa che corrisponde al modello. In questo caso, usa il metodo

contiene invece di match. Creiamo una serie di stringhe, ciascuna contenente un US


città, stato e CAP, quindi determina se ogni stringa contiene una sottostringa
corrispondente al modello "[AZ] {2}" (uno spazio, seguito da due lettere maiuscole,
seguito da uno spazio):

lecca qui per visualizzare l'immagine del codice

In [5]: cities = pd.Series ([ 'Boston, MA 02215' , 'Miami, FL 33101' ])

In [6]: città
Fuori [6]:
0 Boston, MA 02215
1 Miami, FL 33101
dtype: oggetto
In [7]: cities.str.contains (r '[AZ] {2}' )
Fuori [7]:
0 Vero
1 Vero
dtype: bool

In [8]: cities.str.match (r '[AZ] {2}' )


Fuori [8]:
0 Falso
1 Falso
dtype: bool

C
Pagina 343
Non abbiamo specificato i valori dell'indice, quindi la serie utilizza indici a base zero per impostazione predefinita
(snippet [6]). Lo snippet [7] usa contiene per mostrare che entrambi gli elementi della serie

contengono sottostringhe che corrispondono a "[AZ] {2}". Lo snippet [8] utilizza la corrispondenza per dimostrarlo
il valore di nessuno dei due elementi corrisponde a quel modello nella sua interezza, perché ognuno ne ha un altro
caratteri nel suo valore completo.

Riformattazione dei dati

Abbiamo discusso della pulizia dei dati. Consideriamo ora l'unione dei dati in un formato diverso.
Come semplice esempio, si supponga che un'applicazione richieda numeri di telefono statunitensi in
formato ##########, con trattini che separano ogni gruppo di cifre. Il telefono
i numeri ci sono stati forniti come stringhe di 10 cifre senza trattini. Creiamo il file

DataFrame:

lecca qui per visualizzare l'immagine del codice

In [9]: contatti = [[ 'Mike Green' , 'demo1@deitel.com' , '5555555555' ],


...: [ "Sue Brown" , "demo2@deitel.com" , "5555551234" ]]
...:

In [10]: contactsdf = pd.DataFrame (contatti,


...: colonne = [ "Nome" , "Email" , "Telefono" ])
...:

In [11]: contactsdf
Fuori [11]:
Nome Email Telefono
0 Mike Green demo1@deitel.com 5555555555
1 Sue Brown demo2@deitel.com 5555551234

In questo DataFrame, abbiamo specificato gli indici di colonna tramite l'argomento della parola chiave column
ma non ha specificato gli indici di riga, quindi le righe sono indicizzate da 0. Inoltre, l'output mostra
i valori della colonna sono allineati a destra per impostazione predefinita. Questo differisce dalla formattazione Python in
quali numeri in un campo sono allineati a destra per impostazione predefinita, ma i valori non numerici vengono lasciati
allineato per impostazione predefinita.

Ora, munge i dati con una programmazione un po 'più funzionale. Noi possiamo
mappare i numeri di telefono nel formato corretto chiamando la mappa del metodo Series su

la colonna "Telefono" di DataFrame. L'argomento della mappa del metodo è una funzione che riceve
un valore e restituisce il valore mappato . La funzione get_formatted_phone maps 10

cifre consecutive nel formato ##########:

lecca qui per visualizzare l'immagine del codice

C
Pagina 344
n [12]: import re
In [13]: def get_formatted_phone (value):
...: risultato = re.fullmatch (r '(\ d {3}) (\ d {3}) (\ d {4})' , valore)
...: return '' .join (result.groups ()) if result else value
...:
...:

L'espressione regolare nella prima istruzione del blocco corrisponde solo a 10 cifre consecutive.
Cattura le sottostringhe contenenti le prime tre cifre, le tre cifre successive e l'ultima
quattro cifre. L'istruzione return funziona come segue:

Se il risultato è Nessuno, restituiamo semplicemente il valore non modificato.

Altrimenti, chiamiamo result.groups () per ottenere una tupla contenente il file acquisito

sottostringhe e passa la tupla al metodo stringa join per concatenare gli elementi,
separandoli dal successivo con "" per formare il numero di telefono mappato.

La mappa del metodo della serie restituisce una nuova serie contenente i risultati della chiamata di
argomento della funzione per ogni valore nella colonna. Lo snippet [15] mostra il risultato,

incluso il nome e il tipo della colonna:

lecca qui per visualizzare l'immagine del codice

In [14]: formatted_phone = contactsdf [ 'Phone' ] .map (get_formatted_phone)

In [15]: formatted_phone
0 5555555555
1 5555551234
Nome: telefono, dtype: oggetto

Dopo aver verificato che i dati siano nel formato corretto, puoi aggiornarli nel file
DataFrame originale assegnando la nuova serie alla colonna "Telefono":

lecca qui per visualizzare l'immagine del codice

In [16]: contactsdf [ 'Phone' ] = formatted_phone

In [17]: contactdf
Fuori [17]:
Nome Email Telefono
0 Mike Green demo1@deitel.com 5555555555
1 Sue Brown demo2@deitel.com 5555551234

C
io

Pagina 345

Continueremo la nostra discussione sui panda nell'introduzione alla scienza dei dati del prossimo capitolo
sezione, e useremo i panda in diversi capitoli successivi.

8.14 WRAP-UP
In questo capitolo sono state presentate varie funzionalità di formattazione ed elaborazione delle stringhe. tu
dati formattati in fstrings e con il formato del metodo stringa. Abbiamo mostrato il file
assegnazioni aumentate per concatenare e ripetere stringhe. Hai usato la stringa
metodi per rimuovere gli spazi all'inizio e alla fine delle stringhe e per modificare
il loro caso. Abbiamo discusso metodi aggiuntivi per dividere le stringhe e per unire
iterabili di stringhe. Abbiamo introdotto vari metodi di test dei caratteri.

Abbiamo mostrato stringhe non elaborate che trattano i backslash (\) come caratteri letterali anziché come caratteri
inizio delle sequenze di escape. Questi erano particolarmente utili per definire regolari
espressioni, che spesso contengono molti backslash.

Successivamente, abbiamo introdotto le potenti capacità di patternmatching delle espressioni regolari


con funzioni dal modulo re. Abbiamo utilizzato la funzione fullmatch per garantire che un file

l'intera stringa corrisponde a un modello, utile per la convalida dei dati. Abbiamo mostrato come farlo
utilizzare la funzione di sostituzione per cercare e sostituire le sottostringhe. Abbiamo usato la divisione

funzione per tokenizzare le stringhe in base a delimitatori che corrispondono a un'espressione regolare
modello. Quindi abbiamo mostrato vari modi per cercare pattern nelle stringhe e per accedere
le corrispondenze risultanti.

Nella sezione Intro to Data Science, abbiamo introdotto i sinonimi data munging e
data wrangling e ha mostrato l'operazione di munging dei dati del campione, vale a dire la trasformazione
dati. Abbiamo continuato la nostra discussione sulla serie di Panda e sui DataFrame utilizzando
espressioni regolari per convalidare e munge i dati.

Nel prossimo capitolo, continueremo a utilizzare varie capacità di elaborazione delle stringhe come abbiamo fatto
introdurre la lettura di testo da file e la scrittura di testo su file. Useremo il modulo csv per
manipolazione di file con valori separati da virgole (CSV). Introdurremo anche l'eccezione
in modo da poter elaborare le eccezioni man mano che si verificano, anziché visualizzare un file
rintracciare.

W
Pagina 346

storia . File ed eccezioni


Obiettivi
opiche

In questo capitolo potrai:


guadagnando Pat

Comprendere le nozioni di file e dati persistenti.


ffers & Dea

Leggi, scrivi e aggiorna i file.


ighlights

Leggere e scrivere file CSV, un formato comune per i set di dati di machine learning.
ettings

Serializza gli oggetti nel formato di scambio dati JSON, comunemente utilizzato per la trasmissione
su Internet
Supporto e deserializza JSON in oggetti.

Disconnessione
Usa l'istruzione with per assicurarti che le risorse vengano rilasciate correttamente, evitando
"Perdite di risorse".

Utilizzare l'istruzione try per delimitare il codice in cui possono verificarsi e gestire eccezioni
quelle eccezioni con clausole di eccezione associate.

Utilizzare la clausola else dell'istruzione try per eseguire il codice quando non si verificano eccezioni nel file

prova la suite.
Utilizzare la clausola finalmente dell'istruzione try per eseguire il codice indipendentemente dal fatto che un file
si verifica un'eccezione nel tentativo.

sollevare eccezioni per indicare problemi di runtime.

Comprendere il traceback di funzioni e metodi che hanno portato a un'eccezione.

Usa i panda per caricare in un DataFrame ed elaborare il set di dati CSV di Titanic Disaster.

Contorno

9
Pagina 347
.1 Introduzione

.2 File

.3 Elaborazione di file di testo

.3.1 Scrittura su un file di testo: presentazione dell'istruzione with

.3.2 Lettura di dati da un file di testo

.4 Aggiornamento dei file di testo

.5 Serializzazione con JSON

.6 Focus sulla sicurezza: serializzazione e deserializzazione pickle

.7 Note aggiuntive sui file

.8 Gestione delle eccezioni

.8.1 Divisione per zero e input non valido

.8.2 provare le dichiarazioni

.8.3 Rilevamento di più eccezioni in una clausola esclusa

.8.4 Quali eccezioni genera una funzione o un metodo?

.8.5 Quale codice dovrebbe essere inserito in una suite di prova?

.9 infine Clausola

.10 Sollevare esplicitamente un'eccezione

.11 (Opzionale) Stack Svolgimento e Traceback

.12 Introduzione alla scienza dei dati: utilizzo dei file CSV

.12.1 Modulo libreria standard Python csv

.12.2 Lettura di file CSV in Pandas DataFrame

.12.3 Lettura del set di dati di Titanic Disaster

9
Pagina 348
.12.4 Semplice analisi dei dati con il set di dati Titanic Disaster
.12.5 Istogramma dell'età dei passeggeri

.13 WrapUp

9.1 INTRODUZIONE
Variabili, elenchi, tuple, dizionari, insiemi, array, serie di panda e panda

I DataFrames offrono solo l'archiviazione temporanea dei dati. I dati vengono persi quando una variabile locale
"Esce dall'ambito" o quando il programma termina. I file forniscono una conservazione a lungo termine
di quantità generalmente elevate di dati, anche dopo il programma che ha creato i dati
termina, quindi i dati conservati nei file sono persistenti. I computer archiviano i file sul secondario
dispositivi di archiviazione, comprese unità a stato solido, dischi rigidi e altro ancora. In questo capitolo, noi
spiegare come i programmi Python creano, aggiornano ed elaborano i file di dati.

Consideriamo file di testo in diversi formati popolari: testo normale, JSON (JavaScript Object
Notazione) e CSV (valori separati da virgole). Useremo JSON per serializzare e
deserializzare gli oggetti per facilitare il salvataggio di tali oggetti nell'archivio secondario e
trasmettendoli su Internet. Assicurati di leggere l'Intro to Data Science di questo capitolo
sezione in cui useremo sia il modulo csv della libreria standard Python che pandas
per caricare e manipolare i dati CSV. In particolare, esamineremo la versione CSV di
Set di dati del disastro del Titanic. Useremo molti set di dati popolari nei prossimi datascience
capitoli di studio sull'elaborazione del linguaggio naturale, data mining Twitter, IBM Watson,
machine learning, deep learning e big data.

Come parte della nostra continua enfasi sulla sicurezza di Python, discuteremo della sicurezza
vulnerabilità della serializzazione e deserializzazione dei dati con la libreria standard di Python

modulo sottaceto. Consigliamo la serializzazione JSON invece di pickle.

Introduciamo anche la gestione delle eccezioni . Un'eccezione indica un tempo di esecuzione


problema. Hai visto eccezioni di tipo ZeroDivisionError, NameError,

ValueError, StatisticsError, TypeError, IndexError, KeyError e

RuntimeError. Mostreremo come gestire le eccezioni quando si verificano utilizzando try


istruzioni e clausole di eccezione associate per gestire le eccezioni. Discuteremo anche di

le clausole dell'istruzione try e infine. Le funzionalità presentate qui ti aiutano


scrivere robusti , faulttolerant programmi in grado di affrontare i problemi e continuare
eseguire o terminare correttamente .

9
Pagina 349
I rogrammi tipicamente richiedono e rilasciano risorse (come file) durante il programma
esecuzione. Spesso, questi sono in quantità limitata o possono essere utilizzati solo da un programma in a
tempo. Mostriamo come garantire che dopo che un programma utilizza una risorsa, venga rilasciato per
utilizzo da parte di altri programmi, anche se si è verificata un'eccezione. Userai il con
dichiarazione a tal fine.

9.2 FILE
Python visualizza un file di testo come una sequenza di caratteri e un file binario (per le immagini,
video e altro) come sequenza di byte. Come negli elenchi e negli array, il primo carattere in a
file di testo e byte in un file binario si trovano alla posizione 0, quindi in un file di n caratteri o
byte, il numero di posizione più alto è n - 1. Il diagramma seguente mostra una vis