首頁 > 軟體

python字串常見使用操作方法介紹

2022-03-18 13:01:58

1.字串的駐留機制

字串:

在Python中字串是基本的資料型別,是一個不可變的字元序列

2.什麼叫字串的駐留機制

僅儲存一份相同且不可變字串的方法,不同的值被存放在字串的駐留池中,python的駐留機制對相同的字串只保留一份拷貝,後續建立相同字串時,不會開闢新空間,二十八該字串的地址賦給新建立的變數

a='Python'
b="Python"
c='''Python'''
d="""Python"""
#輸出變數且檢視變數地址,發現四個變數儲存的字串的地址都是一樣的,因為字串的駐留機制,字串定以後,再有其他變數定義這個字串,將不會開闢新的空間,而是繼續沿用這個字串的空間
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))

駐留機制的幾種情況(在命令列互動模式中,而不是PyCharm):

  • 1.字串的長度為0或1時
  • 2.符合識別符號的字串會產生駐留機制(字串的識別符號,字母數位下劃線1)
  • 3.字串只在編譯時進行駐留而非執行時
  • 4.[-5,256]之間的整數數位

sys中的intern方法強制2個字串指向同一個物件
PyCharm對字串進行了優化處理

例:

import sys
#兩個不符合駐留機制的字串
a="abc%"
b="abc%"
print(a is b )  #False
a=sys.intern(b) #強制讓a和b在同個位置存放駐留
print(a is b)   #True

3.字串駐留機制的優缺點

  • 1.當需要值相同的字串時,可以直接從字串池例拿來使用,避免頻繁的建立和銷燬,提升效率和節約記憶體,因此拼接字串和修改字串是會比較印象效能的
  • 2.在需要進行字串拼接是建議是用str型別的join方法,而非+,應為join()方法是先計算出所有字串中的長度在拷貝

值new一次物件,效率要比"+"效率高

4.字串的查詢操作的方法

查詢方法:

  • index()  查詢子串substr第一次出現的位置,如果查詢的子串不存在時,則丟擲ValueError
  • rindex() 查詢子串substr最後一次出現的位置,如果查詢子串不存在時,則丟擲ValueError
  • find()   查詢子串substr第一次出現的位置,如果查詢的子串不存在時,則丟擲-1
  • rfind()  查詢子串substr最後一次出現的位置,如果查詢子串不存在時嗎,則返回-1

建議使用find或者rfind查詢字串

s="hello,hello"
print(s.index("lo"))   #查詢lo在字串中第一次出現的位置,返回值是3
print(s.find("lo"))     #查詢lo在字串中第一次出現的位置,返回值是3
print(s.rindex("lo"))   #查詢lo在字串中最後一次出現的位置,返回值是3
print(s.rfind("lo"))    #查詢lo在字串中最後一次出現的位置,返回值是3
 
# print(s.index("k"))     #查詢的字元在字串中不存在,報錯,返回ValueError: substring not found
print(s.rfind("k"))     ##查詢的字元在字串中不存在,返回-1,不報錯

4.1字串的大小寫轉換操作的方法

大小寫轉換:

  • upper()把字串中所有的字元都轉換成大寫字元
  • lower()把字串中所有的字元都轉成小寫字母
  • swapcase()把字串中所有大寫字母轉成小寫字母,把所有小寫字元都轉成大寫字母
  • capitalize()把第一個字元轉換成大寫,把其餘字元轉換成小寫
  • title()把每個單詞的第一個字元轉換成大寫,把每個單詞的剩餘字元轉換為小寫

使用函數轉換後,會產生新的字串物件,原字串不變,使用函數時需要賦值給新的變數,即使轉換後和原字串一樣,也一樣會產生新的物件

h="hello,python"
h.upper()     #將字串變為大寫,未賦值給其他變數,返回的時hello,python
print(h)
z=h.upper()    #返回值HELLO,PYTHON
print(z)

4.2字串內容對其操作和方法

字串對齊:

  • center()居中對齊,第1個引數指定寬度,第2個引數指定填充符,第2個引數是可選的,預設是空格,如果設定寬度小於實際寬度則則返回原字串
  • ljust()左對齊,第1個引數指定寬度,第2個引數指定填充符,第2個引數是可選的,預設是空格如果設定寬度小於實際寬度則則返回原字串
  • rjust() 右對齊,第1個引數指定寬度,第2個引數指定填充符,第2個引數是可選的,預設是空格如果設定寬度小於實際寬度則則返回原字串
  • zfill() 右對齊,左邊用0填充,該方法只接收一個引數,用於指定字串的寬度,如果指定的寬度小於等於字串的長度,返回字串本身

