「@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(',')
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)
結果:
參考:https://time.geekbang.org/column/article/95897
❝
本文已收錄 GitHub,傳送門~[1] ,裡面更有大廠面試完整考點,歡迎 Star。
❞
[1]
傳送門~: https://github.com/MaoliRUNsen/runsenlearnpy100