Python: tutte le comprensibilità del dizionario sono solo più espressive e compatte per i loop? [chiuso]

0

Recentemente, per descrivere le comprensione del dizionario in Python , ho scritto:

dictionary comprehension is just a more compact & expressive way of writing the same logic as for loops (performance may differ).

  1. Questa è una corretta caratterizzazione della comprensione del dizionario di Python?
  2. È possibile fornire una definizione obiettivo (-ish) del termine espressivo usato per descrivere il codice del computer?
  3. Ha senso usare espressivo e compatto insieme per descrivere il codice? Quali sono alcuni altri esempi?
posta tchakravarty 19.05.2015 - 07:04
fonte

3 risposte

3

Per me, "espressivo" significa che puoi esprimere una grande diversità di concetti con esso.

In molti linguaggi di programmazione, un ciclo foreach (iterando su un contenitore) è meno "espressivo" di un ciclo for. Perché puoi sempre riscrivere banalmente il primo in termini di quest'ultimo, ma non viceversa.

Analogamente, direi che le comprensibilità del dizionario non sono più espressive dei costrutti di loop, ma meno così.

    
risposta data 19.05.2015 - 09:52
fonte
3

Una comprensione del dizionario è espressiva nel senso che, usando uno, stai esprimendo che il tuo intento è quello di creare un dizionario. Puoi sempre fare la stessa cosa in un ciclo for, ma farlo non esprime questo intento. È qualcosa che il lettore deve determinare tramite l'ispezione del codice. Quindi considera questo:

cache = {key:lookup(key) for key in keystore}

Ora confronta con una versione senza una comprensione del dizionario:

cache = {}
for key in keystore:
    cache[key] = lookup(key)

La prima versione è un po 'più compatta. Ma ancora più importante, esprime direttamente che il tuo intento è creare un dizionario. Nella versione per loop, devi leggere il codice e vedere che questo è il risultato.

L'altro punto da considerare è che una versione di comprensione del dizionario è intrinsecamente più semplice di una versione per loop. Una comprensione del dizionario non può fallire nel produrre un dizionario. Ci sono una serie di errori che potresti potenzialmente fare nella versione per ciclo che non può verificarsi nella comprensione del dizionario.

Ecco un esempio di come una comprensione potrebbe aiutare a evitare un difetto:

cache = {}
for key in keystore:
    cache[key] = lookup(key)

cache2 = {}
for key in keystore2:
    cache[key] = lookup(key)  # oops

Abbiamo deciso di utilizzare una seconda cache, ma quando abbiamo copiato la copia, abbiamo introdotto un difetto. Ora guarda la versione di comprensione del dizionario:

cache = {key:lookup(key) for key in keystore}
cache2 = {key:lookup(key) for key in keystore2}

Poiché cache viene visualizzato due volte nella versione del ciclo for , è possibile che queste due istanze risultino disallineate. Questo è impossibile con la comprensione del dizionario perché il dizionario di destinazione appare solo una volta.

So che questo esempio sembra banale, ma nel mondo reale, con un codice più complesso (ad esempio, se si ha una clausola if / else), questo problema peggiora.

    
risposta data 19.05.2015 - 17:55
fonte
1

L'espressività IMO è un tratto della lingua / struttura / libreria nel suo complesso - non di una singola funzione / funzione in essa. Alcune operazioni possono essere meglio espresse con for loops, alcune con la comprensione del dizionario - quindi non direi che uno è più espressivo dell'altro, ma che Python nel suo complesso è più espressivo per avere entrambi.

La compattezza è qualcosa che può essere utilizzato per descrivere una singola funzione, ma non direi che le comprensibilità del dizionario sono sempre più compatte di for loops. Ad esempio, direi che

for i in range(10):
    print(i)

è più compatto di

def foo(x):
    print(x)

{i: foo(i) for i in range(10)}

Naturalmente, questo è un evidente abuso di comprensione del dizionario, ma possono esserci anche abusi meno evidenti. Il punto è che le comprensibilità di elenchi / dizionari si rivolgono a casi d'uso più specifici rispetto a for loops e possono essere più compatti solo in questi casi.

Se stai cercando la terminologia giusta, direi che:

dictionary comprehension is just a more functional way of writing the same logic as for loops (performance may differ).

    
risposta data 19.05.2015 - 12:35
fonte

Leggi altre domande sui tag