2010-08-20 14 views
22

lo faccio molto in Perl:python equivalente a QW di perl()

printf "%8s %8s %8s\n", qw(date price ret); 

Tuttavia, il meglio che posso venire con in Python è

print '%8s %8s %8s' % (tuple("date price ret".split())) 

Mi chiedo solo se c'è un modo più elegante di farlo? Sto bene se mi dici che è tutto e nessun miglioramento può essere fatto.

+3

Perché questo è un wiki della comunità? Quella "caratteristica" ha davvero bisogno di essere rimossa. –

+0

Spiacente, devo aver sbagliato la casella wiki. Come lo rimuovo? (Non vedo questa opzione quando provo a modificare.) Che cosa dovrebbe essere pubblicato esattamente sul wiki della comunità? grazie. – Zhang18

+0

Non può essere rimosso, considera solo questa una lezione per la prossima volta. L'idea alla base dell'opzione wiki della comunità è probabilmente spiegata meglio su http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts –

risposta

22

Bene, non c'è sicuramente modo di fare esattamente ciò che si può fare in Perl, perché Python si lamenterà dei nomi delle variabili non definiti e di un errore di sintassi (forse una virgola, forse). Ma vorrei scrivere in questo modo (in Python 2.x):

print '%8s %8s %8s' % ('date', 'price', 'ret') 

Se sei veramente attaccati alla sintassi di Perl, penso che si potrebbe definire una funzione qw come questo:

def qw(s): 
    return tuple(s.split()) 

e quindi si potrebbe scrivere

print '%8s %8s %8s' % qw('date price ret') 

che è fondamentalmente Perl simile ad eccezione di quella coppia di citazioni sull'argomento per qw. Ma esiterei a raccomandarlo. Almeno, non farlo solo perché ti manca Perl - consente solo di negare che stai lavorando in un nuovo linguaggio di programmazione ora ;-) È come la vecchia storia sui programmatori Pascal che passano a C e creano macro

#define BEGIN { 
#define END } 
+7

Certo, cercavo esplicitamente di aggirare le virgolette su ogni parola. L'elenco di parole di solito viene eseguito nel quartiere di 15-20, quindi la necessità di qw() in primo luogo. – Zhang18

+1

Beh, penso che il solito modo Python di farlo sia solo di succhiare e digitare le virgolette - dopo tutto, devi farlo una volta sola. Ma suppongo che non ci sia nulla di veramente _wrong_ nell'usare questa funzione 'qw'. Potrebbe confondere chiunque legga il tuo codice sorgente che non ha familiarità con Perl, ma se riesci a conviverci, vai avanti. –

+3

"dopotutto, devi farlo solo una volta" - tranne che devi farlo solo una volta, ogni volta che devi farlo. Prima di iniziare a programmare regolarmente in perl, non mi ero mai reso conto di quanto spesso creasse array di singoli token o hash con token singoli per le chiavi (che è un'altra opportunità per omettere le virgolette in perl). Il "qw" non è significativo, è bello avere una ottimizzazione del caso comune che ti consente di rimuovere le virgolette. – umassthrower

9

.split "data prezzo ret"()

+0

Questo è ciò che l'OP ha già suggerito. Non è davvero utile quindi. –

0

QW() viene spesso utilizzato per stampare le intestazioni delle colonne utilizzando join() in Perl. Le intestazioni di colonne nel mondo reale a volte richiedono molto tempo, rendendo join("\t", qw()) molto utile perché è più facile da leggere e aiuta a eliminare gli errori di battitura (ad esempio "x","y" o "x\ty"). Qui di seguito è un approccio correlato in Python nel mondo reale:

print("\t".join('''PubChemId Column ESImode Library.mzmed 
     Library.rtmed Metabolite newID Feature.mzmed Feature.rtmed 
     Count ppmDiff rtDiff'''.split())) 

La stringa tripla citazione è una cosa strana, perché funge anche da un commento. In questo contesto, tuttavia, è una stringa e ci libera dal doversi preoccupare delle interruzioni di riga (come farebbe qw()).

Grazie alle risposte precedenti per revocare questo approccio.