python字符串相加_Python实用技法第33篇:字符串连接及合并
問題
我們想將許多小字符串合并成一個(gè)大的字符串。
解決方案
如果想要合并的字符串在一個(gè)序列或可迭代對(duì)象中,那么將它們合并起來的最快方法就是使用join()方法。示例如下:
>>> parts = ['Is', 'Chicago', 'Not', 'Chicago?']
>>> ' '.join(parts)
'Is Chicago Not Chicago?'
>>> ','.join(parts)
'Is,Chicago,Not,Chicago?'
>>> ''.join(parts)
'IsChicagoNotChicago?'
>>>
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
初看上去語法可能顯得有些怪異,但是join()操作其實(shí)是字符串對(duì)象的一個(gè)方法。這么設(shè)計(jì)的部分原因是因?yàn)橄胍喜⒃谝黄鸬膶?duì)象可能來自于各種不同的數(shù)據(jù)序列,比如列表、元組、字典、文件、集合或生成器,如果單獨(dú)在每一種序列對(duì)象中實(shí)現(xiàn)一個(gè)join()方法就顯得太冗余了。因此只需要指定想要的分隔字符串,然后在字符串對(duì)象上使用join()方法將文本片段粘合在一起就可以了。
如果只是想連接一些字符串,一般使用+操作符就足夠完成任務(wù)了:
>>> a = 'Is Chicago'
>>> b = 'Not Chicago?'
>>> a + ' ' + b
'Is Chicago Not Chicago?'
>>>
針對(duì)更加復(fù)雜的字符串格式化操作,+操作符同樣可以作為format()的替代,很好地完成任務(wù):
>>> print('{} {}'.format(a,b))
Is Chicago Not Chicago?
>>> print(a + ' ' + b)
Is Chicago Not Chicago?
>>>
如果打算在源代碼中將字符串字面值合并在一起,可以簡(jiǎn)單地將它們排列在一起,中間不加+操作符。示例如下:
>>> a = 'Hello' 'World'
>>> a
'HelloWorld'
>>>
討論
字符串連接這個(gè)主題可能看起來還沒有高級(jí)到要用一整節(jié)的篇幅來講解,但是程序員常常會(huì)在這個(gè)問題上做出錯(cuò)誤的編程選擇,使得他們的代碼性能受到影響。
最重要的一點(diǎn)是要意識(shí)到使用+操作符做大量的字符串連接是非常低效的,原因是由于內(nèi)存拷貝和垃圾收集產(chǎn)生的影響。特別是你絕不會(huì)想寫出這樣的字符串連接代碼:
s = ''
for p in parts:
s += p
這種做法比使用join()方法要慢上許多。主要是因?yàn)槊總€(gè)+=操作都會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象。我們最好先收集所有要連接的部分,最后再一次將它們連接起來。
一個(gè)相關(guān)的技巧(很漂亮的技巧)是利用生成器表達(dá)式(見1.19節(jié))在將數(shù)據(jù)轉(zhuǎn)換為字符串的同時(shí)完成連接操作。示例如下:
>>> data = ['ACME', 50, 91.1]
>>> ','.join(str(d) for d in data)
'ACME,50,91.1'
>>>
對(duì)于不必要的字符串連接操作也要引起重視。有時(shí)候在技術(shù)上并非必需的時(shí)候,程序員們也會(huì)忘乎所以地使用字符串連接操作。例如在打印的時(shí)候:
print(a + ':' + b + ':' + c) # Ugly
print(':'.join([a, b, c])) # Still ugly
print(a, b, c, sep=':') # Better
將字符串連接同I/O操作混合起來的時(shí)候需要對(duì)應(yīng)用做仔細(xì)的分析。例如,考慮如下兩段代碼:
# Version 1 (string concatenation)
f.write(chunk1 + chunk2)
# Version 2 (separate I/O operations)
f.write(chunk1)
f.write(chunk2)
如果這兩個(gè)字符串都很小,那么第一個(gè)版本的代碼能帶來更好的性能,這是因?yàn)閳?zhí)行一次I/O系統(tǒng)調(diào)用的固有開銷就很高。另一方面,如果這兩個(gè)字符串都很大,那么第二個(gè)版本的代碼會(huì)更加高效。因?yàn)檫@里避免了創(chuàng)建大的臨時(shí)結(jié)果,也沒有對(duì)大塊的內(nèi)存進(jìn)行拷貝。這里必須再次強(qiáng)調(diào),你需要對(duì)自己的數(shù)據(jù)做分析,以此才能判定哪一種方法可以獲得最好的性能。
最后但也是最重要的是,如果我們編寫的代碼要從許多短字符串中構(gòu)建輸出,則應(yīng)該考慮編寫生成器函數(shù),通過yield關(guān)鍵字生成字符串片段。示例如下:
def sample():
yield 'Is'
yield 'Chicago'
yield 'Not'
yield 'Chicago?'
關(guān)于這種方法有一個(gè)有趣的事實(shí),那就是它不會(huì)假設(shè)產(chǎn)生的片段要如何組合在一起。比如說可以用join()將它們簡(jiǎn)單的連接起來:
text?=?''.join(sample())
或者,也可以將這些片段重定向到I/O:
for part in sample():
f.write(part)
又或者我們能以混合的方式將I/O操作智能化地結(jié)合在一起:
def combine(source, maxsize):
parts = []
size = 0
for part in source:
parts.append(part)
size += len(part)
if size > maxsize:
yield ''.join(parts)
parts = []
size = 0
yield ''.join(parts)
for part in combine(sample(), 32768):
f.write(part)
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
關(guān)鍵在于這里的生成器函數(shù)并不需要知道精確的細(xì)節(jié),它只是產(chǎn)生片段而已。
總結(jié)
以上是生活随笔為你收集整理的python字符串相加_Python实用技法第33篇:字符串连接及合并的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git为私有仓库设置密码_真香!在局域网
- 下一篇: 密度图的密度估计_不同类型的二维密度图小