Corso Python 2025
Jump to navigation
Jump to search
Corso di programmazione in Python3 di 6 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.
Programma
Il corso si terrà il Lunedì, dalle 21 alle 23:30.
- Introduzione slides - Martedì 6 Maggio: Serata di preparazione per presentare il corso
- Lezione 1 slides - Lunedì 12 Maggio: introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto
if..else
,for
,while
, funzioni - Lezione 2 slides - Lunedì 19 Maggio: liste, dizionari, iteratori e insiemi
- Lezione 3 slides - Lunedì 26 Maggio: tuple, stringhe, files, modulo os
- Lezione 4 slides - Lunedì 9 Giugno: funzionamento e utilizzo della libreria numpy (https://numpy.org/)
- Lezione 5 slides dataset da utilizzare - Lunedì 16 Giugno: utilizzo della libreria matplotlib (https://matplotlib.org/)
- Lezione 6 slides - Lunedì 30 Giugno: utilizzo della libreria Pandas (https://pandas.pydata.org/)
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6
Esercizi Corretti
fattorizza
def fattorizza(N):
s = ""
if N <= 1:
s = str(N)
for i in range(2, N+1):
while N % i == 0:
s += str(i) + (" * " if N > i else "")
N //= i
return s
distributore
def distributore(rifornimento):
cents = yield rifornimento.keys()
while True:
while cents < 50:
cents = cents + (yield)
selezionato = yield "seleziona bibita"
rifornimento[selezionato] -= 1
if rifornimento[selezionato] == 0:
del rifornimento[selezionato]
cents = yield [selezionato, cents - 50]
raggruppa
''' 2 liste:
lista di espressioni regolari regs
lista di directory dirs
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i],
'''
def raggruppa(regs, dirs):
from os import listdir, renames
from re import match
for r,d in zip(regs, dirs):
matches = [match(r,f) for f in listdir()]
matches = [m for m in matches if m is not None]
for m in matches:
renames(m.string,
d + "/" + "/".join(m.groups()) + "/" + m.string)
same_pv
import numpy as np
def same_pv(A, B):
m = min(len(A), len(B))
return np.arange(m)[A[:m] == B[:m]]
Demo Matplotlib
import numpy as np
import matplotlib.pyplot as plt
def loadpacif():
return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',
delimiter=',',
dtype=[('score', 'i4'),
('race','U20'),
('back', 'U20')])
def plotstars(im):
y = np.arange(im.shape[0])
x = im.argmin(axis = 1)
c = im.min(axis = 1)
c = c.max() - c
plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')
plt.legend(loc = 'upper left')
def loadattrs():
# gli attributi devono essere in ordine!
attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')
anything = '.*'
return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',
anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,
dtype=[(s,'i4') for s in attributes])
def plotscatter(d, x, y, minxl = None):
if minxl is not None:
d = d[d['xl'] >= minxl]
plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)
def strtoidx(strings):
d = {n:i for i,n in enumerate(set(strings))}
return d, np.array([d[s] for s in strings])
def tobest(data):
img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')
for score, race, back in data:
img[race,back] = min(img[race, back], score)
return img
def tocount(data):
img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')
for _, race, back in data:
img[race,back] += 1
return img
def translate(data):
rd, r = strtoidx(data['race'])
bd, b = strtoidx(data['back'])
arr = np.array(list(zip(data['score'], r, b)),
dtype=[('score','u4'),('race','u4'),('back','u4')])
return rd,bd,arr
def plotusage(backgrounds, races, matrix):
plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')
plt.yticks(np.arange(len(races)), races)
plt.imshow(matrix)
plt.colorbar()
plt.title('utilizzi per (razza,background)')
def plotbackgrounds(race, backgrounds, razza):
plt.pie(race, labels=[(b if r > 0 else '') for r,b in zip(race, backgrounds)])
plt.title("background usati per " + razza)
def plothist(score, cond, labels):
plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)
plt.xlabel('punti (meno sono meglio è)')
plt.legend()
def plth3d(rd, bd, matrix, ax):
races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')
backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')
xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))
xyh = np.stack((xpos.ravel(), ypos.ravel(),
matrix[np.ix_([rd[r] for r in races],
[bd[b] for b in backgrounds])].ravel()))
xyh = xyh[:, xyh[2]<np.array(-1).astype(matrix.dtype)]
plt.xticks(np.arange(len(backgrounds)), backgrounds)
plt.yticks(np.arange(len(races)), races)
ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])
def showall(data):
rd,bd,arr = translate(data)
im1, im2 = tocount(arr), tobest(arr)
plt.style.use('dark_background')
plt.subplot(1,2,1)
plotusage(bd.keys(), rd.keys(), im1)
plotstars(im2)
plt.subplot(222)
plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')
plt.subplot(224)
plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))
plt.legend()
plt.show()
plth3d(rd, bd, im2, plt.subplot(projection = '3d'))
plt.show()
Demo Matplotlib "migliorata" con Pandas
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
def loadpacif():
return pd.read_csv('https://wiki.golem.linux.it/images/a/af/Pacif.txt',
names=['score', 'race', 'back'])
def plotstars(im):
y = np.arange(len(im.index))
im = im.T.reset_index(drop=True)
x = im.idxmin()
c = im.min()
c = c.max() - c
plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')
plt.legend(loc = 'upper left')
def tobest(data):
return data.pivot_table(columns='race', index='back', values='score', aggfunc='min')
def tocount(data):
return data[['race', 'back']].pivot_table(columns='race', index='back', aggfunc=len, fill_value=0)
def plotusage(table):
plt.xticks(np.arange(len(table.columns)), table.columns, rotation=45, ha='right')
plt.yticks(np.arange(len(table.index)), table.index)
plt.imshow(table)
plt.colorbar()
plt.title('utilizzi per (razza,background)')
def plotbackgrounds(race, backgrounds, razza):
plt.pie(race, labels=backgrounds.where(race > 0, ''))
plt.title("background usati per " + razza)
def plothist(score, cond, labels):
plt.hist([score[cond], score[~cond]], 30, histtype = 'barstacked', label=labels)
plt.xlabel('punti (meno sono meglio è)')
plt.legend()
def plth3d(table, ax):
races = ['Minotaur', 'Spriggan', 'Mountain Dwarf']
backgrounds = ['Berserker', 'Fighter', 'Enchanter', 'Hexslinger']
xpos, ypos = np.meshgrid(np.arange(len(races)), np.arange(len(backgrounds)))
xyh = pd.DataFrame({'pos_x':xpos.ravel(), 'pos_y':ypos.ravel(),
'best_score':table.loc[backgrounds, races].to_numpy().ravel()})
xyh = xyh[xyh['best_score'].notna()]
plt.yticks(np.arange(len(backgrounds)), backgrounds)
plt.xticks(np.arange(len(races)), races)
ax.bar3d(xyh['pos_x']-0.25, xyh['pos_y']-0.25, 0, 0.5, 0.5, xyh['best_score'])
def showall(data):
im1, im2 = tocount(data), tobest(data)
plt.style.use('dark_background')
plt.subplot(1,2,1)
plotusage(im1)
plotstars(im2)
plt.subplot(222)
plotbackgrounds(im1['Minotaur'], im1.index, 'minotauro')
plt.subplot(224)
plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))
plt.legend()
plt.show()
plth3d(im2, plt.subplot(projection = '3d'))
plt.show()
Materiale didattico
Materiale su Python
Iscrizione
- È necessario pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.
- È necessario un proprio PC. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.
- Il corso si terrà presso l' Officina Informatica.
- Il costo di iscrizione è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).
Per qualsiasi domanda è possibile scrivere una mail alla lista, inserendo come Oggetto "Corso Python 2025".