居中對齊center()第一個引數指定長度,第二個引數指定填充物,預設填充物是空格,設定寬度小於原字串,則返回元字串

print(s.center(20,"*"))        #返回值****hello,hello*****
print(s.center(10))     #返回值hello,hello、

4.3判斷字串的方法

  • isidentifier() :判斷指定的字串是不是合法的識別符號
  • isspace(): 判斷指定的字串是否全部由空白字元組成(回車、換行,水平製表符)
  • isalpha():判斷指定的字串是否全部由字母組成
  • isdecimal(): 判斷指定字串是否全部由十進位制的數位組成
  • isnumeric():判斷指定的字串是否全部由數位組成
  • isalnum():判斷指定字串是否全部由字母和數位組成

字串替換:

replace():第一個引數指定被替換的子串,第2個引數指定替換子串的字串,
該方法返回替換後得到的字串,替換前的字串不發生變化,呼叫該方法時可以通過第3個引數指定最大替換次數

字串的合併:

join():將列表或元組中的字串合併成一個字串

tihuan="hello,python"
tihuan1=tihuan.replace("hello","Hi")
print(tihuan) #返回值hello,python 使用該函數,之前的字串不會發生變化,所以需要賦值給新的變數,才會發生變化
print(tihuan1) #返回值  Hi,python
 

tihuan2="hello,hello,hello,hello,python"
tihuan3=tihuan2.replace("hello","Hi",2)   #把hello替換成Hi,,只替換2個
print(tihuan3)   #返回值Hi,Hi,hello,hello,python

4.4字串的比較操作

運運算元:>,>=,<,<=,==,!=

比較規則:首先比較兩個字串中的第一個字元,如果相等則繼續比較下一個字元,
依次比較下去,直到兩個字串中的字元不相等時,其比較結果就是兩個字串的比較結果,兩個字串中的所有後續字元將不再被比較

比較原理:兩上字元進行比較時,比較的是其ordinal value(原始值),呼叫內建函數ord可以得到指定字元的ordinal value。
與內建函數ord對應的是內建函數chr,呼叫內建函數chr時指定 ordinalvalue 可以得到其對應的字元

 #例:比較字串,使用函數ord()
print("apple">"app")  #True
print("apple">"banana") #False
print(ord("a"),ord("b"))   #a的原始值是97,b的原始值是98
print("a">"b") #False
print("c">"b") #True,c的原始值是99
print(ord("華")) #華的原始值是21326
#print(ord("hua"))  #報錯:TypeError   檢視原始值的函數只能檢視一個字串,不能檢視多個
 
 
#檢視原始值所對應的字串,使用函數chr()
print(chr(101))  #e
print(chr(102))  #f
print(chr(21326))  #華

綜上所述:我們得出了一個程式設計師表白方式

計算出這句話的原始值:

print(ord("我"),ord("喜"),ord("歡"),ord("你"))   #返回值:25105 21916 27426 20320
#檢視原始值所對應的字串
p=chr(25105),chr(21916),chr(27426),chr(20320)
print(p)  #返回值('我', '喜', '歡', '你')
print(chr(25105),chr(21916),chr(27426),chr(20320))   #返回值:我 喜 歡 你

字串的切片操作:
 

str[start:end:step]

字串是不可變型別:

  • 1.不具備增刪改等操作
  • 2.切片操作將產生新的物件
h e l l o , p y t h o n     #字串
0 1 2 3 4 5 6 7 8 9 10 11   #索引
st="hello,python"
print(st[:5])  #由於沒有指定起始位置,所以輸出從索引0到5的字串,返回值hello
print(st[6:])  #由於沒有指定結束位置,所以輸出索引為6之後的字串python
st1=st[:5]
st2=st[6:]
st3="!"
newstr=st1+st3+st2
print(newstr)  #將字串相加,返回值是hello!python
 
#切片完整寫法
print(st[1:5:1])  #從索引為1的字元開始切到字串為5的字元結束,步長為1,返回值是ello
print(st[0:5:2]) #從索引0開始切到索引11的元素,步長為2,返回值hlo
print(st[::2])   #不寫起始和結束,只寫步長,就預設從0開始,到末尾結束,返回值hlopto
print(st[::-1])  #預設從字串最後一個元素開始,到第一個元素結束,因為步長是負數,往左輸出,返回值nohtyp,olleh
print(st[-6::1]) #從索引為-6的元素開始,步長為正數,所以向右輸出,返回值是python

