Pythonist pythonic way – Idiomi

Pythonist pythonic way - Idiomi
Tempo di lettura: 4 minuti

Segui la pythonic way e diventa un Pythonist – Idiomi

… se non hai letto la prima parte eccola qui

Un idioma di programmazione, semplicemente,  è un modo di scrivere codice. Un approfondimento a questo concetto è ben illustrato in Stack Overflow.

Codice Python idiomatico viene spesso definito Pythonic.

Anche se di solito c’è uno modo semplice (e preferibilmente uno solo), di scrivere codice Python idiomatico, potrebbe non essere ovvio per i principianti. Per questo… le buone maniere devono essere acquisite un po’ alla volta e soprattutto consapevolmente.

Di seguito alcuni idiomi di uso comune:

Unpacking

Se si conosce la lunghezza di una lista o di una tupla, è possibile assegnare dei nomi ai suoi elementi con l’unpacking.

Ad esempio, poiché enumerate() fornirà una tupla di due elementi per ogni elemento nell’elenco:


for index, item in enumerate(some_list):
    # do something with index and item

È possibile usarlo per scambiare le variabili in questo modo:


a, b = b, a

Anche con l’unpacking annidato:


a, (b, c) = 1, (2, 3)

In Python 3, un nuovo metodo di estendere l’unpacking è stato introdotto nel PEP3132:


a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]

a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4

Variabili usa e getta

Se c’è bisogno di assegnare qualcosa (per esempio in un unpacking), ma non è necessario creare una variabile, allora si usa __:

filename = 'dummy'
basename, __, ext = filename.rpartition('.')

 

Nota:

Alcune guide su Python consigliano l’utilizzo di un singolo underscore “_” per variabili usa e getta invece del doppio trattino basso. Il problema è che il trattino basso singolo è usato spesso come un alias  per la funzione gettext(), e viene utilizzato anche al prompt interattivo per mantenere il valore dell’ultima operazione. L’utilizzo di un doppio underscore è invece altrettanto chiaro e quasi altrettanto conveniente ed elimina il rischio di interferire accidentalmente con uno di questi altri casi d’uso.

Creare una lista di una certa lunghezza con lo stesso elemento

Usa l’operatore Python * della lista:

five_nones = [None] * 5

Creare una lista di una certa lunghezza con la stessa lista

Poiché la lista è mutabile, l’operatore * (come indicato sopra) creerà un elenco di N riferimenti alla stessa lista, che probabilmente non è quello che si desidera. Invece, si usa una comprehension list, in questo modo:

five_list = [[] for __ in range(5)]

Creare una lista da una stringa

Un idioma comune per creare stringhe è usare il metodo str.join() su una stringa vuota.

 
letters = ['c', 'o', 'm', 'm', 'o', 'n']
word = ''.join(letters)

La variabile word ora conterrà la parola ‘common’. Questo idioma può essere applicato alle liste e alle tuple.

Cercare un elemento in una collezione

Qualche volte occorre cercare un elemento in una collezione di cose. Per esempio lo snippet che segue prende in considerazione una lista ed un insieme.

Ecco il codice:


s = set(['c', 'o', 'm', 'm', 'o', 'n'])
l = ['c', 'o', 'm', 'm', 'o', 'n']

def look_set(s):
    return 's' in s

def lookup_list(l):
    return 's' in l

Anche se entrambe le funzioni sembrano identiche, dato lookup_set utilizza gli insiemi che in Python sono tabelle hash, le prestazioni di ricerca, tra le due sono molto diverse.

Per determinare se un elemento è in una lista, Python dovrà esaminare ogni elemento finché non trova un elemento corrispondente. Questo richiede tempo, soprattutto per le liste lunghe.

Invece in un insieme l’hash dell’elemento dirà a Python dove cercare l’elemento corrispondente.

Per questo motivo la ricerca sarà eseguita velocemente anche se l’insieme è grande.

La ricerca nei dizionari funziona allo stesso modo. Per ulteriori informazioni, vedere questa pagina StackOverflow. Per informazioni dettagliate sulla quantità di tempo impiegata da varie operazioni comuni su ciascuna di queste strutture di dati, vedere questa pagina.

A causa di queste differenze di prestazioni, è spesso una buona idea utilizzare insiemi o dizionari, in questi casi:

    • La collezione conterrà un numero elevato di elementi;
    • Si cercheranno più volte elementi nella raccolta;
    • Non ci sono elementi duplicati.

Per piccole collezioni o collezioni sulle quali non si esguirà frequentemente la ricerca, il tempo e la memoria aggiuntivi necessari per impostare la tabella hash saranno spesso maggiori del tempo risparmiato dalla migliore velocità di ricerca.

Lo Zen di Python

Conosciuto anche come linee guida di Pyton


>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Bello è meglio di brutto.
Esplicito è meglio di implicito.
Semplice è meglio di complesso.
Complesso è meglio di complicato.
Lineare è meglio di nidificato.
Rado è meglio di denso.
La leggibilità è importante.
I casi speciali non sono abbastanza speciali per infrangere le regole.
Anche se la praticità batte la purezza.
Gli errori non dovrebbero mai accadere in silenzio.
Salvo esplicitamente silenziati.
Davanti all’ambiguità, rifiuta la tentazione di indovinare.
Ci dovrebbe essere un – e preferibilmente solo uno – modo ovvio per farlo.
Anche se all’inizio potrebbe non essere un modo ovvio, a meno che tu non sia olandese.
Adesso è meglio che mai.
Anche se “mai” è spesso meglio di “proprio adesso”.
Se l’implementazione è difficile da spiegare, è una cattiva idea.
Se l’implementazione è facile da spiegare, potrebbe essere una buona idea.
I namespace sono una delle grandi idee – facciamone di più!

… Continua …

Fonte: python-guide.org

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: