2010-11-12 3 views
22

Mi rendo conto che se si ha un iterabile si dovrebbe sempre usare .join(iterable) invece di for x in y: str += x. Ma se c'è solo un numero fisso di variabili che non sono già in iterable, usa .join() ancora nel modo raccomandato?concatenazione di Python .join o stringa

Per esempio io ho

user = 'username' 
host = 'host' 

devo fare

ret = user + '@' + host 

o

ret = '@'.join([user, host]) 

Non sto chiedendo tanto da un punto di vista delle prestazioni, dal momento che entrambi saranno essere piuttosto banale Ma ho letto che la gente qui dice usa sempre lo .join() e mi chiedevo se ci fosse un motivo particolare per questo o se fosse solo una buona idea usare lo .join().

+6

Sono sempre stato parziale ' '% s @% s' % (utente, host)'. –

+0

+1 per un quesiton interessante, mi sono chiesto la stessa cosa. Di solito uso il formato per questo tipo di cose. – GWW

risposta

28

Se si sta creando una stringa del genere, normalmente desidera utilizzare la formattazione di stringhe:

>>> user = 'username' 
>>> host = 'host' 
>>> '%[email protected]%s' % (user, host) 
'[email protected]' 

Python 2.6 aggiunto un'altra forma, che non si basa su l'overloading degli operatori e ha alcune caratteristiche extra:

Come regola generale, la maggior parte delle persone utilizzerà + sulle stringhe solo se stanno aggiungendo due stringhe proprio lì. Per più parti o stringhe più complesse, usano la formattazione delle stringhe, come sopra, o assemblano gli elementi in un elenco e li uniscono insieme (specialmente se è coinvolta una qualsiasi forma di loop.) Il motivo dell'utilizzo di str.join() è che l'aggiunta di stringhe significa creare una nuova stringa (e potenzialmente distruggendo quelli vecchi) per ogni aggiunta. A volte Python può ottimizzarlo, ma lo str.join() diventa rapidamente più chiaro, più ovvio e molto più veloce.

+11

Vale la pena notare che la notazione '%' è deprecata e che il metodo' .format() 'è * The Way Of The Future *. Documentazione pertinente: http://docs.python.org/library/string.html#formatstrings – syrion

+2

Le operazioni di '%' -formatting non sono ancora deprecate. Sono considerati * obsoleti *, ma sono ancora disponibili in tutte le versioni di Python, non sono ancora stati programmati per la rimozione effettiva e non attivano alcun tipo di avviso. –

+2

Per inciso, lo trovo un po 'triste, perché la formattazione delle stringhe * come operatore * è una delle accattivanti stranezze di Python che inizialmente mi ha attirato alla lingua. – kindall

8

(sono abbastanza sicuro che tutte le persone che punta al formattazione di stringhe manca la questione del tutto.)

Creazione di una stringa con la costruzione di un array e unirlo è solo per motivi di prestazioni. A meno che non si abbia bisogno di quella performance, o se non è il modo naturale di implementarla comunque, non c'è alcun vantaggio nel farlo, piuttosto che una semplice concatenazione di stringhe.

Dire '@'.join([user, host]) non è intuitivo. Mi chiedo: perché lo sta facendo? Ci sono sottigliezze ad esso; c'è qualche caso in cui potrebbe esserci più di un '@'? La risposta è no, naturalmente, ma ci vuole più tempo per arrivare a quella conclusione che se fosse scritta in modo naturale.

Non contortare il codice semplicemente per evitare concatenazioni di stringhe; non c'è niente di intrinsecamente sbagliato in questo. Unire gli array è solo un'ottimizzazione.

+1

Non sono sicuro di come ho "mancato il punto" nella mia risposta. Inoltre, "array" e "list" non sono la stessa cosa. –

+0

@Thomas: Con un paio di decenni di abitudini che chiamano array di matrici, non sempre mi sforzo di chiamarle con il nome meno comune di Python. Penso che la tua risposta abbia mancato il punto, perché la sua domanda stava confrontando specificamente '[] .join' alla concatenazione di stringhe e chiedeva se evitare la concatenazione di stringhe anche in casi semplici; * non * chiedendo il modo ideale per formattare quell'esempio particolare e forzato. –

+3

La domanda riguardava "un numero fisso di variabili", che è una situazione comune in cui viene utilizzata la formattazione delle stringhe con '%' o 'str.format'. La mia risposta spiega perché le persone scelgono 'str.join()'. Per quanto riguarda gli elenchi rispetto agli array, non penso che usare il nome sbagliato sia un'idea particolarmente buona, considerando che Python * ha * array e sono cose molto diverse. (E per la stessa ragione, per assicurarsi che i lettori non si confondono, ti faccio notare che '[] .join' non esiste.) –

12

prendo la domanda per significare: "E 'ok per fare questo:"

ret = user + '@' + host 

..e la risposta è sì. Va perfettamente bene

Dovresti, ovviamente, essere a conoscenza delle interessanti cose di formattazione che puoi fare in Python, e dovresti sapere che per le liste lunghe, "join" è la strada da percorrere, ma per una situazione semplice come questa, quello che hai è esattamente giusto. È semplice e chiaro e le prestazioni non saranno un problema.

7

mi limiterò a notare che ho sempre avuto la tendenza ad utilizzare la concatenazione sul posto fino a quando Stavo rileggendo una parte del PEP stile generale Python PEP-8 Style Guide for Python Code.

  • codice dovrebbe essere scritto in un modo che non svantaggiare gli altri implementazioni di Python (PyPy, Jython, IronPython, Pyrex, Psyco, e simili). Ad esempio, non fare affidamento sull'efficiente implementazione di CPython della concatenazione di stringhe sul posto per istruzioni nel formato a + = b o a = a + b. Queste istruzioni vengono eseguite più lentamente in Jython. Nelle parti della libreria sensibili al rendimento, , dovrebbe essere usato il modulo '.join(). Questo assicurerà che la concatenazione avvenga in tempo lineare attraverso varie implementazioni .

Andando da questo, ho la conversione nella pratica di usare si unisce in modo che io possa mantenere il vizio come una pratica più automatico quando l'efficienza è più critica.

Così metterò nel mio voto per:

ret = '@'.join([user, host])