網站首頁 編程語言 正文
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'\xbe\xd9\xcd\xb7\xcd\xfb\xc3\xf7\xd4\xc2' ? print(s.encode(encoding="UTF-8")) #在UTF-8這種編輯格式中,一個中文占三個字節 #b'\xe4\xb8\xbe\xe5\xa4\xb4\xe6\x9c\x9b\xe6\x98\x8e\xe6\x9c\x88' ? #解碼(需要用到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: ,編碼格式與解碼格式不符,所以無法解碼 #編碼和解碼必須使用同一種格式,否則無法解碼
原文鏈接:https://blog.csdn.net/weixin_53466908/article/details/122677770
相關推薦
- 2022-11-05 Nginx反向代理location和proxy_pass配置規則詳細總結_nginx
- 2022-12-06 Python如何查看并打印matplotlib中所有的colormap(cmap)類型_python
- 2022-04-21 使用mongoshake實現mongodb數據同步的操作方法_MongoDB
- 2022-05-02 構建及部署jenkins?pipeline實現持續集成持續交付腳本_服務器其它
- 2023-12-13 統計Excel單元格中某個字符出現的次數
- 2023-08-28 vscode里面報:‘xxx‘ is assigned a value but never used
- 2022-06-25 python多進程和多線程介紹_python
- 2022-01-21 編程實現打印楊輝三角(要求使用一維數組處理)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支