1. 程式人生 > >python 入門之 – 字串型別及操作方法(十五)

python 入門之 – 字串型別及操作方法(十五)

在之前學基本資料型別的時候知道了,在 python 中,字串 是一個有序的字元的集合,用於儲存和表示基本的文字資訊,由一對 單引號 或 雙引號 又或者是 三引號 包含著,但是 字串 有兩個特點:

1、有序
2、不可變

其實字串有序,都很好理解,就是通過語言本身提供的方法來對字串進行一些處理,不可變是因為 python 的執行機制,其實不單單隻有 python 有,別的語言也是一樣的。

不可變

關於不可變,其實我也是通過學習了才知道的,如:

a = '123456'
a = 'qwerty'

如上圖,表面上其實變數 a 已經被改變了,重新賦值了,但其實他並沒有被改變,或者說,一個字串集合的變數一旦生成出來了,就再也不會改變了如:
在這裡插入圖片描述


如上圖,我給變數 a 先賦了個值為 '123456',然後我查詢出他儲存在記憶體中的地址為 4390782600 ,然後我給變數 a 重新賦了個值為 'qwerty' ,然後我在通過 id() 方法查詢他的記憶體地址,發現變成了 4390782656 ,也就是說,相當於給變數 a 不僅把 變數值 更換了,還把變數值的 地址 給換了,也就是說 python 重新開闢了一塊記憶體來儲存這個變數,原來地址為 4390782600 的值相當於被隱藏了,等待一定的時間會被 python 解析器自動回收並將該記憶體給釋放出來,所以這 字串 的不可變的特性。

有序

有序其實就是語言本身給我們提供了許多的的操作方法,讓字串更加序列化一點,讓我一個一個來演示,如:

capitalize() : 返回一串首字母大些其餘小寫的字串

a = 'hello word'
print(a.capitalize())

>> Hello word

casefold() : 將字串全部轉為小寫

a = 'HellO WoRd'
print(a.casefold())

>> hello word

center(字串數量,填充字元) : 將字串以任意可是填充至指定字串左右兩側,讓字串數量滿足為指定的第一個引數

a = 'HellO WoRd'
print(a.center(50,'*'))

>> ******
**************HellO WoRd********************

count(指定字串,開始下標,結束下標) : 統計一個字串集合裡存在多少個指定的字串,字母區分大小寫,預設不寫 開始下標結束下標 兩個引數,表示 全域性匹配,寫了 下標,表示在下標 內部匹配

a = 'HelLo Word'
print(a.count('o'))
print(a.count('l'))
print(a.count('o',0,5))

>> 2
>> 1
>> 1

endswith(指定字串) : 判斷是否以指定字串結尾

a = 'Hello Word!'
print(a.endswith('!'))
print(a.endswith('Word!'))
print(a.endswith('Hello'))

>> True
>> True
>> False

expandtabs(數值) : 增加 tab按鍵 的長度,預設 tab鍵4 個空格符,也就是首行縮排的長度

a = 'a\tb'  #  \t 就是tab鍵
print(a)
print(a.expandtabs(20))

>> a	b >> a                   b

find(字串,開始下標,結束下標) : 查詢字串的索引值,預設找到第一個就不會繼續往下找了,第二和第三個引數不寫,預設全域性匹配,否則就是區域性尋找,找到了返回真實下標,找不到返回 -1

a = 'Hello Word!'
print(a.find('o'))
print(a.find('o',5,-1))
print(a.find('z'))

>> 4
>> 7
>> -1

rfind(字串,開始下標,結束下標) : 和 find() 方法一樣,不過是從後往前開始查詢字串,而不是從左往右

a = 'Hello Word!' 
print(a.rfind('o')) 
print(a.rfind('o',5,-1)) 
print(a.rfind('z')) 

>> 7 
>> 7 
>> -1

format() : 字串傳參,關於字串傳參,上次剛學的時候用百分號 % 嘗試著做過一個小例子,但是這次的 format() 稍微又有點不同,如:
在這裡插入圖片描述

