十六、深入Python字符串

2020-10-20 劉潤森

「@Author :Runsen」

python日常處理字符串較多,本文總結一下Python的日常使用。

什麼字符串

字符串是由獨立字符組成的一個序列,通常包含在單引號(『 』),雙引號(」「)

三引號(''' ''')

s1 = 'hello's2 = "hello"s3 = """hello"""s1 == s2 == s3True

三引號字符串常用於函數的注釋

def calculate_similarity(item1, item2):    """    Calculate similarity between two items    Args:        item1: 1st item        item2: 2nd item    Returns:      similarity score between item1 and item2    """

轉義字符

用 \ 開頭的字符串,來表示一些特定意義的字符

s = 'a\nb\tc'print(s)ab   clen(s)5

代碼中的'\n',表示一個字符——換行符;'\t'也表示一個字符,四個空格

字符 a,換行,字符 b,然後制表符,最後列印字符 c 最後列印的輸出橫跨了兩行,但是整個字符串 s 仍然只有 5

具體的如下面表格所示。

創建字符串

name = 'Runsen'name[0]'R'name[1:3]'un'for char in name:    print(char)   Runsen

注意python的字符串是不可變的,這個和元組一樣。

s = 'Runsen's[0] = 'r'Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'str' object does not support item assignment

python的字符串只能通過創建,從而產生新的字符串

s = 'H' + s[1:]s = s.replace('h', 'H')

在Java中有可變的字符串,StringBuilder ,每次改變字符串,無需創建新的字符串,時間複雜度為O(1)

但是在python中如果想要改變字符串,往往需要O(n)的時間複雜度,n是新字符串的長度

拼接字符串

str1 += str2  # 表示 str1 = str1 + str2# 這個時間複雜度是多少s = ''for n in range(0, 100000):    s += str(n)

在python2中總的時間複雜度就為 O(1) + O(2) + … + O(n) = O(n^2)

但是在python3中 str1 += str2 首先會檢測str1 是否有其他的引用

所以在python3中時間複雜度是O(n)

l = []for n in range(0, 100000):    l.append(str(n))l = ' '.join(l) 

由於列表的 append 操作是 O(1) 複雜度,時間複雜度為 n*O(1)=O(n)。

去空格及特殊符號

s.strip().lstrip().rstrip(',')

split分割

s = 'Runsen is a coder'print(s.split(' '))['Runsen', 'is', 'a', 'coder']

這裡還說說 strip() 方法,它比較常用,可以去除字符串前後的空格,不僅如此,它還可以刪除首末位置的指定的字符。

s = '******Runsen is a coder******'s.strip('*') 'Runsen is a coder'

查找字符串

查找字符串一個是find,一個是index find() 方法與 index() 方法的效果一樣,它們的最大的區別只在於,找不到內容時的返回值不同,一個返回 -1,一個拋出異常 :

s = 'Runsen is a coder'print(s.find('is'))print(s.index('is'))print(s.find('runsen'))print(s.index('runsen'))77-1substring not found

字符串格式化

字符串格式化有兩種,一個format,一個%s

print('%s %s' % ('Hello', 'Runsen'))>>> Hello Runsenprint('{} {}.'.format('Hello', 'Runsen'))>>> Hello Runsenprint('%s %s . I am %d' % ('Hello', 'Runsen',21 ))>>> Hello Runsen . I am 21

「%s 表示字符串型,%d 表示整型」

一個format使用需要花括號{}做佔位符,在format方法中再轉入實際的拼接值。

補充:format中的填充與精度與進位

公式::[填充字符][對齊方式 <^>][寬度]

>>> '{0:*>10}'.format(10)  ##右對齊'********10'>>> '{0:*<10}'.format(10)  ##左對齊'10********'>>> '{0:*^10}'.format(10)  ##居中對齊'****10****'

{}裡繼續嵌套一次{},並在format的參數裡增加一項即可

b=10print("{0:*^{width}}".format("Runsen", width=b))b=30print("{0:*^{width}}".format("Runsen", width=b))最後得到的輸出如dao下**Runsen**************Runsen************

format中的如何設置精度與進位

>>> '{0:.2f}'.format(1/3)'0.33'>>> '{0:.3f}'.format(1/3)'0.333'>>> '{0:b}'.format(10)    #二進位 b'1010'>>> '{0:o}'.format(10)     #八進位 o'12'>>> '{0:x}'.format(10)     #16進位 x'a'>>> '{0:e}'.format(10)     #科學計算法 e'1.000000e+01'>>> '{:,}'.format(12369132698)  #千分位格式化'12,369,132,698'

