Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Trendiest programming languages of 2019
https://learnworthy.net/trendiest-programming-languages-of-2019/
Python
• Python è un linguaggio di programmazione dinamico orientato agli oggetti utilizzabile per molti tipi di software
• È fornito di una buona libreria standard ed è facilmente estendibile
• Python è distribuito con licenza Open-Source– È multipiattaforma
• www.python.it• www.python.org
Python 2 o 3
• Per un’introduzione preliminare, non ci sono differenze significative
• Forse la principale è print che diventa una funzione – e non è più un’istruzione
We have decided that January 1, 2020, was the day that we sunset Python 2. That means that we will
not improve it anymore after that day, even if someone finds a security problem in it. You should
upgrade to Python 3 as soon as you canpython.org
Funzioni e metodi
• v.f() è un metodo• I metodi possono inizialmente essere considerati
come delle funzioni applicate (anche) sulla variabile prima del punto
• Il codice Python– "CIAO".lower()
• è equivalente al seguente codice C– lower(”CIAO");
Interprete interattivo
• Python offre un interprete pronto a riceverecomandi
• Possiamo inserire qualsiasi costrutto del linguaggio e vedere immediatamente l’output
Python 3.7.4 (default, Sep 7 2019, 18:27:02)[Clang 10.0.1 (clang-1001.0.46.4)] on darwinType "help" …>>> 3+58>>> print("Ciao")Ciao>>> print('Ciao')Ciao>>>
Comandi
• I comandi si possono inserire direttamente dallo standard input
• I file sorgente Python sono file di testo, generalmente con estensione .py
• Un programma Python si esegue con il comando– python file.py
Comandi
• # inizia un commento che si estende fino a fine riga
• Le istruzioni sono separate da fine riga e non da ;• Per far continuare un’istruzione anche sulla linea
successiva è necessario inserire un \ a fine riga– Se le parentesi non sono state chiuse correttamente
Python capisce che l’istruzione si estende anche sulla riga successiva
Input e Output
• Print stampa il suo argomento come una stringa• Più argomenti separati da un virgola sono
stampati separati da uno spazio
>>> print(5)5>>> print("Ciao")Ciao>>> print('Ciao')Ciao>>> print('Ciao', "classe")Ciao classe>>>
Input e Output
• Si può formattare l’output come in c• Per leggere un dato si usa input()
– La funzione restituisce sempre una stringa– int(), float() consentono di convertire facilmente il
valore ottenuto
>>> x=18>>> y=15>>> print("x= %d y= %d" % (x,y))x= 18 y= 15>>> print("x=", x, "y=", y)x= 18 y= 15>>> v=input("inserisci un numero: ")inserisci un numero: 45>>> n=int(v)>>> print(n)45>>>
Numeri
• Stessi operatori del C– Le parentesi possono essere usate per raggruppare:
• Esiste anche l’operatore elevamento a potenza **• Non esistono ++ e —• 3/2 è 1.5• 3.0//2 è la divisione intera (1)
Variabili
• I loro nomi sono come in C• Non devono essere dichiarate
– Tipizzazione dinamica
• Non possono essere utilizzate prima che vengaloro assegnato un valore
• Possono riferirsi ad elementi di qualsiasi tipo
>>> x=5>>> nome='Marco'>>> print(x,nome)5 Marco>>> x, nome = "Marco",5>>> print(x,nome)Marco 5>>>
Gerarchia concettuale
• I programmi sono da moduli• I moduli sono composti da istruzioni• Le istruzioni contengono espressioni• Le espressioni creano e gestiscono oggetti
• Qualsiasi cosa è un oggetto in Python
Creazione
• L’oggetto contiene due meta-dati– Un identificatore di tipo– Un contatore per il numero di riferimenti
C
int v = 0;
v 0
C e Python
int v = 0; v = 0;
v 0 0v
I tipi dipendono dagli oggetti
• Cosa succede?• I nomi delle variabili non hanno tipo
– Sono dei riferimenti
• Gli oggetti senza riferimenti sono cancellati (garbage collection)– Si usa il contatore di riferimenti
>>> a = 3>>> a = ‘cremona’>>> a = 1.23
Riferimenti condivisi
Stringhe
• Sono racchiuse fra apici singoli o doppi• Le stringhe sono immutabili
• Stessi caratteri speciali del c (ad esempio, \n)• Si possono usare alcuni operatori visti per i numeri
– + concatenazione– * ripetizione
>>> 'Python''Python'>>> print("Ciao\nmondo")Ciaomondo>>> 'ciao'+" mondo"'ciao mondo'>>> 'ciao'*3'ciaociaociao'
Sottostringhe
>>> 'ciao'[1]'i'>>> 'ciao'[1:3]'ia'>>> 'ciao'[2:]'ao'>>> 'ciao'[:3]'cia'>>> 'ciao'[-1]'o'>>> 'ciao'[:-2]'ci'>>> 'ciao'[-1:1]''>>> 'ciao'[2]='x’<error>
Slicing
>>> S = ‘abcdefghijklmnop’>>> S[1:10:2]‘bdfhj’>>> S[::2]‘acegikmo’
>>> S = ‘hello’>>> S[::-1]>>> ‘olleh’
Alcuni metodi per stringhe
• split()• join()• lower()/upper()• find()• replace()• strip()/lstrip()/rstrip()• isalpha()/isdecimal()/isdigit()• islower()
Metodi specifici>>> S = ‘Spam’>>> S.find(‘pa’)1>>> S‘Spam’>>> S.replace(‘pa’, ‘XYZ’)‘SXYZm’>>> S‘Spam’
>>> line = ‘aaa,bbb,ccccc,dd’>>> line.split(‘,’)[‘aaa’, ‘bbb’, ‘ccccc’, ‘dd’]>>> S = ‘spam’>>> S.upper() #we also have lower()‘SPAM’>>> S.isalpha()True
Liste
• Contengono elementi anche eterogenei• Stessi operatori delle stringhe ma sono mutabili
>>> [1,2,'ciao'][1, 2, 'ciao']>>> [1]+[3,6][1, 3, 6]>>> [1,0]*3[1, 0, 1, 0, 1, 0]>>> [2,3,7,8][1:3][3, 7]>>> [2,3,7,8][:2][2, 3]>>> [1,2,3][0] =5>>>
Liste
• append()/extend()– + crea una nuova lista– append modifica la lista esistente
• insert()• pop()/remove()• reverse()• sort() >>> l = [1,2,3]
>>> l[1, 2, 3]>>> l+[5][1, 2, 3, 5]>>> l[1, 2, 3]>>> l.append(5)>>> l[1, 2, 3, 5]>>>
Slicing
Sostituzione/inserimento
Inserimento senza sostituire nulla
Cancellazione senza inserire nulla
Inserimento all’inizio
Inserimento alla fine
Inserimento alla fine
>>> L = [1]>>> L[:0] = [2,3,4]>>> L[2,3,4,1]
>>> L[len(L):] = [5,6,7]>>> L[2,3,4,1,5,6,7]
>>> L.extend([8,9,10])>>> L[2,3,4,1,5,6,7,8,9,10]
>>> L = [1,2,3]>>> L[1:2] = [4,5]>>> L[1,4,5,3]
>>> L[1:1] = [6,7]>>> L[1,6,7,4,5,3]
>>> L[1:2] = []>>> L[1,7,4,5,3]
Comprehension
• [expression for var in list]
>>> l1 = [1,2,3,4,5]>>> l2 = [x%2 for x in l1]>>> l2[1, 0, 1, 0, 1]>>> l1[1, 2, 3, 4, 5]>>> l2 = []>>> for x in l1: l2.append(x//2)...>>> l2[0, 1, 1, 2, 2]>>>
Forma estesa
>>> [x+y for x in ‘abc’ for y in ‘lmn’][‘al’, ‘am’, ‘an’, ‘bl’, ‘bm’, ‘bn’, ‘cl’, ‘cm’, ‘cn’]
>>> res = []>>> for x in ‘abc’:
for y in ‘lmn’:res.append(x+y)
>>> res[‘al’, ‘am’, ‘an’, ‘bl’, ‘bm’, ‘bn’, ‘cl’, ‘cm’, ‘cn’]
Tuple
• Delimitate da parentesi, gli elementi sono separatida virgole
• Simili alle liste ma immutabili• Le parentesi possono essere omesse
>>> (1,2,3)(1, 2, 3)>>> (1,)(1,)>>> ()()>>> (1,2)[0] = 5<error>>>> v = (5,2,3)>>> v(5, 2, 3)>>> v = 5,2,3>>> v(5, 2, 3)
Dizionari
• Associano un valore ad una chiave• Creati nella forma {ch1: val1, ch2: val2}• L’accesso e l’inserimento di elementi può usare
solo le chiavi• Le chiavi devono essere immutabili• Le coppie non sono ordinate
>>> {'a':1, 'b':2}['a']1>>> {'a':1, 'b':2}['x’]<error>>>> d = {}>>> d['c'] = 2>>> d{'c': 2}>>>
Creazione
>>> D = {}>>> D[‘name’] = ‘Bob’>>> D[‘job’] = ‘developer’>>> D[‘age’] = 40>>> D{‘age’:40, ‘name’:’Bob’, ‘job’:’Developer’}>>> print(D[‘name’])Bob
>>> d1 = dict(name=‘Bob’, job=‘developer’, age=40)>>> d1{‘age’:40, ‘name’:’Bob’, ‘job’:’Developer’}
Cambiamento
>>> D{‘eggs’:3, ‘spam’:2, ‘ham’:1}
>>> D[‘ham’] = [‘grill’, ‘bake’, ‘fry’]>>> D{‘eggs’:3, ‘spam’:2, ‘ham’:[‘grill’, ‘bake’, ‘fry’]}
>>> del D[‘eggs’]>>> D{‘spam’:2, ‘ham’:[‘grill’, ‘bake’, ‘fry’]}
>>> D[‘brunch’] = ‘Bacon’>>> D{‘brunch’:‘Bacon’, ’spam’:2, ‘ham’:[‘grill’, ‘bake’, ‘fry’]}
Chiavi non stringa
>>> L = []>>> L[99] = ‘spam’error! index out of range!
>>> D = {}>>> D[99] = ‘spam’>>> D[99]‘spam’>>> D{99:’spam’}
Metodi principali
• clear()• copy()• has_key()• items()/keys()/values()• update()• get()
Contare con un dizionario
colors = [‘red’, ‘green’, ‘red’, ‘blue’, ‘green’, ‘red’]d = {}for color in colors:
if color not in d:d[color] = 0
d[color] += 1
d = {}for color in colors:
d[color] = d.get(color, 0) + 1
Comprehension
• È un modo per creare dizionari– {key_expression : value_expression for var in list}– Ci vogliono due espressioni
l = ['a', 'b', 'c', 'd']d = {}n = 1for i in l:
d[i] = nn = n + 1
print(d)
l = ['a', 'b', 'c', 'd']d = {letter: i+1 for i,letter in enumerate(l)}print(d)
None
• None è una variabile molto importante con lo stesso ruolo di NULL in C
• In Python None è di un tipo non numerico
items = {"cat": 1, "dog": 2, "piranha": 3}# Get an element that does not existv = items.get("giraffe")# Test for itif v == None: print("Not found")
Set
• Collezioni non-ordinata di oggetti unici
>>> X = set(‘spam’)>>> Y = {‘h’, ’a’, ‘m’}
>>> X, Y({‘m’, ‘a’, ‘p’, ’s’}, {‘m’, ‘a’, ‘h’})>>> X & Y{‘m’,’a’}>>> X | Y{‘m’, ‘h’, ’a’, ‘p’, ’s’}>>> X-Y{‘p’, ’s’}>>> X > YFalse
Eliminazione duplicati>>> list(set([1,2,1,3,1]))[1,2,3]
Identificazione differenze>>>set(‘spam’) – set(‘ham’){‘p’, ‘s’}
Uguaglianza>>> set(‘spam’) == set (‘asmp’)True
Iniziamo a programmare
Due differenze sostanziali
• Le istruzioni non terminano con ;• Non si usano parentesi graffe per organizzare il
codice– L’esecuzione del codice dipende da come è scritto– L’indentazione del codice diventa un elemento
fondamentale
Assegnamento
• = += -= *= /= //= %= **=• Non è creata una copia dell’oggetto
– Solamente un nuovo riferimento
>>> x = [0,1,2]>>> y = x>>> x.append(3)>>> print(y)[0, 1, 2, 3]>>>
Cosa succede
x 0 1 2
x
0 1 2
y
x
0 1 2
y
3
Assegnamento
x 5
x
5
y
x
5y
6Nuovo intero
Vecchio riferimentocancellato
>>> x = 5>>> y = x>>> x = x+1>>> print(x)6>>> print(y)5>>>
Vero e falso
• In Python esistono le variabili di tipo booleano– True e False
• Ogni singolo tipo può definire quando il suovalore è falso– Il numero “0” o “0.0”– Una stringa vuota (“”)
• Gli altri valori sono considerati veri
Assegnamenti in sequenza
>>> string = ‘SPAM’>>> a,b,c = stringerror!!!
>>> a,b,c = string[0], string[1], string[2:]>>> a,b,c(’S’, ‘P’, ‘AM’)
>>> a,b = string[:2]>>> c = string[2:]>>> a,b,c(’S’, ‘P’, ‘AM’)
>>> a,b,c(’S’, ‘P’, ‘AM’)>>> (a,b),c = string[:2], string [2:]
Assegnamenti multipli
>>> a = b = c =‘spam’>>> a,b,c(‘spam’, ‘spam’, ‘spam’)
Riferimenti condivisi !!!
>>> a = b = 0>>> b = b + 1>>> a,b(0,1)
Confronto
• == != > < >= <=• Se necessario vengono eseguite le necessarie
conversioni– 1 == 1.0 è vero
• and or e not• La valutazione di and e or è corto-circuitata
Funzioni built-in
• range([start,] stop[, step])– step è l’incremento, il valore di default è 1– Il valore di default di start è 0– Molto usato con i cicli (vedremo)
• len(s) ritorna il numero di elementi in s
>>> len('ciao')4>>> len('x\0a')3>>> len([1,2,3])3>>> len({'a':1, 'b':5})2>>>
Ancora
• in: vero se il primo operando è contenuto nelsecondo
• is: vero se il primo operando è il secondo– Non solo è uguale!– Riferimento agli stessi oggetti
>>> 'a' in 'ciao'True>>> 2 in [1,2,3]True>>> 5 in [1,2,3]False>>> 'a' in {'x':1, 'a': 2}True>>>
If
if condizione:...
elif condizioneAlternativa:...
else:...
• Sia la parte elif sia la parte else sono facoltative• Può esserci un numero qualsiasi di elif• Non sono necessarie le parentesi intorno
all’espresisone booleana• Non sono possibili assegnamenti all’interno della
condizione
Esempio
• Chiedi un numero e stampa se è pari o dispari
number = int(input("Dammi un numero: "))if number % 2 == 0:
print(number,"e' pari”)elif number % 2 == 1:
print(number,"e' dispari")else:
print(number,"e' molto strano")
Indentazione
• I raggruppamenti sono definiti dall’indentazione– Non si usano parentesi graffe, coppie “begin”/“end” e
simili– Obbliga a scrivere codice ordinato– Più naturale?
while
while condizione:...
• break per uscire dal ciclo• continue per passare all’iterazione successive• pass per non fare nulla
Esempi
x = 10while x:
x = x-1if x%2 != 0: continueprint(x)
while True:v = input("Inserisci un numero: ")if int(v) == 0: breakprint("il numero e': ", v)
Stampa maggiore n numeri letti
n = int(input('Inserisci un numero: '))max = None
while n != 0:if not max or n > max: max = nn = int(input('Inserisci un numero: '))
print(max)
for
for variabile in iteratore:...
• iteratore può essere una sequenza, lista, tupla, stringa, dizionario
• Si possono usare continue e break come per il while
Esempi
onetoten = range(1, 11)for count in onetoten:
print(count)
lista = [4, 5, 7, 8, 9, 1, 0, 7, 10]lista.sort()prec = lista[0]del lista[0]for item in lista:
if prec == item:print("Trovato duplicato di", prec)
prec = item
Esempi
lettere = {}for c in "Mississippi":
lettere[c] = lettere.get(c, 0) + 1lettere = lettere.items()lettere = sorted(lettere)print(lettere)
colors = ['red', 'green', 'red', 'blue', 'green', 'red']d = {}for color in colors:
if color not in d:d[color] = 0
d[color] += 1print(d)
Import
• Per importare il modulo delle funzionimatematiche– import math
• Per usarlo– math.sqrt(2), math.log(5), ecc.
Altre opzioni
#O1.pyfrom M import funcfrom N import func
func() # We have a problem!
#02.pyimport Mimport N # This is one possible solutionM.func()N.func()
#03.pyfrom M import func as mfunc # This is another solutionfrom N import func as nfuncmfunc()nfunc()
Nuove funzioni
def funzione(arg1, arg2, opz1=val1):...• Non bisogna specificare il tipo ritornato
– Una funzione può ritornare un oggetto di qualsiasi tipo
• Gli argomenti sono normali variabili e possonoessere in qualsiasi numero– Se la funzione non accetta argomenti si usa ()
Un primo esempio
>>> def times(x,y):return x * y
>>> times(2,4)8
>>> x = times(3.14, 4)>>> x12.56
>>> times(‘ABC’, 3)‘ABCABCABC’
Nuove funzioni
• Gli argomenti opzionali possono non esserespecificati dal chiamante, in questo casoassumono il valore di default
• Le variabili all’interno della funzione non sonovisibili dall’esterno
def foo(x, y, z=42, k=12):print(x, y, z, k)
foo(3, 4) # 3 4 42 12foo(5, 3, k=9) # 5 3 42 9
return
• La sintassi è: return valore• Se il valore di ritorno viene omesso viene
ritornato None• Se il flusso del programma esce dalla funzione
senza aver trovato un’istruzione return vieneritornato None
Esempio
def anyOdd(xs):for v in xs:
if v % 2 == 1: return Truereturn False
def mult(a,b):if b == 0: return 0rest = mult(a,b - 1)value = a + restreturn value
Oggetti mutabili e immutabili
Oggetti immutabili Oggetti mutabili
>>> def f(a): a = 99
>>> b = 88 >>> f(b)>>> print(b) 88
>>> def changer(a, b): a= 2 b[0] = 'spam'
>>> X = 1>>> L = [1, 2] >>> changer(X, L) >>> X, L(1, ['spam', 2])
Funzioni che restituiscono più valori
>>> def multiple(x,y):x = 2y = [3,4]return x, y
>>> X = 1>>> L = [1,2]>>> X,L = multiple(X, L)>>> X,L2, [3,4]
Ricorsione
• Funzione che calcola il fattoriale
def fattoriale(n):if n <= 1: return 1return n*fattoriale(n-1)
n = int(input('Inserisci un numero: '))print("Il fattoriale di %d e' %d" % (n, fattoriale(n)))
global
• L’assegnamento all’interno di una funzioneassegna il valore ad una variabile locale
• Con global var si indica all’interprete che var èglobale e non locale
x = 5
def f():global xx = 42 # x è la variabile globale
Accesso ai file
• I file vengono gestiti in modo simile al C• open(nomefile[, modo]) apre nomefile in
modalità modo (r è il valore di default) e ritornaun oggetto di tipo file
• I metodi principali degli oggetti file sono– read([size]) ritorna size byte dal file
• Se size è omesso legge tutto il file
– readline() ritorna una riga– readlines() ritorna una lista con le righe rimanenti nel
file– write(str) scrive str sul file
Accesso ai file
• writelines(list) scrive list su file• close() chiude il file• flush() scrive su disco i dati presenti in eventuali
buffer• seek(offset[, pos])
– 0: dall’inizio del file (valore di default)– 1: dalla posizione corrente– 2: dalla fine del file
• tell() ritorna la posizione corrente• truncate([n]) tronca il file a non più di n byte
– Il valore di default è la posizione corrente
Esempio
import sys
fsillabe = open('sillabe.txt', 'r')sillabe = fsillabe.read().split()fsillabe.close()
fdizionario = open('italiano.txt', 'r')paroleIta = fdizionario.read().split()fdizionario.close()
fparole = open('parole.txt', 'w')for s1 in sillabe:
for s2 in sillabe:parola = s1+s2if parola.lower() in paroleIta:
fparole.write(parola+'\n')fparole.close()
Altro esempio
import sys
def createDictionary(filename):dict = {}myfile = open(filename, 'r’)content = myfile.read()myfile.close()
words = content.split()for word in words:
word = word.lower()if word not in dict:
dict[word] = 1else:
dict[word] = dict[word]+1return dict
def printWords(filename):dict = createDictionary(filename)for key in sorted(dict):
print(key,'-->',dict[key])
def main():if len(sys.argv) != 2:
print('Manca il nome del file’)sys.exit(1)
filename = sys.argv[1]printWords(filename)
main()
Funzione per pulire stringa – v1
def pulisci(p):tmp = p.lower()n = 0
while n < len(tmp):if tmp[n] < "a" or tmp[n] > "z":
tmp = tmp.replace(tmp[n], ’’)else: n += 1
return tmp
Funzione per pulire stringa – v2
def pulisci(p):bads = "!@#$%^&*()_-+={[}]|;:,<.>?/~`’”
tmp = p.lower()return tmp.strip(bads)
Errore classico
l=[1,2,3,4,5,4,4]
for e in l:if e%2 == 0:
l.remove(e)
print(l)
Possibile soluzione
l=[1,2,3,4,5,4,4]p=0
while p < len(l):if l[p] % 2 == 0: l.remove(l[p])else: p += 1
print(l)