5.格式化字串

格式化字串的兩種方式:

第一種:   %作為預留位置   (%為固定符號,s、i、d、f為實際值)
%s     字串
%i或%d  整數
%f     浮點數

例:

"我的名字叫:%s,今年%d歲了"

第二種:{}作為佔位 ({}第一個元素是填寫需要佔位的元素索引,第二個是填寫保留幾位數。例;{0:3})填寫索引為0的元素,並保留3位數

例:

我的名字叫{0},今年{1}歲了,我真的叫{0},format(name,age)  
{}裡填數位就代表format裡元素的索引,format裡的元素會按{}裡的索引填充

name="張三"
age=20
print("大家好,我叫%s,今年%d歲"%(name,age))  #大家好,我叫張三,今年20歲
print("大家好,我叫%s,今年%d歲"%("王五",21))  #大家好,我叫王五,今年21歲
#name1=input("輸入你的名字:")
#age1=input("輸入你的歲數")
#print("我的名字是{0},歲數是{1},別人都叫我{0}".format(name1,age1))
#返回值是我的名字是小華,歲數是20,別人都叫我小華
 
#沒有指明格式化字串,預設這句就是字串,不會格式化,返回值我的名字是{name},名字是{age}
print("我的名字是{name},名字是{age}")
 
#f-string使用f指明要格式化字串,返回值是我的名字是張三,名字是20
print(f"我的名字是{name},名字是{age}")
 
 
print("%d"%99)   #99
print("%10d"%99)   #        99   #10表示寬度
print("023456789") #023456789
print("%f"%3.1415926) #3.141593
print("%10.3f"%3.1415926)  #     3.142,%10.3f表示輸出3位小數,並保持10個寬度
print("%.3f"%3.1415926)  #.3表示保留3位小數,返回值是3.142
print("%d"%3444.1415926)  #保留整數,3444
 
 
print("{0:.3}".format(3.1415926))  #{0:.3}表示存放索引為0的元素,並保留3位數,返回值3.14
print("{:.3f}".format(3.1415926))  #如果元素較少,不重複使用,第一個元素索引的位置可以省略,.3f表示只保留3位小數,返回值3.14
print("{:10.3f}".format(3.1415926))   #同時設定寬度和精度,寬度是時,精度是保留3位小數,返回值是     3.142

6.字串的編碼轉換

字串在傳輸中會被編碼為二進位制在計算機之間傳輸,傳輸到另一臺計算機之後,資料將會被解碼成可以顯示的字串

編碼與解碼的方式:

編碼:將字串轉換為二進位制資料(bytes)
解碼:將bytes型別的資料轉換成字串型別

#編碼需要用到(encoding)
s="舉頭望明月"
print(s.encode(encoding="GBK"))   #在GBK這種編碼格中,一箇中文佔兩個位元組
#b'xbexd9xcdxb7xcdxfbxc3xf7xd4xc2'
 
print(s.encode(encoding="UTF-8")) #在UTF-8這種編輯格式中,一箇中文佔三個位元組
#b'xe4xb8xbexe5xa4xb4xe6x9cx9bxe6x98x8exe6x9cx88'
 
#解碼(需要用到decode函數)
byte1=s.encode(encoding="GBK")   #把s變數裡的內容編碼成GBK格式,並賦值給byte1
print(byte1.decode(encoding="GBK"))  #把byte1變數裡的GBK格式的編碼內容解碼,返回出舉頭望明月
 
byte2=s.encode(encoding="UTF-8")  #把s變數裡的內容編碼成UTF-8格式,並賦值給byte2
print(byte2.decode(encoding="UTF-8"))  #把byte2變數裡的UTF-8格式的編碼內容解碼,返回出舉頭望明月
 
#嘗試使用GBK格式的編碼內容,再使用UTF-8來解碼內容
byte1=s.encode(encoding="GBK")
print(byte1.decode(encoding="UTF-8"))
#報錯UnicodeDecodeError: ,編碼格式與解碼格式不符,所以無法解碼
#編碼和解碼必須使用同一種格式,否則無法解碼

到此這篇關於python字串的使用方法介紹的文章就介紹到這了,更多相關python字串內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com