具體查看下面的圖片,圖片來源書籍《Python3基礎教程》

擴展:思考兩種字符串拼接操作,哪個更好

第一種通過+=

s = ''for n in range(0, 100000):    s += str(n)

第二種通過列表append

l = []for n in range(0, 100000):    l.append(str(n))    s = ' '.join(l)

第三種map

s = ''.join(map(str, range(0, 1000000)))

對於上面的兩種拼接操作,計算運行時間,即可判斷出效率。

# 第一個 +=import timestart_time  =time.perf_counter()s = ''for n in range(0,1000000):    s += str(n)end_time = time.perf_counter()# 5.7604558070000005print(end_time - start_time)# 第二個 joinimport timestart_time  =time.perf_counter()s = []for n in range(0,1000000):    s.append(str(n))''.join(s)end_time = time.perf_counter()# 0.622547053print(end_time - start_time)# 第三個 mapimport timestart_time = time.perf_counter()s = ''.join(map(str, range(0, 1000000)))end_time = time.perf_counter()# 0.403433529print(end_time - start_time)

結果:

  • 對於數據量大的map好過join,join好過 +=
  • 對於數據量小的map 好過 += 好過join

參考:https://time.geekbang.org/column/article/95897

本文已收錄 GitHub,傳送門~[1] ,裡面更有大廠面試完整考點,歡迎 Star。


Reference

[1]

傳送門~: https://github.com/MaoliRUNsen/runsenlearnpy100

