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 🧐
🔴

Nessun commento:

Posta un commento