第三章 字符串
第三章 字符串%
字符串是不可變的,所有的元素賦值和切片賦值都是非法的
Python提供了多種字符串格式設(shè)置方法
編寫新代碼時(shí),應(yīng)選擇使用字符串方法format,使用這種方法時(shí),每個(gè)替換字段都用花括號(hào)括起
"{},{},and {}".format("apple","water","milk")#結(jié)果為:'apple,water,and milk' "{0},{1},and {2}".format("aaa","bbb","ccc")#結(jié)果為:'aaa,bbb,and ccc' "{0} {3} {1} {2}".format("a","b","c","d")#結(jié)果為:'a d b c'格式說明符 .2f,并使用冒號(hào):將其與字段名隔開,意味著要使用包含2位小數(shù)的浮點(diǎn)數(shù)格式;若沒有指定,則輸出多位
from math import pi "{name} is {value}.".format(value=pi, name="π")#結(jié)果為:'π is 3.141592653589793.' "{name} is {value:.2f}.".format(value=pi, name="π")#結(jié)果為:'π is 3.14.' from math import e f"Euler's constant is roughly {e}." "Euler's constant is roughly {e}.".format(e=e)''' 上述倆結(jié)果均一樣: "Euler's constant is roughly 2.718281828459045." '''要在最終結(jié)果中包含花括號(hào),可在格式字符串中使用兩個(gè)花括號(hào)(即{{或}})來指定
"{{ceci n'est pas une replacement field}}".format()#結(jié)果為:"{ceci n'est pas une replacement field}"每個(gè)值都被插入字符串中,以替換用花括號(hào)括起的替換字段
替換字段由字段名、轉(zhuǎn)換標(biāo)志、格式說明符組成其中每個(gè)部分都是可選的
替換字段名
"{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)#結(jié)果為:'3 1 4 2' "{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)#結(jié)果為:'3 2 4 1' name = ["huangjiaju","yanyu","yeshirong"] "{band[1]} like the {band[0]} and {band[2]}".format(band=name)#結(jié)果為:'yanyu like the huangjiaju and yeshirong' import math temp1 = "The {mod.__name__} value is {mod.pi:.2f} for Π" temp1.format(mod=math)#結(jié)果為:'The math value is 3.141592653589793 for Π'#變量__name__包含指定模塊的名稱temp2 = "The {mod.__name__} value is {mod.pi:.2f} for Π" temp2.format(mod=math)#結(jié)果為:'The math value is 3.14 for Π'1,基本轉(zhuǎn)換
三個(gè)標(biāo)志(s、r和a)指定分別使用str、repr和ascii進(jìn)行轉(zhuǎn)換
函數(shù)str通常創(chuàng)建外觀普通的字符串版本(這里沒有對輸入字符串做任何處理)
函數(shù)repr嘗試創(chuàng)建給定值的Python表示(這里是一個(gè)字符串字面量)
函數(shù)ascii創(chuàng)建只包含ASCII字符的表示,類似于Python 2中的repr
這里的f和b之類的表示類型說明符,具體的參考下表所述
"The number is {num}".format(num=42) #結(jié)果為:'The number is 42' "The number is {num:f}".format(num=42) #結(jié)果為:'The number is 42.000000' "The number is {num:.2f}".format(num=42) #結(jié)果為:'The number is 42.00' "The number is {num:b}".format(num=42) #結(jié)果為:'The number is 101010'| b | 將整數(shù)表示為二進(jìn)制數(shù) |
| c | 將整數(shù)解讀為Unicode碼點(diǎn) |
| d | 將整數(shù)視為十進(jìn)制數(shù)進(jìn)行處理,這是整數(shù)默認(rèn)使用的說明符 |
| e | 使用科學(xué)表示法來表示小數(shù)(用e來表示指數(shù)) |
| E | 與e相同,但使用E來表示指數(shù) |
| f | 將小數(shù)表示為定點(diǎn)數(shù) |
| F | 與f相同,但對于特殊值(nan和inf),使用大寫表示 |
| g | 自動(dòng)在定點(diǎn)表示法和科學(xué)表示法之間做出選擇。這是默認(rèn)用于小數(shù)的說明符,但在默認(rèn)情況下至少有1位小數(shù) |
| G | 與g相同,但使用大寫來表示指數(shù)和特殊值 |
| n | 與g相同,但插入隨區(qū)域而異的數(shù)字分隔符 |
| o | 將整數(shù)表示為八進(jìn)制數(shù) |
| s | 保持字符串的格式不變,這是默認(rèn)用于字符串的說明符 |
| x | 將整數(shù)表示為十六進(jìn)制數(shù)并使用小寫字母 |
| X | 與x相同,但使用大寫字母 |
| % | 將數(shù)表示為百分比值(乘以100,按說明符f設(shè)置格式,再在后面加上%) |
2,寬度、精度和千位分隔符
設(shè)置浮點(diǎn)數(shù)(或其他更具體的小數(shù)類型)的格式時(shí),默認(rèn)在小數(shù)點(diǎn)后面顯示6位小數(shù),并根據(jù)需要設(shè)置字段的寬度,而不進(jìn)行任何形式的填充
字符串和數(shù)的默認(rèn)對齊方式不同
數(shù)是默認(rèn)右對齊;而字符串是默認(rèn)左對齊
3,符號(hào)、對齊和用 0 填充
要指定左對齊、右對齊和居中,可分別使用<、>和^
print("{0:<10.2f}\n {0:^10.2f}\n {0:>10.2f}\n".format(pi)) ''' 3.143.143.14 '''填充字符來擴(kuò)充對齊說明符,這樣將使用指定的字符而不是默認(rèn)的空格來填充
"{:$^25}".format(" beyond yanyu ")#結(jié)果為:'$$$$$ beyond yanyu $$$$$$'具體的說明符 = ,它指定將填充字符放在符號(hào)和數(shù)字之間
print('{0:10.2f}\n{1:10.2f}'.format(pi, -pi)) '''3.14-3.14 ''' print('{0:10.2f}\n{1:=10.2f}'.format(pi, -pi)) '''3.14 - 3.14 '''print('{0:+.2}\n{1:+.2}'.format(pi, -pi)) ’‘’ +3.1 -3.1 ‘’‘ print('{0:-.2}\n{1:-.2}'.format(pi, -pi)) #默認(rèn)設(shè)置'''3.1 -3.1 #若{0}為pi是正數(shù)的話,{0:-.2}無法在pi前面添負(fù)號(hào),最后的結(jié)果取決于format里面數(shù)的正負(fù)值''' print('{0: .2}\n{1: .2}'.format(pi, -pi)) '''3.1 -3.1 '''井號(hào)(#)選項(xiàng),你可將其放在符號(hào)說明符和寬度之間
這個(gè)選項(xiàng)將觸發(fā)另一種轉(zhuǎn)換方式,轉(zhuǎn)換細(xì)節(jié)隨類型而異
對于二進(jìn)制、八進(jìn)制和十六進(jìn)制轉(zhuǎn)換,將加上一個(gè)前綴
字符串方法
雖然字符串方法完全蓋住了模塊string的風(fēng)頭,下面是模塊string中幾個(gè)很有用的常量
| string.digits | 包含數(shù)字0~9的字符串 |
| string.ascii_letters | 包含所有ASCII字母(大寫和小寫)的字符串 |
| string.ascii_lowercase | 包含所有小寫ASCII字母的字符串 |
| string.printable | 包含所有可打印的ASCII字符的字符串 |
| string.punctuation | 包含所有ASCII標(biāo)點(diǎn)字符的字符串 |
| string.ascii_uppercase | 包含所有大寫ASCII字母的字符串 |
雖然說的是ASCII字符,但值實(shí)際上是未解碼的Unicode字符串
1,center,通過在兩邊添加填充字符(默認(rèn)為空格)讓字符串居中
"字符串".center(num,"占位符")#表示:將字符串一共占num個(gè)位置,然后在這num個(gè)位置居中,占位符填充,若無占位符默認(rèn)空格填充
"beyond yanyu huangjiaju".center(25)#結(jié)果為:' beyond yanyu huangjiaju ' "beyond yanyu huangjiaju".center(25,"$")#結(jié)果為:'$beyond yanyu huangjiaju$'2,find,在字符串中查找子串。如果找到,就返回子串的第一個(gè)字符的索引,否則返回-1
字符串方法find返回的并非布爾值
如果find像這樣返回0,就意味著它在索引0處找到了指定的子串
指定搜索的起點(diǎn)和終點(diǎn)(它們都是可選的),左閉右開
subject = '$$$ Get rich now!!! $$$'subject.find('$$$')#結(jié)果為:0 #只指定了起點(diǎn) subject.find('$$$', 1)#結(jié)果為:20subject.find('!!!')#結(jié)果為:16 #同時(shí)指定了起點(diǎn)和終點(diǎn) subject.find('!!!', 0, 16)#結(jié)果為:-13,join,其作用與split相反,用于合并序列的元素
所合并序列的元素必須都是字符串連接符.join(字符串列表)將字符串列表通過連接符相連,連接符可為空
beyond = [1,9,9,3] yy = ”+“ YY = ”“ yy.join(beyond)#結(jié)果為:報(bào)錯(cuò),原因是合并序列只能是字符串 sq = ['1','9','9','9'] yy.join(sq)#結(jié)果為:'1+9+9+9' YY.join(sq)#結(jié)果為:'1999'dirs = '', 'usr', 'bin', 'env' '/'.join(dirs)#結(jié)果為:'/usr/bin/env' print('C:' + '\\'.join(dirs))#結(jié)果為:C:\usr\bin\env4,lower,返回字符串的小寫版本
將所有的用戶名都轉(zhuǎn)換為小寫,并于搜索指定姓名用戶
name = "beyond" names = ["yanyu","huangjiaju","yeshirong","beyond","huangguanzhoang","huangjiaqiang"] if name.lower() in names:print("I found it!") #結(jié)果為:I found it!一個(gè)與lower相關(guān)的方法是title,它將字符串轉(zhuǎn)換為詞首大寫,即所有單詞的首字母都大寫,其他字母都小寫
與title功能一樣的是使用模塊string中的函數(shù)capwords
5,replace,將指定子串都替換為另一個(gè)字符串,并返回替換后的結(jié)果
'This is a test'.replace('is', 'eez')#結(jié)果為:'Theez eez a test'6,split,一個(gè)非常重要的字符串方法,其作用與join相反,用于將字符串拆分為序列
如果沒有指定分隔符,將默認(rèn)在單個(gè)或多個(gè)連續(xù)的空白字符(空格、制表符、換行符
等)處進(jìn)行拆分
7,strip,將字符串開頭和末尾的空白(但不包括中間的空白)刪除,并返回刪除后的結(jié)果
' I very like beyond band '.strip()#結(jié)果為:'I very like beyond band'假定用戶輸入用戶名時(shí)不小心在末尾加上了一個(gè)空格,搜索的時(shí)候就可以發(fā)揮這個(gè)方法的作用了
names = ['gumby', 'smith', 'jones'] name = 'gumby ' if name in names: print('Found it!')#結(jié)果為:按下enter 沒反應(yīng) 因?yàn)橛脩裘Q多了個(gè)空格 if name.strip() in names: print('Found it!')#結(jié)果為:按下enter Found it!還可在一個(gè)字符串參數(shù)中指定要?jiǎng)h除哪些字符
'*!*!###!!!!* SPAM * for * everyone!!! *@*$$$*'.strip(' #*!@$')#結(jié)果為:'SPAM * for * everyone'8,translate,與replace一樣替換字符串的特定部分,但不同的是它只能進(jìn)行單字符替換
優(yōu)勢在于能夠同時(shí)替換多個(gè)字符,因此效率比replace高
假設(shè)你要將一段英語文本轉(zhuǎn)換為帶有德國口音的版本,為此必須將字符c和s分別替換為k和z,使用translate前必須創(chuàng)建一個(gè)轉(zhuǎn)換表table = str.maketrans('cs', 'kz')
創(chuàng)建轉(zhuǎn)換表后,就可將其用作方法translate的參數(shù)
還可提供可選的第三個(gè)參數(shù),指定要將哪些字母刪除
9,判斷字符串是否滿足特定的條件
isspace、isdigit和isupper,它們判斷字符串是否具有特定的性質(zhì)
(如包含的字符全為空白、數(shù)字或大寫)
如果字符串具備特定的性質(zhì),這些方法就返回True,否則返回False
本章節(jié)介紹的新函數(shù)
| string.capwords(s[, sep]) | 使用split根據(jù)sep拆分s,將每項(xiàng)的首字母大寫,再以空格為分隔符將它們合并起來 |
| ascii(obj) | 創(chuàng)建指定對象的ASCII表示 |
總結(jié)
- 上一篇: 极米z6开机重启后就变得模糊,每次都要手
- 下一篇: 第四章 字典