相關焦點

  • 小瘋談python:字符串的拼接與格式化輸出
    因此為了使結果具有更好的可讀性和靈活性,字符串的格式化輸出就顯得格外重要。例如,我現在接受了用戶的輸入的年齡信息,如果我直接將這個年齡列印在控制臺上那麼對於需要這些數據的人來說可能不友好,因為他們可能不知道這個數據是什麼意思,也就是說列印出來到數據不具有泛讀性。同樣的在字符串中我們無法直接使用代碼中的變量因為python解釋器會默認字符串內的元素為字符。
  • python爬蟲 - 字符串
    python字符串Python中的字符串可以使用單引號、雙引號和三引號(三個單引號或三個雙引號,可以換行的)括起來,使用反斜槓 \ 轉義特殊字符Python3源碼文件默認以UTF-8編碼,所有字符串都是unicode字符串支持字符串拼接、截取等多種運算
  • python爬蟲-字符串
    python字符串 Python中的字符串可以使用單引號、雙引號和三引號(三個單引號或三個雙引號,可以換行的)括起來,使用反斜槓 \ 轉義特殊字符
  • 如何學習python字符串,在這裡有你想要的python字符串入門篇。
    python內的字符串:就是給一串字符取個名稱,叫做字符串。根據這個定義,我在前面寫過的程序中,寫的程序有一句「hello world",就是一個字符串。示例從示例可以看出來,不論是單引號還是雙引號,結果都是一樣的。
  • Python字符串總結
    @Author :RunsenPython字符串總結什麼字符串字符串是由獨立字符組成的一個序列,通常包含在單引號(『 』),雙引號(」「)三引號(''' ''')s1 = 'hello's2 = "hello"s3 = """hello"""s1 == s2 ==
  • Python的基本數據類型之二:字符串(String)(中)
    訪問字符串中的值Python在訪問字符串的時候,採用切片操作,用方括號來截取字符串;例如:>>>str1 = 'Hello World!'所用到的轉義字符如下所示:\' 單引號\" 雙引號\a 發出系統響鈴聲\b 退格符\n 換行符\t 橫向制表符\v 縱向制表符\r 回車符\f 換頁符\o 八進位數代表的字符\x 十六進位數代表的字符
  • Python3的字符串類型(瘋狂Python)
    字符串入門String字符串的意思就是「一串字符」,比如「Hello,田心木瓜」是一個字符串。,因此用戶輸入任何內容,input()函數總是返回一個字符串。raw_input()是python 2中的,相當於python 3中的inputIn [27]: i = input()1In [28]: print (type(i))<class 'str'>In [29]: j = input()2.89In [30]: print (type(j))<class 'str'>In [31]: h = input()helloIn
  • 慢步學python,編程基礎,字符串類型例子及輸出
    想了解python的安裝及運行的可以看慢步之前寫的文章。今天繼續python編程基礎內容,字符串類型數據。python裡面主要的數據類型是數值類型和字符串類型。計算機可以進行運算的是數值,字符串不能進行數學運算,像你在閱讀的文字,可以理解為字符串的一種。
  • Python小白必備知識:Python字符串詳解
    若干個字符的集合就是一個字符串(String)。所謂長字符串,就是可以直接換行(不用加反斜槓\)書寫的字符串。Files\Python 3.8\python.exe這樣的字符串,在 Python 程序中直接這樣寫肯定是不行的,不管是普通字符串還是長字符串。
  • python的內置函數eval:字符串運算
    前言最先認識eval,是在javascript中,eval() 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。在javascript中,該方法只接受原始字符串作為參數,如果 string 參數不是原始字符串,那麼該方法將不作任何改變地返回。
  • python中str字符串和unicode對象字符串的拼接問題
    一個很基本的問題,遇到了,這裡記錄下str字符串s = 『中文』 # s: <type 『str』>s是個str對象,中文字符串。存儲方式是字節碼。字節碼是怎麼存的:如果這行代碼在python解釋器中輸入&運行,那麼s的格式就是解釋器的編碼格式;如果這行代碼是在源碼文件中寫入、保存然後執行,那麼解釋器載入代碼時就將s初始化為文件指定編碼(比如py文件開頭那行的utf-8);unicode對象字符串unicode是一種編碼標準,具體的實現可能是utf-8,utf-16,gbk等等,這就是中文字符串和
  • Python-字符串格式化
    前言Python2.6 開始,新增了一種格式化字符串的函數 str.format(),它增強了字符串格式化的功能。相對於老版的%格式方法,它有很多優點。1.在%方法中%s只能替代字符串類型,而在format中不需要理會數據類型;2.單個參數可以多次輸出,參數順序可以不相同;3.填充方式十分靈活,對齊方式十分強大;4.官方推薦用的方式,%方式將會在後面的版本被淘汰。
  • 跟我學解Python題-字符串,輸入任意字符,去除字符中的數字
    首先,我們要知道,我們在 python中進場使用input()輸入函數,使用input()輸入的內容為字符傳類型。在這個前提下我們來看下面這道題目。#Python入門教程#編輯程序 實現功能,輸入字符串
  • 「測一測你的性格」小案例學習python字符串操作
    今天樹哥也嘗試用python做一個「性格測試小程序」,用這個案例來說明一下python的日曆和字符串操作的一些用法。一、案例分析案例題目:讓用戶輸入出生年月日,返回這是這一年的第幾周第幾天,並輸出當周的日曆。給出用戶的屬相給出用戶的星座,並告知用戶的性格。
  • Python的基本數據類型之二:字符串(String)(下)
    this is a python program "為例,來說明各函數的具體用法;獲取字符串長度:len>>>print '%s length=%d' % (str,len(str))#輸出: Hello world!
  • Python變量,輸入和輸出,數字,字符串操作
    python中推薦使用下劃線「_」來連接,但在命名時一定要注意關鍵字。查看python的關鍵字:import keyptint(keyword.kwlist):字符串定義:字符串是一個有序的,不可修改的,以引號包圍的序列。
  • Python字符串類型的格式化
    字符串格式化用於解決字符串和變量同時輸出時的格式安排。字符串是程序向控制臺、網絡、文件等介質輸出運算結果的主要形式之一,為了能提供更好的可讀性和靈活性,字符串類型的格式化是運用字符串類型的重要內容之一。Python語言同時支持兩種字符串格式化方法,我們本課題要學習的是format()格式化方法,採用format()方法進行字符串格式化。
  • python語言-字符串格式
    python3以後,新增了一種格式化字符串的函數str.format(),它增強了字符串格式化的功能。相對於老版的%格式方法,它有很多優點。1.在%方法中%s只能替代字符串類型,而在format中不需要理會數據類型;2.單個參數可以多次輸出,參數順序可以不相同;3.填充方式十分靈活,對齊方式十分強大;4.官方推薦用的方式,%方式將會在後面的版本被淘汰。
  • 7招秘籍: 教你玩轉Python字符串
    xinxin 菜鳥學Python閱讀本文大概需要7分鐘:日常使用python經常要對文本進行處理,無論是爬蟲的數據解析,還是大數據的文本清洗,還是普通文件的處理,都是要用到字符串. Python對字符串的處理內置了很多高效的函數,非常方便功能很強大.下面是我總結的常用的7招,有了這幾招就能輕鬆應對字符串處理.
  • 7招秘籍:教你玩轉Python字符串
    xinxin 菜鳥學Python 閱讀本文大概需要7分鐘:日常使用python經常要對文本進行處理,無論是爬蟲的數據解析,還是大數據的文本清洗,還是普通文件的處理,都是要用到字符串.Python對字符串的處理內置了很多高效的函數,非常方便功能很強大.下面是我總結的常用的7招,有了這幾招就能輕鬆應對字符串處理.