31 maggio, 2019
Seguire gli aggiornamenti
Forse sono solo io che una volta capito come fare una cosa la metto nella sezione definitive (e immutabili). E avendo cominciato nella seconda metà degli anni '70 risulta evidente che il problema non solo sussiste ma ha un peso di una certa rilevanza. Anche se so tutto della T$AMLC.
OK, roba passata, e poi ho esagerato, non sono davvero così dino (inteso come dinosauro), per esempio sono pythonista, da tanto tempo ormai. Ecco anche con Python dovrei aggiornarmi, rivedere qualche abitudine, è pieno di moduli nuovi e a me nessuno dice mai niente (nada, zilch).
Oggi ci provo, seguendo le dritte di Vinko Kodžoman.
f-strings
Da usare, comode. Raccontate qui e qui. Una prova al volo, con valori numerici, float e interi.
num = 22
den = 7
appi = num / den
print(f'valore approssimato di π: {appi:0.3} calcolato come {num} diviso {den}')
eseguo:
$ py3 f-str.py
valore approssimato di π: 3.14 calcolato come 22 diviso 7
$
Notare (in effetti la nota è solo per me) che un formato troppo piccolo viene automaticamente modificato e il numero di decimali comprende anche il punto.
pathlib
Il (vecchio) modulo os.path ha tutto quello che serve ma il (nuovo) pathlib è meno casinato (si può dire, vero?).
from pathlib import Path
cur_dir = Path('.')
print(cur_dir)
tree_cd = cur_dir.resolve()
print(tree_cd)
dp = tree_cd.parent
dn = tree_cd.name
print(dp)
print(dn)
ed ecco:
$ pwd
/home/juhan/lab/ahpp/mag/npy
$ py3 plib.py
.
/home/juhan/lab/ahpp/mag/npy
/home/juhan/lab/ahpp/mag
npy
$
Salto il "type hinting", cosa di uso comune, riducile all'operatore in.
enum
L'enumerazione enum è più facile usarla praticamente che illustrarla con un esempio minimo, ci provo:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
for color in Color:
print(color)
print()
print(Color.RED)
print(Color(1))
ottengo
$ py3 en.py
Color.RED
Color.GREEN
Color.BLUE
Color.RED
Color.RED
$
lru_cache
lru_cache, dove "lru" sta per Least Recently Used ha effetti sorprendenti:
import time
print('No memoization')
def fib(number: int) -> int:
if number == 0: return 0
if number == 1: return 1
return fib(number-1) + fib(number-2)
start = time.time()
fib(40)
print(f'Duration: {time.time() - start}s')
print('\nMemoization')
from functools import lru_cache
@lru_cache(maxsize=512)
def fib_memoization(number: int) -> int:
if number == 0: return 0
if number == 1: return 1
return fib_memoization(number-1) + fib_memoization(number-2)
start = time.time()
fib_memoization(40)
print(f'Duration: {time.time() - start}s')
OK, vale restare stupito e dire "oh!" 😶
$ py3 lru.py
No memoization
Duration: 30.573128938674927s
Memoization
Duration: 2.4080276489257812e-05s
$
$ py3
>>> 30.57/2.41e-5
1268464.7302904564
>>>
$
Extended iterable unpacking
Questo; cosa anche questa non nuovissima ma utile:
head, *body, tail = range(5)
print(head, body, tail)
from sys import argv
args = argv
print(args)
argline = ' '.join(argv[0:])
print(argline)
py, filename, *cmds = argline.split()
print(py)
print(filename)
print(cmds)
print()
first, _, third, *_ = range(10)
print(first, third)
ottengo
$ py3 ext-iter.py uno due 3 4 5 '6 7' otto
0 [1, 2, 3] 4
['ext-iter.py', 'uno', 'due', '3', '4', '5', '6 7', 'otto']
ext-iter.py uno due 3 4 5 6 7 otto
ext-iter.py
uno
['due', '3', '4', '5', '6', '7', 'otto']
0 2
$
Vinko affronta ora le data classes, e poi l'implicit namespace packages; cose troppo specialistiche (probabilmente), salto. Ma devo continuare a indagare come sta cambiando Python, mi sa 🧐
🔴
Iscriviti a:
Commenti sul post (Atom)
Nessun commento:
Posta un commento