Il mutatore metodi di contenitori mutabili di Python (come il metodo di liste .reverse
) quasi invariabilmente restituire None
- alcuni ritorno un valore utile, ad esempio il metodo .pop
restituisce l'elemento popped, ma il concetto chiave da mantenere è che nessuno di questi mutatori restituisce il contenitore mutato: piuttosto, il contenitore muta sul posto e il valore restituito del metodo mutatore è non tale contenitore. (Questa è un'applicazione del principio di design CQS - non del tutto fanatica come, ad esempio, in Eiffel, il linguaggio ideato da Bertrand Meyer, che ha anche inventato CQS, ma solo perché in Python "praticità batte purezza, cfr import this
; . -)
costruire una lista è spesso più costoso di una semplice costruzione di un iteratore, per il caso in modo schiacciante comune in cui tutto quello che vogliamo fare è ciclo sul risultato, pertanto, built-in, come reversed
(e tutto il meravigliosi elementi costitutivi nel modulo itertools
) iteratori di ritorno, non elenchi.
Ma cosa succede se si dispone di un n iteratore x
ma veramente veramente bisogno dell'equivalente lista ? Pezzo di torta - basta fare y = list(x)
. Per creare una nuova istanza di tipo list
, è chiamare tipo list
- questa è un'idea generale di Python che è ancora più cruciale da mantenere rispetto alle cose piuttosto importanti che ho sottolineato nei primi due paragrafi!-)
Quindi, il codice per il vostro problema specifico è davvero molto facile da mettere insieme in base alle nozioni cruciali nei paragrafi precedenti:
[list(reversed(row)) for row in figure]
Nota che sto usando una lista di comprensione, non map
: come regola generale, map
dovrebbe essere usato solo come ottimizzazione ultimo disperato quando non c'è alcuna necessità di un lambda
per costruirlo (se un lambda
è coinvolto poi un listcomp, oltre ad essere più chiaro come al solito , tende anche ad essere più veloce comunque! -).
Una volta che sei un "maestro passato di Python", se il profiling ti dice che questo codice è un collo di bottiglia, si può quindi sapere per provare alternative come
[row[::-1] for row in figure]
applicando un affettare negativo-step (aka "Martian Smiley") per fare copie invertite delle righe, sapendo che di solito è più veloce dell'approccio list(reversed(row))
. Ma - a meno che il tuo codice non sia mantenuto solo da te o qualcuno altrettanto abile in Python - è una posizione difendibile usare il più semplice approccio "codice dai primi principi" eccetto dove la profilatura ti dice di spingere sul pedale . (Personalmente ritengo che il "Martian Smiley" sia abbastanza importante da evitare di applicare questa buona filosofia generale a questo specifico caso d'uso, ma, hey, le persone ragionevoli potrebbero differire su questo punto molto specifico! -).
+1 per superare il pregiudizio personale :: - 1 – intuited
+1 per "Faccina Marziana" –