Iterazione di una funzione con un argomento statico: funzioni globali + funzione lambda vs funzione interna?

0

Non sono mai sicuro di quale di questi sia la forma migliore:

Opzione A

def a(x,y):      
  def b(z): return z+y
  return map(b, x)
print a([10,20], 5)

Opzione B

def b(z,y): return z+y
def a(x,y):
  return map(lambda x: b(x,y), x)
print a([10,20], 5)

Supponiamo che b () venga chiamato SOLO da dentro a ().

So che l'opzione B è più efficiente perché dichiara solo b () una volta, e quindi la variabile y è appena passata come variabile di contesto. Ma l'opzione A sembra essere una sintassi più semplice, eliminando la necessità di costruire un lambda e semplificando l'interfaccia di b (). Supponiamo inoltre che possano esserci effettivamente molti argomenti di contesto. La complessità esplode nell'interfaccia di b ():

Opzione A2:

def a(x,y1,y2,y3,y4,y5):
  def b(z): return z+y1+y2+y3+y4+y5
  return map(b, x)
print a([10,20], 5,6,7,8,9)

Opzione B2:

def b(z,y1,y2,y3,y4,y5): return z+y1+y2+y3+y4+y5
def a(x,y1,y2,y3,y4,y5):
  return map(lambda x: b(x,y1,y2,y3,y4,y5), x)
print a([10,20], 5,6,7,8,9)

L'opzione A2 è di gran lunga meno caratteri. Pensieri?

    
posta cas5nq 01.02.2015 - 20:20
fonte

2 risposte

2

Per lo Zen di Python: semplice è sempre meglio che complesso. Prenderò la prima opzione sul principio che è molto più facile da capire e quindi più facile da mantenere. In generale, in Python, ci si preoccupa di più della facilità d'uso del codice rispetto all'efficienza del codice.

Se vuoi semplificare lunghi elenchi di argomenti, usa * args :

4.7.3. Elenchi di argomenti arbitrari

Infine, l'opzione meno frequentemente usata è specificare che una funzione può essere chiamata con un numero arbitrario di argomenti. Questi argomenti saranno racchiusi in una tupla (vedi Tuple e sequenze). Prima del numero variabile di argomenti, possono verificarsi zero o più argomenti normali.

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))

Normalmente, questi argomenti variadici saranno gli ultimi nella lista dei parametri formali, perché raccolgono tutti gli argomenti di input rimanenti che vengono passati alla funzione. Tutti i parametri formali che si verificano dopo il parametro * args sono argomenti "solo parole chiave", il che significa che possono essere utilizzati solo come parole chiave anziché come argomenti posizionali.

>>> def concat(*args, sep="/"):
...    return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
    
risposta data 01.02.2015 - 20:34
fonte
0

Hai bisogno dell'efficienza più della semplicità o della semplicità più dell'efficienza?

Utilizza ciò che ha senso per la tua specifica applicazione. Se hai bisogno della semplicità più dell'efficienza, usa l'opzione A. Se hai bisogno dell'efficienza più della semplicità, usa l'opzione B.

I profiler del codice possono aiutare immensamente in questo senso. I programmatori sono notoriamente cattivi nell'indovinare quanto sia costosa una determinata operazione; un profiler del codice può darti delle prove che ti aiuteranno a determinare il costo reale di un calcolo e ti aiuteranno a fare una scelta migliore e più consapevole.

    
risposta data 01.02.2015 - 20:28
fonte

Leggi altre domande sui tag