1 字符串定義
- 字符串是python提供的容器型數(shù)據(jù)類型(序列), 不可變伺通、有序
- 不可變 - 不支持增刪改;
- 有序 - 支持下標操作
- python中的字符串是用單引號或者雙引號引起來的字符集箍土;引號里面的每個基本單元叫字符
2 字符
- python中只有字符概念,沒有字符類型
- 普通字符: 數(shù)字罐监、字母吴藻、普通符號、中文笑诅、日語等
- 轉(zhuǎn)義字符:
轉(zhuǎn)移字符 說明 轉(zhuǎn)移字符 說明 \'
單引號 \"
雙引號 \n 換行 \r 回車 \t tab \\ \
- 在特定的符號前加\來表示特殊功能或者特殊意義的字符
- 阻止轉(zhuǎn)義: 在字符串的最前面加r/R调缨,能夠阻止字符串中所有的轉(zhuǎn)義
str3 = '\t12\'3\na\"bc \\none 001'
print(str3)
str4 = R'\thow\nare\nyou\"'
print(str4)
-
注意字符長度
- '\tabc\n123' # 長度:8
- r'\tabc\n123' # 長度:10
編碼字符: 在字符串中用'\u四位的十六進制數(shù)'來表示一個字符
str5 = '123\u4e11'
print(str5)
3 字符編碼
計算機本身只有直接存儲數(shù)字的能力(存數(shù)字的二進制的補碼),為了能夠存儲數(shù)字以外的符號,
開發(fā)人員給每個字符對應(yīng)一個固定的數(shù)字用來對字符進行存儲吆你。每個字符對應(yīng)的固定的數(shù)字就是字符的編碼值弦叶。-
每個字符和數(shù)字的一一對應(yīng)關(guān)系就是字符編碼表,常見的編碼表有: ASCII碼表妇多、Unicode編碼表
- ASCII碼表采用一個字節(jié)對字符進行編碼:0-127
- Unicode編碼表采用2個字節(jié)對字符進行編碼, 包含了ASCII碼
chr函數(shù): chr(編碼值) - 獲取編碼值對應(yīng)的字符
ord函數(shù): ord(字符) - 獲取指定字符對應(yīng)的編碼
print(chr(100), chr(0x5e00))
print(ord('a'), ord("A"))
- 練習: 查看易經(jīng)六十四卦符號
for code in range(0x4dc0, 0x4dff):
print(chr(code))
4 字符串操作
4.1 獲取單個字符
- 語法: 字符串[下標] - 獲取指定下標對應(yīng)的字符
- 字符串 - 結(jié)果是字符串的表達式(字符串值伤哺、字符串變量、運算結(jié)果是字符串)
- [] - 固定寫法
- 下標 - 又叫索引者祖,值是整數(shù)立莉;字符串確定后,字符串中的沒有字符都有一個確定的下標/索引表示這個字符在字符串中的位置七问。
- python中下標有兩種蜓耻,位置從往后是 0 ~ 字符串長度-1; 位置從后往前是 -1 ~ -字符串長度
- 注意: 獲取單個字符的時候下標不能越界
str1 = 'hello'
print(str1[0], str1[3]) # h l
print(str1[-1]) # 獲取最右邊字符o
str2 = '\tabc 123'
print(str2[2], str2[5]) # b 1
# print(str2[100]) # 下標越界 IndexError: string index out of range
# print(str2[-20]) # 下標越界IndexError: string index out of range
print('hello'[2])
4.2 獲取部分字符(字符串切片)
-
語法: 字符串[開始下標:結(jié)束下標:步長] - 從開始下標開始獲取,每次增加步長取下一個值械巡;取到結(jié)束下標前為止(結(jié)束下標對應(yīng)的值取不到)
- 字符串 - 結(jié)果是字符串的表達式(字符串值刹淌、字符串變量、運算結(jié)果是字符串)
- []/: - 固定寫法
- 開始下標 - 下標讥耗,整數(shù)有勾。能取到對應(yīng)的字符
- 結(jié)束下標 - 下標,整數(shù)。對應(yīng)的字符取不到
- 步長 - 整數(shù)古程。如果步長是正數(shù)蔼卡,從前往后取挣磨;如果步長是負數(shù)雇逞,從后往前取
-
切片注意事項
- 字符串切片的結(jié)果都是字符串
- 如果步長是正數(shù)荤懂,那么開始下標對應(yīng)字符要在結(jié)束下標對應(yīng)的字符的前面,才能取到值
- 如果步長是負數(shù)喝峦,那么開始下標對應(yīng)的字符要在結(jié)束下標對應(yīng)的字符的后面势誊,才能取到值
- 切片的時候下標可以越界
str3 = 'abc+123'
print(str3[0:3:2]) # 'abc' 'ac'
print(str3[2:-2:1]) # 'c+1'
print('結(jié)果:', str3[2:-2:-1]) # ''
print(str3[0:-1:1]) # abc+12
print(str3[-1:2:-1]) # 321+
print(str3[-1:1:-2]) # 31c
print(str3[-100:100:1]) # abc+123
4.3 獲取部分字符的簡寫
- 省略步長 - 步長為1 :
- 語法:字符串[開始下標:結(jié)束下標] <===> 符串[開始下標:結(jié)束下標:1]
str4 = 'hello world'
print(str4[3:-2]) # lo wor
- 省略開始下標 - 步長為正從字符串開頭往后獲取谣蠢;步長為負從字符串最后往前獲取
- 語法: 字符串[:結(jié)束下標:步長] 粟耻、字符串[:結(jié)束下標]
print(str4[:5]) # hello
print(str4[:5:-1]) # dlrow
- 省略結(jié)束下標 - 步長為正,取到字符串最后一個字符為止; 步長為負取到第一個字符為止
- 語法: 字符串[開始下標::步長]眉踱、 字符串[開始下標:]
str4 = 'hello world'
print(str4[1:]) # ello world
print(str4[1::-1]) # eh
print(str4[:]) # 'hello world'
print(str4[::-1]) # dlrow olleh 字符串倒序
4.3 遍歷字符串 - 將字符串中的字符一個一個的取出來
- 直接遍歷, 變量取到的就是字符
str4 = 'hello world'
for char in str4:
print(char)
- 簡介遍歷挤忙, 通過遍歷下標遍歷字符
str4 = 'hello world'
for index in range(-1, -11, -1):
print(index, str4[index])
- 練習: 統(tǒng)計輸入的字符串中,字母'a'出現(xiàn)的次數(shù)
value = input('請輸入一個字符串:')
count = 0
for char in value:
if char == 'a':
count += 1
print(count)
4.4 字符串的運算
4.1 數(shù)學(xué)運算符: +, *
- 字符串1+字符串2: 兩個字符串相加 -> 將兩個字符串拼接產(chǎn)生一個新的字符串
str1 = 'abc' + 'hello'
print(str1) # abchello
- 字符串相加兩邊都要是字符串
str2 = 'abc' + 123 # TypeError: must be str, not int
- 字符串正整數(shù)/ 正整數(shù)字符串: 字符串重復(fù)指定次數(shù)產(chǎn)生一個新的字符串
str2 = 3 * 'abc'
print(str2)
4.2 比較運算:針對兩個字符串進行比較 >, <, >=, <=, ==, !=
- 字符串比較大小: 按位置從前往后一對一對的比較谈喳,找出第一對不相等的字符册烈,看它們的編碼值誰大,那個字符串就大
print('bbZ' > 'abaa') # True
print('你好' > 'hello') # True
-
字符串比較大小應(yīng)用:
- 判斷一個字符是否是小寫字母: 'a'<=char<='z'
- 判斷一個字符是否是大寫字母: 'A'<=char<='Z'
- 判斷一個字符是否是字母: 'a'<=char<='z' or 'A'<=char<='Z'
- 判斷一個字符是否是數(shù)字字符: '0'<=char<='9'
- 判斷一個字符是否是中文(4e00-9fa5): '\ue400'<=char<='\u9fa5', '一'<=char<='龥'
練習: 統(tǒng)計一個字符串中大寫字母的個數(shù)
str4 = 'How Are You!'
count = 0
for char in str4:
if 'A' <= char <= 'Z':
count += 1
print(count)
4.3 賦值運算: =, +=, *=
str5 = '你好'
str5 += 'hello' # str5 = str5+'hello'
print(str5)
str5 *= 2
print(str5)
4.5 in 和 not in
- 字符串1 in 字符串2 - 判斷字符串2中是否包含字符串1
print('abc' in 'a123abc') # True
print('abc' in '123ab1c') # False
4.6 len函數(shù)
- len(字符串) - 獲取字符串長度(字符串中字符的個數(shù))
print(len('\tabc')) # 4
str6 = ' abc'
print(len(str6)) # 7
print(len('\u4e00abc')) # 4
4.7 str函數(shù)
- str(數(shù)據(jù)) - 將其他類型數(shù)據(jù)轉(zhuǎn)換成字符串
- 所有類型的數(shù)據(jù)都可以轉(zhuǎn)換成字符串; 轉(zhuǎn)換的時候直接數(shù)據(jù)的外面加引號
print(str(12.5)) # '12.5'
print(str(True)) # 'True'
4.8 格式字符串: 在字符串中用格式占位符代替字符串中變化的部分婿禽,然后再使用數(shù)據(jù)對變化的部分進行賦值
- 語法: 包含格式占位符的字符串 % (數(shù)據(jù)1,數(shù)據(jù)2,...)
- 說明: 數(shù)據(jù)的個數(shù)和類型要和前面字符串中格式占位的個數(shù)和類型保持一致
格式占位符 | 意義 |
---|---|
%s | 字符串 |
%d | 整數(shù) |
%.Nf | 浮點數(shù)(N控制小數(shù)后小數(shù)的位數(shù)) |
%c | 字符赏僧、字符對應(yīng)的編碼值 |
name = input('姓名:')
age = int(input('請輸入年齡:'))
money = 3.5
message = '我是%s, 今年%d歲, 薪資:%.1fK, 等級:%c' % (name, age, money, 66)
print(message)
5 字符的對象方法 字符串.函數(shù)名()
5.1 字符串.capitalize() - 將字符串中的第一個字符轉(zhuǎn)換成大寫字母
str1 = 'hell world'
print(str1.capitalize())
print(str1)
5.2 設(shè)置對齊方式
- 字符串.center(width, fillchar) - 讓字符串在新字符串中居中扭倾,width控制新子串的寬度淀零,fillchar是填充字符
- 字符串.rjust(width, fillchar) - 讓字符串在新字符串中居右,width控制新子串的寬度膛壹,fillchar是填充字符
- 字符串.ljust(width, fillchar)- 讓字符串在新字符串中居左,width控制新子串的寬度模聋,fillchar是填充字符
- 字符串.zfill(width) <==> 字符串.rjust(width, '0')- 讓字符串在新字符串中居右肩民,width控制新子串的寬度,其余以"0"填充
str1 = 'abc'
print(str1.center(7, '*'))
print(str1.ljust(7, '%'))
print(str1.rjust(7, '='))
num = 15
print(str(num).rjust(3, '0')) #打印一個三位數(shù)链方,num靠右對齊持痰,不夠三位用0填充,
print(str(num).zfill(3)) # 相當于rjust filling char是"0"
5.3 字符串查找和替換
str1 = 'a fox jumped over the fence'
方法名 | 說明 | 示例 |
---|---|---|
str.count(sub,start=0,end=len(string)) | 查找子串sub出現(xiàn)的次數(shù)祟蚀;start從指定下標開始查共啃,end結(jié)束下標 | str1.count('f') |
str.find(str, beg=0, end=len(string)) | 從左向右檢測字符串中是否包含子字符串 str,如果包含返回下標,否則返回-1暂题。beg和end是可選參數(shù),指定查找范圍 | str1.find('fox') |
str.rfind(sub[, start[, end]]) | 從右向左檢測字符串中是否包含sub子串究珊,包含返回子串的下標薪者,否則返回-1 | str1.rfind('fox') |
str.index(sub[, start[, end]]) | 作用類似find,但子串sub不存在會報錯ValueError | str1.index('fox') |
str.rindex(sub[, start[, end]]) | 從右向左檢測剿涮,類似rfind言津,會報ValueError | str1.rindex('fox') |
str.replace(old, new[, count]) | 返回一個新字符串攻人,原串中的old被替換為new,可選參數(shù)count指定替換次數(shù)悬槽。 | str1.replace('a','many') |
5.4 字符串分隔和組合
方法名 | 說明 | 示例 |
---|---|---|
str.split([sep[, num=count(sep)]]) | 將字符串拆分為以sep為分隔符的列表怀吻,如果指定num,則最多拆分num次 | str1.split(' ') |
str.rsplit([sep[, num=count(sep)]]) | 從右向左拆分 | |
str.partition(seq) | 將字符串拆分為一個有三個元素的元組(seq前的字符串,seq初婆,seq后的字符串)蓬坡。 | |
str.rpartion(seq) | 同上 | |
str.splitlines([keepends]) | 拆分一個包含多行的字符串,以每行為一個元素返回一個列表磅叛。keepends是一個True字符或非零整數(shù)屑咳,表示保留行尾標志(即換行符) | |
str.join(seq) | 以指定字符串str作為分隔符,將seq對象中所有的元素(字符串表示)合并為一個新的字符串;seq可以是字符串弊琴、列表等 |
5.5 字符串判斷
方法 | 說明 | 示例 |
---|---|---|
str.isalpha() | 判斷字符串是否由字母構(gòu)成并且只包含字母兆龙,是返回True,否返回False | str1.isalpha() |
str.isalnum() | 檢測字符串是否由字母和數(shù)字組成敲董,如果都是數(shù)字或字母返回True紫皇,否則返回False | |
str.isdigit() | 檢測字符串是否由數(shù)字構(gòu)成,可檢測byte類型 | |
str.isdecimal() | 檢測字符串是否由數(shù)字構(gòu)成 | |
str.isnumeric() | 檢測字符串是否由數(shù)字構(gòu)成, 可以檢測漢字數(shù)字:十 | |
str.isspace() | 檢測字符串是否只有空格或tab構(gòu)成 | |
str.islower() | 檢測字符串中的字母字符是否全部由小寫字母組成 | |
str.isupper() | 檢測字符串中的字母字符是否全部由大寫寫字母組成 | |
str.startswith(suffix[, start[, end]]) | 用于判斷字符串是否以指定子字符串開頭腋寨,如果是則返回True聪铺,否則返回False。 | |
str.endswith(suffix[, start[, end]]) | 用于判斷字符串是否以指定子字符串 結(jié)尾精置,如果是則返回True计寇,否則返回False。 |
5.6 字符串轉(zhuǎn)換
方法 | 說明 | 示例 |
---|---|---|
str.lower() | 字符串轉(zhuǎn)小寫 | |
str.upper() | 字符串轉(zhuǎn)大寫 | |
str.swapcase() | 把字符串中的大小寫字母互換脂倦,大寫轉(zhuǎn)換成小寫番宁,小寫轉(zhuǎn)換成大寫。不去管非字母類字符赖阻。 | |
str.capitalize() | 將字符串的第一個字符轉(zhuǎn)換為大寫蝶押, 其余轉(zhuǎn)換為小寫 | |
str.title() | 字符串中每個單詞的首字母大寫,其余小寫火欧。 | |
str1.center(width,[fillchar]) | 用指定寬度居中顯示字符串棋电,如果字符串無法填滿width,將用指定字符填充字符串苇侵,默認用空格填充 | str1.center(80,'*') |
str.ljust(width[, fillchar]) | 用指定寬度居左顯示字符串 | |
str.rjust(width[, fillchar]) | 用指定寬度居右顯示字符串 | |
str.lstrip([chars]) | 去除字符串左邊指定的字符赶盔,默認是去除空格 | |
str.rstrip([chars]) | 去除字符串左邊指定的字符,默認是去除空格 | |
str.strip([chars]) | 去除字符串兩邊邊指定的字符榆浓,默認是去除空格 |