摘要:上一篇文章實用技法第篇對齊文本字符串下一篇文章問題我們想將許多小字符串合并成一個大的字符串。示例如下對于不必要的字符串連接操作也要引起重視。有時候在技術上并非必需的時候,程序員們也會忘乎所以地使用字符串連接操作。
上一篇文章: Python實用技法第32篇:對齊文本字符串問題
下一篇文章:
我們想將許多小字符串合并成一個大的字符串。
解決方案如果想要合并的字符串在一個序列或可迭代對象中,那么將它們合并起來的最快方法就是使用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?" >>>
針對更加復雜的字符串格式化操作,+操作符同樣可以作為format()的替代,很好地完成任務:
>>> print("{} {}".format(a,b)) Is Chicago Not Chicago? >>> print(a + " " + b) Is Chicago 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 sample(): 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) for part in combine(sample(), 32768): f.write(part)
關鍵在于這里的生成器函數并不需要知道精確的細節,它只是產生片段而已。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44122.html
摘要:解決方案對于基本的字符串對齊要求,可以使用字符串的和方法。例如的好處之一是它并不是特定于字符串的。此外,可作用于任意類型的對象,比字符串的以及方法要更加通用。上一篇文章實用技法第篇文本過濾和清理下一篇文章實用技法第篇字符串連接及合并 上一篇文章:Python實用技法第31篇:文本過濾和清理下一篇文章:Python實用技法第33篇:字符串連接及合并 問題 我們需要以某種對齊方式將文本...
摘要:上一篇文章實用技法第篇同時對數據做轉換和換算下一篇文章實用技法第篇針對任意多的分隔符拆分字符串需求 上一篇文章:Python實用技法第18篇:同時對數據做轉換和換算下一篇文章:Python實用技法第20篇:針對任意多的分隔符拆分字符串 1、需求
摘要:上一篇文章實用技法第篇將多個映射合并為單個映射下一篇文章實用技法第篇在字符串的開頭和結尾處做文本匹配需求 上一篇文章:Python實用技法第19篇:將多個映射合并為單個映射下一篇文章:Python實用技法第21篇:在字符串的開頭和結尾處做文本匹配 1、需求
摘要:上一篇文章實用技法第篇將名稱映射到序列的元素中下一篇文章實用技法第篇將多個映射合并為單個映射需求 上一篇文章:Python實用技法第17篇:將名稱映射到序列的元素中下一篇文章: Python實用技法第19篇:將多個映射合并為單個映射 1、需求
摘要:上一篇文章實用技法第篇用正則表達式處理字符下一篇文章實用技法第篇文本過濾和清理問題我們想在字符串的開始結尾或中間去掉不需要的字符,比如說空格符。解決方案方法可用來從字符串的開始和結尾處去掉字符。 上一篇文章: Python實用技法第29篇:用正則表達式處理Unicode字符下一篇文章:Python實用技法第31篇:文本過濾和清理 問題 我們想在字符串的開始、結尾或中間去掉不需要的字...
閱讀 2234·2021-11-17 09:33
閱讀 2774·2021-11-12 10:36
閱讀 3395·2021-09-27 13:47
閱讀 884·2021-09-22 15:10
閱讀 3485·2021-09-09 11:51
閱讀 1392·2021-08-25 09:38
閱讀 2757·2019-08-30 15:55
閱讀 2608·2019-08-30 15:53