国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python實用技法第33篇:字符串連接及合并

JayChen / 2442人閱讀

摘要:上一篇文章實用技法第篇對齊文本字符串下一篇文章問題我們想將許多小字符串合并成一個大的字符串。示例如下對于不必要的字符串連接操作也要引起重視。有時候在技術上并非必需的時候,程序員們也會忘乎所以地使用字符串連接操作。

上一篇文章: 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實用技法32:對齊文本符串

    摘要:解決方案對于基本的字符串對齊要求,可以使用字符串的和方法。例如的好處之一是它并不是特定于字符串的。此外,可作用于任意類型的對象,比字符串的以及方法要更加通用。上一篇文章實用技法第篇文本過濾和清理下一篇文章實用技法第篇字符串連接及合并 上一篇文章:Python實用技法第31篇:文本過濾和清理下一篇文章:Python實用技法第33篇:字符串連接及合并  問題 我們需要以某種對齊方式將文本...

    leon 評論0 收藏0
  • Python實用技法19:將多個映射合并為單個映射

    摘要:上一篇文章實用技法第篇同時對數據做轉換和換算下一篇文章實用技法第篇針對任意多的分隔符拆分字符串需求 上一篇文章:Python實用技法第18篇:同時對數據做轉換和換算下一篇文章:Python實用技法第20篇:針對任意多的分隔符拆分字符串 1、需求

    jlanglang 評論0 收藏0
  • Python實用技法20:針對任意多的分隔符拆分符串

    摘要:上一篇文章實用技法第篇將多個映射合并為單個映射下一篇文章實用技法第篇在字符串的開頭和結尾處做文本匹配需求 上一篇文章:Python實用技法第19篇:將多個映射合并為單個映射下一篇文章:Python實用技法第21篇:在字符串的開頭和結尾處做文本匹配 1、需求

    AlexTuan 評論0 收藏0
  • Python實用技法18:同時對數據做轉換和換算

    摘要:上一篇文章實用技法第篇將名稱映射到序列的元素中下一篇文章實用技法第篇將多個映射合并為單個映射需求 上一篇文章:Python實用技法第17篇:將名稱映射到序列的元素中下一篇文章: Python實用技法第19篇:將多個映射合并為單個映射 1、需求

    ThreeWords 評論0 收藏0
  • Python實用技法30:從符串中去掉不需要的字符

    摘要:上一篇文章實用技法第篇用正則表達式處理字符下一篇文章實用技法第篇文本過濾和清理問題我們想在字符串的開始結尾或中間去掉不需要的字符,比如說空格符。解決方案方法可用來從字符串的開始和結尾處去掉字符。 上一篇文章: Python實用技法第29篇:用正則表達式處理Unicode字符下一篇文章:Python實用技法第31篇:文本過濾和清理  問題 我們想在字符串的開始、結尾或中間去掉不需要的字...

    yck 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<