可以看到我通過在字串裡面加入 {} ,然後 花括號 裡面寫的是 format() 引數的先後順序,然後依次傳參最終的出了結果 'my names is 甘宇輝,i am 21 years old' ,其實還有其實引數還可以重複的利用,如:
在這裡插入圖片描述
可以看到,我兩個 {} 都傳 0 實際上就變成了一值多享,當然還有一種特殊的值,可以這樣傳:
在這裡插入圖片描述
可以看到我這次沒有通過下標索引去傳值,而是通過指定的引數名賦值,如果引用的時候不把 引數= 寫在前面的話,是一定會報錯的,如:
在這裡插入圖片描述
index(字串,開始值,結束值) : 和陣列中一樣運用,可以找到對應值的下標,但是如果有多個一樣的值,index() 預設查詢到第一個就不會往下繼續查找了,如:

a = 'dahsudhuasdhuashui2139012831'
a.index('a') 

>> 1

返回出來的值等於 1 ,之後他就不會往下繼續匹配了,預設匹配到第一個值後就會停止,不會往下走了,後面兩個引數一般用區域搜尋,預設不寫匹配全域性,如果找不到則會報錯。

isalnum() : 匹配整個字串裡面是否有 阿拉伯數字 的字串,如果有阿拉伯數字則返回 True ,否則返回 False,( 前提條件是裡面不能有空格或其他非字母和阿拉伯數字的的字串不然也會返回 False

'HelloWord123'.isalnum()

>> True

'HelloWord123 123'.isalnum()

>> False

'HelloWord123 ,;-='.isalnum()

>> False

'HelloWord'.isalnum()

>> False

isalpha() : 判斷是否為純字母的字串,否則返回 False

'HelloWord123'.isalpha()

>> False

'HelloWord'.isalpha()

>> True

isdecimal() : 判斷是否為純整數數字的字串,否則返回 False

'HelloWord123'.isdecimal()

>> False

'123'.isdecimal()

>> True

isdigit() : 和 isdecimal() 一樣,判斷是否為純整數數字的字串,否則返回 False

'HelloWord123'.isdigit()

>> False

'123'.isdigit()

>> True

isnumeric() : 和 isdecimal()isdigit() 一樣,判斷是否為純整數數字的字串,否則返回 False

'HelloWord123'.isnumeric()

>> False

'123'.isnumeric()

>> True

isidentifier() : 判斷 字串 首字母 是否為數字,如果不是數字 返回 True 否則返回 False

'HelloWord123'.isidentifier()

>> True

'_HelloWord123'.isidentifier()

>> True

'123'.isidentifier()

>> False

islower() : 判斷字串裡面是否有 大寫字母,如果有大寫字母,返回 False 沒有返回 True

'ord123'.islower()

>> True

'HelloWord123'.islower()

>> False

isprintable() : 這個方法有點特殊,他是用來判斷某個檔案是否是 不可被列印 的,如果可以列印,返回 True ,否則返回 False 。因為在計算機中,除了有很多中型別的檔案,純文字 或者是 位元組格式 或者是 資料格式 的都是可以被列印的,如果是 可執行檔案 或者是 音訊 視訊 檔案是打印不出來的,他們是純二進位制流的資料,

'ord123'.isprintable()

>> True

isspace() : 判斷這個字串是不是一個純空格的字串

' '.isspace()

>> True

'weqweop'.isspace()

>> False

istitle() : 判斷這個一個字串是否是 標題格式 的,也就是段落語句第一個字母是否為大寫

'Hello'.istitle()

>> True

'Hello word'.istitle()

>> False

'Hello Word'.istitle()

>> True

isupper() : 判斷字母是否都是大寫

'Hello'.isupper()

>> False

'HELLO'.isupper()

>> True

''.join() : 將陣列拼接成一個字串,如:

a = ['123','qwe','123']

','.join(a)

>> '123,qwe,123'

'-'.join(a)

>> '123-qwe-123'

' '.join(a)

>> '123 qwe 123'

ljust(數字,字元) : 和 expandtabs() 方法類似,填充字串數字,如果第二個不填寫字元,則預設為空格,但是是從左往右新增而不是兩邊都新增

'hello word'.ljust(20,'*')

>> 'hello word**********'

'hello word'.ljust(20)

>> 'hello word          '

'hello word'.ljust(20,'—')

>> 'hello word——————————'

rjust(數字,字元) : 和 ljust() 方法正好相反,他是往左新增的

'hello word'.rjust(20,'*') 

>> '**********hello word' 

'hello word'.rjust(20) 

>> '         hello word' 

'hello word'.rjust(20,'—') 

>> '——————————hello word'

lower() : 將字串全部轉為小寫

'HELLO WORD'.lower()

>> 'hello word'

upper() : 將字串全部轉為大寫

'hello word'.upper()

>> 'HELLO WORD'

swapcase() : 和 upper() 方法一樣都是小寫轉大寫

'hello word'.swapcase() 

>> 'HELLO WORD'

strip() : 去字串首尾的換行和空格與tab鍵的格式

'  \n hello word   '.strip()

>> 'hello word'

lstrip() : 去字串左邊的換行和空格與tab鍵的格式

' \n hello word    '.strip()

>> 'hello word    '

rstrip() : 去字串右邊的換行和空格與tab鍵的格式

' \n hello word '.strip()

>> ' \n hello word'

str.maketrans()translate() : 自定義祕文加密

Secretaries = 'abcdefg' # 自定義需要加密的字母
mapping = '[email protected]#$%^&' # 將需要加密的字母一一對應上定義的符號
encryption = str.maketrans(Secretaries,mapping) # 通過 str 屬性下面的 maketrans() 方法 將他們組合起來賦值給一個變數
test_str = 'hello word' # 需要加密的字串
result = test_str.translate(encryption) # 通過 translate() 方法將 test_str 字串將上面對應過的字母加密
print(result) # 打印出結果

>> h%llo wor$ # 第二個字母 e 對應上了 mapping 的第 5 個所以等於 % ,最後一個字母 d 對應上了 第四個加密的 $

partition() : 字串切割

a = 'abcdefghddijklmn'
a.partition('d') # 從字串左邊開始查詢找到第一個 d 開始切割

>> ('abc', 'd', 'efghddijklmn')

rpartition() : 從右邊開始字串切割

a = 'abcdefghddijklmn'
a.rpartition('d') # 從字串右邊開始查詢找到第一個 d 開始切割

>> ('abcdefghd', 'd', 'ijklmn')

replace(被更新的,更新成,數量) : 字串替換,數量不寫預設為全域性匹配

a = 'abbbcdefghijklmn'
a.replace('b','B')

>> 'aBBBcdefghijklmn'

a = 'abbbcdefghijklmn' 
a.replace('b','B',1)

>> 'aBbbcdefghijklmn'

rindex() : 從右邊開始查詢匹配對應的索引值,匹配錯誤會報異常錯誤

a = 'abbbcdefghijklmn'
a.rindex('n')

>> 15

split() : 將字串分割成列表,預設以空格區分

a = 'hello word'
a.split() # 預設以空格區分,也可以指定字串(按那個指定的字元分,那個指定的字元就沒了)
a.split('o') # 指定特定的字串更換
a.split('o',1) # 第二個引數代表執行次數,預設全部匹配分割

>> ['hello', 'word']
>> ['hell', ' w', 'rd']
>> ['hell', ' word']

rsplit() : 和 split() 一樣的用法,如果不傳第二個引數,基本一直,如果傳了第二個引數則是從右開始往左匹配次數

a = 'hello word' 
a.rsplit() # 預設以空格區分,也可以指定字串(按那個指定的字元分,那個指定的字元就沒了) 
a.rsplit('o') # 指定特定的字串更換 
a.rsplit('o',1) # 第二個引數代表執行次數,從右往左開始

>> ['hello', 'word'] 
>> ['hell', ' w', 'rd'] 
>> ['hello w', 'rd']

splitlines() : 以換行符來分割字串,組合成一個新的列表陣列

a = '\nh\nel\nlo\nword'
a.splitlines()

>> ['', 'h', 'el', 'lo', 'word']

startswith() : 以什麼字串開頭

a = 'hello word'
a.startswith('hello')
a.startswith('h')
a.startswith('e')

>> True
>> True
>> Flase

endswith() : 以什麼字串結束

a = 'hello word'
a.endswith('d')
a.endswith('word')
a.endswith('r')

>> True
>> True
>> Flase

title() : 將字串轉化成 title 格式

a = 'hello word'
a.title()

>> 'Hello Word'

zfill() : 將字串指定長度,不夠的用零來補充,加在字串前面

a = 'hello word'
a.zfill(30)

>> '00000000000000000000hello word'

關於 python 內建提供的方法全部瞭解完了