實(shí)際案例
在設(shè)計(jì)某網(wǎng)絡(luò)程序時(shí),我們自定義了一個(gè)基于UDP的網(wǎng)絡(luò)協(xié)議,按照固定次序向服務(wù)器傳遞一系列參數(shù):
hwDetect: "<0112>"
gxDepthBits "<32>"
gxResolution: "<1024x768>"
gxRefresh: ''<60>"
fullAlpha: "<1>"
lodDist: "<100.0>"
DistCull: "<500.0>"
在程序中我們將各個(gè)參數(shù)按次序收集到列表中:
["<0112>", "<32>", "<1024x768>", "<60>", "<1>", "<100.0>", "<500.0>"]
最終我們要把各個(gè)參數(shù)拼接成一個(gè)數(shù)據(jù)報(bào)進(jìn)行發(fā)送:
"<0112><32><1024x768><60><1><100.0><500.0>>"
解決方案:
- 方法一:迭代列表,連續(xù)使用‘+’操作依次拼接每一個(gè)字符串
- 方法二:使用str.join(),更加快速的拼接列表中所有字符串
方法一
迭代列表,連續(xù)使用‘+’操作依次拼接每一個(gè)字符串,其代碼如下:
# -*- coding: utf-8 -*-
pl = ["<0112>", "<32>", "<1024x768>", "<60>", "<1>", "<100.0>", "<500.0>"]
s = ""
for p in pl:
s += p
print s
其輸出結(jié)果為:
<0112><32><1024x768><60><1><100.0><500.0>
其實(shí)我們采用"+"進(jìn)行字符串拼接,實(shí)際上是運(yùn)算符重載,在字符串拼接時(shí)調(diào)用了str.__add__()。若有興趣可查閱Python官方文檔。
方法二
使用str.join(),更加快速的拼接列表中所有字符串,其代碼如下:
# -*- coding: utf-8 -*-
pl = ["<0112>", "<32>", "<1024x768>", "<60>", "<1>", "<100.0>", "<500.0>"]
s = "".join(pl)
print s
其輸出結(jié)果如下:
<0112><32><1024x768><60><1><100.0><500.0>
對(duì)于方法一,若我們將方法一的中間結(jié)果打印輸出,我們就會(huì)發(fā)現(xiàn)方法一存在很?chē)?yán)重的問(wèn)題,每一次字符串拼接操作Python的解釋器都要進(jìn)行內(nèi)存的申請(qǐng)與回收,一旦所需拼接的字符串過(guò)多,其運(yùn)行效率會(huì)大打折扣。
因此,我們對(duì)于處理大量字符串拼接操作推薦使用str.join()。為此,在這里再介紹一個(gè)關(guān)于str.join()的小技巧,其代碼如下:
l = ["abc", 123, 'xyz']
# 通過(guò)生成器解析將每個(gè)元素轉(zhuǎn)為str類(lèi)型
s = "".join(str(x) for x in l)
print s
其運(yùn)行結(jié)果如下:
abc123xyz
當(dāng)我們處理的列表中既有字符串,又有非字符串的數(shù)據(jù)時(shí),我們可以使用生成器表達(dá)式或列表解析將列表中的每個(gè)元素轉(zhuǎn)為str類(lèi)型。(注:具體關(guān)于列表解析與生成器表達(dá)式的效率問(wèn)題,可參考杰瑞的專(zhuān)欄。)