問題
你想將幾個小的字串合併為乙個大的字串
解決方案
如果你想要合併的字串是在乙個序列或者 iterable 中,那麼最快的方式就是使用 join() 方法。比如:
>>> parts = ['is', 'chicago', 'not', 'chicago?']
>>> ' '.join(parts)
'is chicago not chicago?'
>>> ','.join(parts)
'is,chicago,not,chicago?'
>>> ''.join(parts)
'ischicagonotchicago?'
>>>
初看起來,這種語法看上去會比較怪,但是 join() 被指定為字串的乙個方法。這樣做的部分原因是你想去連線的物件可能來自各種不同的資料序列(比如列表,元組,字典,檔案,集合或生成器等),如果在所有這些物件上都定義乙個 join() 方法明顯是程式設計客棧冗餘的。因此你只需要指定你想要的分割字串並呼叫他的 join() 方法去將文字片段組合起來。
如果你僅僅只是合併少數幾個字串,使用加號(+)通常已經足夠了:
>>> a = 'is chicago'
>>> b = 'not chicago?'
>>> a + ' ' + b
'is chicago not chicago?'
>>>
加號(+)操作符在作為一些複雜字串格式化的替代方案的時候通常也工作的很好,比如:
>>> print('{} {}'.format(a,b))
is chicago not chicago?
>>> print(a + ' ' + b)
is chicbyvfpghago not chicago?
>>>
如果你想在原始碼中將兩個字面字串合併起來,你只需要簡單的將它們放到一起,不需要用程式設計客棧加號(+)。比如:
>>> a = 'hello' 'world'
>>> a
'helloworld'
>>>
討論字串合併可能看上去並不需要用一整節來討論。但是不應該小看這個問題,程式設計師通常在字串格式化的時候因為選擇不當而給應用程式帶來嚴重效能損失。
最重要的需要引起注意的是,當我們使用加號(+)操作符去連線大量的字串的時候是非常低效率的,因為加號連線會引起記憶體複製以及垃圾**操作。特別的,你永遠都不應像下面這樣寫字串連線**:
s = ''
for p in parts:
s += p
這種寫法會比使用 join() 方法執行的要慢一些,因為每一次執行+=操作的時候會建立乙個新的字串物件。你最好是先收集所有的字串片段然後再將它們連線起來。
乙個相對比較聰明的技巧是利用生成器表示式(參考1.19小節)轉換資料為字串的同時合併字串,比如:
>>> data = ['acme', 50, 91.1]
>>> ','.join(str(d) for d in data)
'acme,50,91.1'
>>>
同樣還得注意不必要的字串連線操作。有時候程式設計師在沒有必要做連線操作的時候仍然多此一舉。比如在列印的時候:
print(a + ':' + b + ':' + c) # ugly
print(':'.join([a, b, c])) # still ugly
print(a, b, c, sep=':') # better
當混合使用i/o操作和字串連線操作的時候,有時候需要仔細研究你的程式。比如,考慮下面的兩端**片段:
# version 1 (string concatenation)
f.write(chunk1 + chunk2)
# version 2 (separate i/o operations)
f.write(chunk1)
f.write(chunk2)
如果兩個字串很小,那麼第乙個版本效能會更好些,因為i/o系統呼叫天生就慢。另外一方面,如果兩個字串很大,那麼第二個版本可能會更加高效,因為它避免了建立乙個很大的臨時結果並且要複製大量的記憶體塊資料。還是那句話,有時候是需要根據你的應用程式特點來決定應該使用哪種方案。
最後談一下,如果你準備編寫構建大量小字串的輸出**,你最好考慮下使用生成器函式,利用yield語句產生輸出片段。比如:
def swww.cppcns.comample():
yield 'is'
yield 'chicago'
yield 'not'
yield 'chicago?'
這種方法乙個有趣的方面是它並沒有對輸出片段到底要怎樣組織做出假設。例如,你可以簡單的使用 join() 方法將這些片段合併起來:
text = ''.join(sample())
或者你也可以將字串片段重定向到i/o:
for part in sample():
f.write(part)
再或者你還可以寫出一些結合i/o操作的混合方案:
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)
# 結合檔案操作
with open('filename', 'w') as f:
for part in combine(sample(), 32768):
f.write(part)
這裡的關鍵點在於原始的生成器函式並不需要知道使用細節,它只負責生成字串片段就行了。
python 字串拼接
閱讀目錄 1.加號 2.逗號 3.直接連線 4.格式化 5.join 6.多行字串拼接 回到頂部 示例版本為py2 回到頂部 第一種,有程式設計經驗的人,估計都知道很多語言裡面是用加號連線兩個字串,python裡面也是如此直接用 來連線兩個字串 print python tab 結果 pythont...
Python字串拼接
小關ent 在python的實際開發中,很多都需要用到字串拼接,python中字串拼接有很多,今天總結一下 fruit2 bananas fruit3 pears 1.用 符號拼接 用 拼接字串如下 1 str there are fruit1 fruit2 fruit3 on the table ...
Python字串拼接
今天總結一下python中字串拼接的方法 定義乙個字元 var xiaoming str1 var is a shy boy 前面拼接 str2 i think var is shy 中間拼接 str3 the shy boy is var 末尾拼接 雖然使用該方法也可以拼接字串,但它的效率很低,不...