Python程序設(shè)計基礎(chǔ)(第2版)課件 趙廣輝 第5-8章 字符串與序列 -數(shù)據(jù)可視化_第1頁
Python程序設(shè)計基礎(chǔ)(第2版)課件 趙廣輝 第5-8章 字符串與序列 -數(shù)據(jù)可視化_第2頁
Python程序設(shè)計基礎(chǔ)(第2版)課件 趙廣輝 第5-8章 字符串與序列 -數(shù)據(jù)可視化_第3頁
Python程序設(shè)計基礎(chǔ)(第2版)課件 趙廣輝 第5-8章 字符串與序列 -數(shù)據(jù)可視化_第4頁
Python程序設(shè)計基礎(chǔ)(第2版)課件 趙廣輝 第5-8章 字符串與序列 -數(shù)據(jù)可視化_第5頁
已閱讀5頁,還剩637頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章字符串與序列序列通用操作字符串元組列表算法與問題求解5.15.25.35.45.5學(xué)習(xí)引導(dǎo)…了解…理解…掌握…運用5字符串與序列序列(Sequence)是一系列數(shù)據(jù)項的有序集合。序列中的每個數(shù)據(jù)項都有一個索引,索引從0開始。主要用于存儲和操作多個數(shù)據(jù)元素。序列類型共同特性:有序性:序列中的數(shù)據(jù)項按插入順序排列。索引訪問:序列中的每個元素都有一個唯一的索引,可以通過索引訪問特定元素。支持切片:序列可以通過切片操作來訪問子序列。支持迭代:可以使用循環(huán)遍歷序列中的元素。5字符串與序列數(shù)據(jù)類型函數(shù)示例描述是否可變字符串str()'Hello'、"1234"、'''這是一個函數(shù)'''、"""唐詩三百首"""存儲一系列字符不可變Rangerange()range(10)range(3,100,3)表示一系列連續(xù)的整數(shù)不可變元組tuple()()、(2,)、(1,'abc',(2,3),['武漢','吉林'])與列表類似,但元組不可變不可變列表list()[]、[3]、[5,'武漢',('a',3),['Tom',18]]存儲任意類型的元素,可以包含不同類型的數(shù)據(jù)可變5.1

序列通用操作5.1序列通用操作序列數(shù)據(jù)類型共性元素間存在先后順序支持序列的拼接、重復(fù)、索引、切片、測試長度、最大值、最小值和存在性測試等操作。5.1序列通用操作操作符描述s[i]索引,返回序列s的第i項,項序號為整數(shù)s[start:end[:step]]切片,返回序列s從start到end(不包括end)的步長為step的字符生成新的序列。step缺省時,步長為1,返回序號從start到end的子序列。s+t拼接兩個序列s和t,僅適用于列表和字符串s*n或n*sn為整數(shù),將序列s與自身拼接

n次生成新序列,range不支持此操作len(s)返回序列s的長度,序列包含元素的個數(shù)或字符串包含字符的個數(shù)min(s,*[,key,default])返回序列s的最小值,key關(guān)鍵字缺省時按元素值比較max(s,*[,key,default])返回序列s的最大值,key關(guān)鍵字缺省時按元素值比較s.count(x)x在s中出現(xiàn)的總次數(shù)s.index(x[,i[,j]])元素或字符x在序列s中首次出現(xiàn)項的索引號,i值存在時表示從索引號i處開始查找x,j存在時表示查找范圍在i和j之間。xins如果基本序列s中的某項等于

x

,則結(jié)果為True,否則結(jié)果False如果字符串s中的任一子序列與x相等,則結(jié)果為True,否則結(jié)果Falsexnotins如果基本序列s中的某項等于

x

,則結(jié)果為False,否則結(jié)果True如果字符串s中的任一子序列與x相等,則結(jié)果為False,否則結(jié)果True5.1.1索引字符串:每個字符擁有一個序號元組、列表或range對象:每個元素擁有一個序號序列數(shù)據(jù)內(nèi)部有序存儲,可以使用“序號”取得相應(yīng)的數(shù)據(jù)項。索引:通過序列數(shù)據(jù)的序號返回其對應(yīng)的值的操作,索引會創(chuàng)建一個新對象。兩種序號體系可以同時使用正向索引:序號正向從0開始,終止值為序列長度減1(len(s)-1)逆向索引:序號從-1開始,終止值為負的序列長度(-len(s))5.1.1索引字符串與列表的序號字符串而言,英文、中文、空格和各種符號都各占一個字符位。5.1.1索引索引是指通過序列數(shù)據(jù)的序號返回其對應(yīng)的字符或元素的操作??梢园凑蛐蛱栠M行索引或按逆向序號進行索引,通過序號獲取對應(yīng)的元素。索引的語法:序列名[序號]#字符串序列s=

'HelloWorld!'print(s[4])

#按序號正向索引,返回序號為4

的字符'o'print(s[-1])

#按逆向序號索引,返回最后一個字符

'!'5.1.1索引01234567891011HelloWorld!-12-11-10-9-8-7-6-5-4-3-2-1s5.1.1索引0123456789李明848095887665859855-10-9-8-7-6-5-4-3-2-1#序列類型—列表scores

=

['李明',

84,

80,

95,

88,

76,

65,

85,

98,

55]print(scores[0])

#按序號正向索引,返回序號為0的元素'李明'print(scores[4])

#按序號正向索引,返回序號為4的元素88print(scores[-1])

#按逆向序號索引,返回倒數(shù)第1個元素55print(scores[-3])

#按逆向序號索引,返回倒數(shù)第3個元素85scores5.1.1索引01234567890123456789-10-9-8-7-6-5-4-3-2-1#序列類型—ranger

=

range(10)

#獲得0,1,2,3,4,5,6,7,8,9的序列對象print(r[3])

#按序號正向索引,返回序號為3的元素

3print(r[-3])

#按逆向序號索引,返回倒數(shù)第3個元素

7r5.1.1索引當使用的索引值超出列表現(xiàn)有數(shù)據(jù)的索引時,Python將會產(chǎn)生“索引超出范圍”的異常。0123456789李明848095887665859855-10-9-8-7-6-5-4-3-2-1scores

=

['李明',

84,

80,

95,

88,

76,

65,

85,

98,

55]

#序號范圍為:0-9print(scores[10])#輸出:IndexError:listindexoutofrangescores5.1.1索引索引序號必須為整數(shù),不可為浮點數(shù)。試圖用浮點數(shù)做索引序號,Python將會產(chǎn)生TypeError。當索引值是通過計算得到時,務(wù)必使其值為整型類型或先用int()函數(shù)對其進行取整操作,再用做索引序號。scores

=

['李明',

84,

80,

95,

88,

76,

65,

85,

98,

55]

#序號范圍為:0-9print(scores[10.0//5])#10.0//5=2.0,為浮點數(shù)#TypeError:listindicesmustbeintegersorslices,notfloatprint(scores[int(10.0//5)])

#int(10.0//5)=2,返回805.1.1索引當索引結(jié)果仍是序列類型數(shù)據(jù)時,可以繼續(xù)索引,獲取元素中的數(shù)據(jù)。cv

=

['李明',

35,

('博士','副教授'),

[96,

92,

85]]#包含字符串、數(shù)字、元組和列表等多種類型數(shù)據(jù)的列表print(cv[0])

#序號為0的元素為字符串:'李明'print(cv[0][0])

#序號為0的元素中'李明'序號為0的元素為:'李'print(cv[2])

#序號為2的元素為元組('博士','副教授’)print(cv[3])

#序號為3的元素為列表[96,92,85]print(cv[2][0])

#序號為2的元素('博士','副教授')中序號為0的元素為:博士print(cv[3][1])

#序號為3的元素[96,92,85]中序號為1的元素為:920123'李明'35('博士','副教授')[96,92,85]'博士''副教授'96928501012cv5.1索引方法實現(xiàn)百分制轉(zhuǎn)五分制實例說明:輸入一個整數(shù),當輸入不在[0,100]

區(qū)間時輸出提示“Dataerror!”當輸入滿足要求的前提下,用多分支結(jié)構(gòu)實現(xiàn)百分制轉(zhuǎn)五分制。轉(zhuǎn)換規(guī)則:根據(jù)分數(shù)所在區(qū)間[0,60)、[60,70)、[70,80)、[80,90)、[90,100],分別輸出字符“E”“D”“C”“B”“A”。實例5.1索引方法實現(xiàn)百分制轉(zhuǎn)五分制思路:百分制分數(shù)整除10,可得到其十位上的整數(shù)“i”,字符串中以“i”值作為索引的字符正好對應(yīng)該分數(shù)段的五分制成績。將落在各區(qū)間的數(shù)分別對10做整除,得到0-10共11個數(shù)字,對應(yīng)字符串“EEEEEEDCBAA”中每個字符的序號。如85//10的結(jié)果為8,輸出字符串中序號為8的字符“B”。注意:當成績中有浮點數(shù)時,索引號需要先取整再使用。實例5.1索引方法實現(xiàn)百分制轉(zhuǎn)五分制def

convert_to_five_point_scale(score):

"""將百分制分數(shù)轉(zhuǎn)為五分制分數(shù),score:百分制分數(shù)(0-100),返回五分制分數(shù)(A-E)"""

degree

=

'EEEEEEDCBAA’

#序號0,1,2,3,4,5,6,7,8,9,10

if

score

>

100

or

score

<

0:

#排除不合法數(shù)據(jù)

return

'Dataerror!'

else:

i

=

int(score

//

10)

#用int()實現(xiàn)取整使索引號為整數(shù)

return

degree[i]

#degree[i]索引返回其中序號為I的字符

score

=

float(input('請輸入一個百分制成績:'))

#輸入為非負數(shù)five_point_score

=

convert_to_five_point_scale(score)

#調(diào)用函數(shù)print(f'{score}分轉(zhuǎn)為五分制為{five_point_score}’)

#輸出為ABCDE或Dataerror!實例5.1索引方法實現(xiàn)百分制轉(zhuǎn)五分制score

=

float(input())degree

=

'EEEEEEDCBAA'print('Dataerror!')

if

(score

>

100

or

score

<

0)

else

print(degree[int(score

//

10)])實例利用條件表達式實現(xiàn):注意:浮點數(shù)整除10的結(jié)果是值為整數(shù)的浮點數(shù),如8.0。這里的score接受的是浮點數(shù)的輸入,需要用int()函數(shù)取整,確保索引號為整數(shù)。字符串序列及列表、元組和range等序列類型數(shù)據(jù)都支持切片操作。切片的過程是從第一個要返回的元素開始,到第一個不想返回的元素結(jié)束按照給定的索引和步長,截取序列中的對象組成的新的片段對象切片的方法是:5.1.2切片seq[start:end:step]5.1.2切片seq[start:end:step]seq:序列類型數(shù)據(jù)對象名start:切片開始的位置元素序號是第一個要返回的元素的索引號;正向索引位置默認為0;逆向索引位置默認為負的序列長度,即-len(seq);start省略時從第一個元素開始切片。end:切片結(jié)束位置元素序號正向索引最后一個位置為序列長度減1,即len(seq)-1;逆向索引結(jié)束位置序號默認為-1;end省略時切片包括最后一個元素。step:取值的步長默認為1,不能為0start<end時步長為正值;start>end時步長為負值。5.1.2切片——字符串序列類型01234567891011HelloWorld!-12-11-10-9-8-7-6-5-4-3-2-1s

=

'HelloWorld!'print(s[6:8])

#根據(jù)序號[6:8]切片,輸出不包括結(jié)束序號的字符'Wo'print(s[:5])

#從起點到序號為5的位置切片,不包括5,'Hello'print(s[6:])

#從序號6向后到字符串結(jié)束切片,輸出'World!'print(s[-3:-1])

#負向索引,不包含右邊界元素,輸出'ld'print(s[6:-1])

#混用正負索引,輸出'World'print(s[::])

#從字符串開始到結(jié)束進行切片,輸出'HelloWorld!'print(s[::-1])

#按步長為-1進行切片,輸出'!dlroWolleH'print(s[::2])

#步長為2,輸出序號為偶數(shù)的元素,輸出'HloWrd's5.1.2切片——列表類型012345678910李明84809588967665859855-11-10-9-8-7-6-5-4-3-2-1scores

=

['李明',

84,

80,

95,

88,

96,

76,

65,

85,

98,

55]print(scores[5:])

#從5到序列結(jié)束的元素,輸出[96,76,65,85,98,55]print(scores[1:-1])

#混用索引[84,80,95,88,96,76,65,85,98]print(scores[1::2])

#步長為2,隔一個,輸出[84,95,96,65,98]print(max(scores[1:]))

#切片返回除序號0的列表,max返回其最大值print(sum(scores[1:]))

#利用sum()函數(shù)對切片獲取的序列求和,輸出822#len()獲得切片后的列表元素個數(shù)print(sum(scores[1:])

/

len(scores[1:]))

#輸出切片后的序列元素的平均值82.25.1.2切片——range類型r

=

range(10)

#獲得0,1,2,3,4,5,6,7,8,9的序列print(r[3:6])

#對range(10)切片,返回新對象range(3,6)print(sum(r[1::2]))

#輸出序號為奇數(shù)的元素的和25print(sum(r[0::2])

/

len(r[0::2]))

#輸出序號為偶數(shù)的元素的平均值4.001234567890123456789-10-9-8-7-6-5-4-3-2-1r5.1.2切片——包含多種類型數(shù)據(jù)的列表cv

=

['李明',

35,

('博士','副教授'),

[96,

92,

85]]print(cv[2:4])

#切片得到新列表[('博士','副教授'),[96,92,85]]0123'李明'35('博士','副教授')[96,92,85]-4-3-2-1cv5.2回文字符串實例說明:一個字符串,如果各字符逆序排列與原字符串相同,則稱為回文,如“12321”、“上海自來水來自海上”用戶輸入一個字符串,判斷是否為回文,如果是輸出True,否則輸出False。實例123215.2回文字符串思路:從前到后將字符串的每一個字符與從后向前每一個字符一一比較,如果都一一相同,則是回文。利用切片方法(s[start:end:step])。令步長step值為-1,從最后一個字符開始,到字符串開始字符結(jié)束進行切片,即構(gòu)造切片s[-1::-1]或s[::-1],可以獲得逆序的字符串。比較逆序的字符串與原字符串是否相同,相同則是回文。實例s

=

input()

#輸入一個字符串if

s

==

s[-1::-1]:

#s[-1::-1]將字符串反轉(zhuǎn),判斷反轉(zhuǎn)后是否與原字符串相等

print(True)

#如果相等,是回文,輸出Trueelse:

print(False)

#如果不相等,不是回文,輸出False5.2回文字符串實例print(True)

if

(s

:=

input())

==

s[::-1]

else

print(False)1.分支語句實現(xiàn)2.條件表達式結(jié)合賦值運算符實現(xiàn)s

=

input()

#輸入一個字符串def

palindromic(s):

"""判定字符串否為回文字符串,s:輸入字符串,返回布爾值"""

return

s

==

s[::-1]

#比較運算結(jié)果為布爾值print(palindromic(s))

#調(diào)用函數(shù)并輸出結(jié)果5.2回文字符串實例3.函數(shù)實現(xiàn)直接返回比較運算表達式,避免使用分支語句。5.1.3序列拼接與重復(fù)字符串、元組與列表等序列類型都支持拼接與重復(fù)的操作。range序列類型不支持序列拼接或重復(fù),嘗試拼接或重復(fù)range對象時,會觸發(fā)異常。序列拼接:"+",將兩個相同類型的序列拼接為一個。序列重復(fù):s*

n,s中的元素重復(fù)n次,產(chǎn)生一個新序列。當n小于或等于0時會被當作0來處理,此時序列重復(fù)0次的操作將產(chǎn)生一個空序列。year

=

2025s

=

'年'print('='

*

10)

#字符串重復(fù)10次print(str(year)

+

s)

#字符串拼接,整數(shù)參與拼接要先轉(zhuǎn)為字符串print('='

*

10)

#字符串重復(fù)10次輸出:==========2025年==========序列拼接與重復(fù)ls

=

[[]]

#創(chuàng)建一個包含一個空列表的列表ls_new

=

ls*

3

#重復(fù)只包含一個空列表元素的列表3次print(ls_new)

#重復(fù)引用空列表元素3次產(chǎn)生一個新列表[[],[],[]]ls[0].append(3)

#向列表中序號為0的元素中增加一個元素3print(ls_new)

#輸出:[[3],[3],[3]],列表ls中的元素是重復(fù)引用5.1.3

序列重復(fù)操作只是多次引用原序列中的元素,原序列中的項并不會被拷貝原序列中元素的改變將會導(dǎo)致重復(fù)序列中的元素改變。5.3輸出身份證信息實例說明:中國的居民身份證號是一個18個字符的字符串,其各位上的字符代表的意義如下:第1、2位數(shù)字表示所在省份的代碼第3、4位數(shù)字表示所在地區(qū)的代碼第5、6位數(shù)字表示所在市縣的代碼第7~14位數(shù)字表示出生年、月、日第15、16位數(shù)字表示身份證注冊地的派出所的代碼第17位數(shù)字表示性別,奇數(shù)表示男性,偶數(shù)表示女性第18位數(shù)字是校檢碼,用來檢驗身份證號的正確性,校檢碼可以是0-9中的一個數(shù)字,也可能是字母X。實例5.3輸出身份證信息實例說明:輸入一個身份證號,編程判斷其長度是否正確;輸出其出生年月日。思路:身份證中提取生日,涉及判斷、字符串長度、切片、拼接等知識點可以使用len()函數(shù)測字符串的長度并判斷長度是否為18用字符串切片的方法獲取身份證號碼中代表出生年月日的子串,并用"+"拼接實例5.3輸出身份證信息def

get_date_of_birth(id_num):

"""接收一個身份證號碼,返回出生日期,若輸入位數(shù)不是18,則輸出錯誤提示信息"""

if

len(id_num)

==

18:

#測試輸入的字符串長度是否為18

year

=

id_num[6:10]

#id_num序號6、7、8、9字符串,年份

month

=

id_num[10:12]

#id_num序號為10、11的字符串,月份

day

=

id_num[12:14]

#id_num序號為12、13的字符串,日期

birthdate

=

'出生于'+year+'年'+month+'月'+day+'日'

#字符串拼接

#birthdate=f'出生于{year}年{month}月{day}日'

#f-string方法

return

birthdate

else:

#輸入的字符串長度不是18時,輸出錯誤提示信息

return

'輸入的身份證號位數(shù)錯'

id_number

=

input()

#輸入一個表示身份證號的字符串print(get_date_of_birth(id_number))

#調(diào)用函數(shù),輸出出生日期或出錯信息實例5.4約瑟夫環(huán)問題實例說明:有20個人圍坐在一張圓桌周圍從第1個人開始報數(shù),數(shù)到3的人出列下一個人又從1開始報數(shù),數(shù)到3的那個人又出列;依此規(guī)律重復(fù),直到圓桌周圍的人數(shù)少于3時結(jié)束,輸出剩下的人的序號。實例5.4約瑟夫環(huán)問題問題中要求每數(shù)到3的人出列,那么最后只剩2人時結(jié)束。20個人圍成一個圈用一個列表表示,每次將列表的第3個元素去除,同時將前2個元素拼接到列表的末尾,循環(huán)執(zhí)行,直至列表長度小于3為止。變化過程:實例[

4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]1,2,3,[

,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2][

,9,10,11,12,13,14,15,16,17,18,19,20,1,2,4,5]4,57,

8…[13,20,2][13,20]5.4約瑟夫環(huán)問題實例說明:約瑟夫環(huán)問題可以擴展為:一圈共有n個人,從1開始報數(shù),報到m的人出列,然后重新開始報數(shù),剩余人數(shù)小于m時停止,輸出每次出列的人的序號。思路:split()函數(shù):把用空格分隔的輸入切分為包含2個值的列表map()函數(shù):將列表中的所有值映射為參數(shù)指定的類型,此處為整數(shù)。多變量賦值:將這兩個整數(shù)值分別賦值給n和m。實例5.4約瑟夫環(huán)問題def

josephus(n,

m):

"""接受兩個參數(shù),n為總?cè)藬?shù),m為報數(shù)的數(shù)字,返回列表"""

ls

=

list(range(1,

n

+

1))

#構(gòu)造一個元素1到n的列表

while

len(ls)

>

m

-

1:

#列表長度大于m-1時,去掉第m個元素

ls

=

ls[m:]

+

ls[:m

-

1]

#前m-1個元素拼接到m以后的列表末尾

return

ls

#循環(huán)結(jié)束后,返回列表中剩下的元素

total,

num

=

map(int,

input().split())

#輸入切分為列表并映射為整數(shù)print(josephus(total,

num))

#[4,7,1,8,5,2,9,6,3,10]實例5.1.4成員測試"in"和"notin"運算符用于測試某對象是否為字符串、列表或元組等序列或集合中的成員,返回布爾值(True或False)。in:存在返回True,否則返回Falsenotin:不存在返回True,否則返回False成員測試一般用于條件運算,根據(jù)測試結(jié)果決定執(zhí)行后續(xù)程序中的某個分支。famous_book

=

['水滸傳','三國演義','西游記','紅樓夢']book_name

=

input()

if

book_name

in

famous_book:

print(f'{book_name}是中國四大名著之一')else:

print(f'{book_name}不是中國四大名著之一')5.5溫度轉(zhuǎn)換實例說明:溫度的表示有攝氏度和華氏度兩個體系。轉(zhuǎn)換公式如下:C=(F-32)/1.8,F(xiàn)=C*1.8+32,其中,C表示攝氏度、F表示華氏度請編寫程序,將用戶輸入的華氏度轉(zhuǎn)換為攝氏度,或?qū)z氏度轉(zhuǎn)換為華氏度,保留小數(shù)點后

2位小數(shù)。要求輸入輸出的攝氏度單位用大寫字母"C"或小寫字母"c",華氏度單位用大寫字母"F"或小寫字母"f"。用戶輸入帶單位的溫度數(shù)值,可以是整數(shù)或小數(shù),如12.34C指攝氏12.34度;87.65F指華氏87.65度。實例5.5溫度轉(zhuǎn)換def

convert_temperature(temperature):

"""將輸入的溫度值轉(zhuǎn)換為另一種溫標,temperature:輸入的溫度值,字符串形式,以溫度單位符號結(jié)尾,返回轉(zhuǎn)換后的溫度值或出錯信息,字符串形式。"""

if

temperature[-1]

in

'Ff':

#符號是否在'Ff'中存在

C

=

(float(temperature[:-1])

-

32)

/

1.8

#用華氏轉(zhuǎn)攝氏公式計算

return

"{:.2f}C".format(C)

#返回轉(zhuǎn)換后溫度和單位

elif

temperature[-1]

in

'Cc':

#符號是否在'Cc'中存在

F

=

1.8

*

float(temperature[:-1])

+

32

#用攝氏轉(zhuǎn)華氏公式計算

return

"{:.2f}F".format(F)

#返回轉(zhuǎn)換后溫度和單位

else:

#末位不是"Cc"和"Ff"中的字符

return

'Dataerror!'

#返回錯誤提示實例5.1.5最大值和最小值max(s)

與min(s)

返回序列元素的最大值和最小值。元素為數(shù)值類型時直接比較元素為字符串時,比較字符串的unicode

編碼的值ls

=

[ord(x)

for

x

in

'2020年9月']

#用ord()得到每個字符的unicode值列表print(ls)

#[50,48,50,48,24180,57,26376]print(max('2020年9月'))

#輸出字符串中unicode值最大的字符,月print(min('2020年9月'))

#輸出字符串中unicode值最小的字符,05.1.5最大值和最小值max()和min()函數(shù)用key

關(guān)鍵字指定判定最大值和最小值的規(guī)則。ls

=

['a',

'baa',

'bcde',

'de']print(max(ls))

#比較各字符的unicode值,d最大,輸出deprint(min(ls))

#比較各字符的unicode值,a最小,輸出aprint(max(ls,

key=len))

#比較列表中各字符串長度,bcde最大print(min(ls,

key=len))

#比較列表中各字符串長度,a最小,輸出anum

=

['01',

'9',

'10',

'5']print(max(num))

#比較列表中各字符串長度,'9'最大print(max(num,

key=int))

#按各元素轉(zhuǎn)整型后比較,'10'轉(zhuǎn)整型10,最大5.2字符串5.2字符串字符串是Python中最常用的數(shù)據(jù)類型,屬于不可變數(shù)據(jù)類型。數(shù)據(jù)來源:input()函數(shù)接收到的數(shù)據(jù)、讀取文本文件獲得的數(shù)據(jù)等主要應(yīng)用:文本分析處理、文件數(shù)據(jù)處理。界定符:成對引號。一對單引號('')、雙引號("")

或三引號(''''''或"""""")字符串長度:包含字符的個數(shù)。當包含0個字符時,長度為0,稱為空字符串。print(len(''))

#長度0,空字符串print(len(''))

#長度1,空格字符串,1個空格1個字符print(len('Hesaid,"Good".'))

#長度16,空格和標點符號各1個字符print(len("I'mhere"))

#長度8,字符串含單引號時外面用雙引號print(len('程序設(shè)計'))

#長度4,每個漢字1個字符5.2.1字符串的創(chuàng)建將一個或多個字符放在引號中single_str

=

'這是字符串,允許包含"雙引號"'#單引號字符串可包含雙引號double_str

=

"這是字符串,允許包含'單引號'"#雙引號字符串可包含單引號

poem

='''#三引號字符串可包含單引號和雙引號,保留換行符驛外斷橋邊,寂寞開無主。已是黃昏獨自愁,更著風和雨。無意苦爭春,一任群芳妒。零落成泥碾作塵,只有香如故。'''三引號也用于Python的注釋和文檔字符串5.2.1字符串的創(chuàng)建應(yīng)用str()函數(shù),返回一個對象的字符串形式。str(object=b'',

encoding='utf-8',

errors='strict')str()函數(shù)包括三個默認值參數(shù),參數(shù)為空則返回空字符串。encoding或errors至少給出其中之一時,object對象應(yīng)該是一個字節(jié)類對象,此時將object對象用encoding指定的編碼讀取二進制流的內(nèi)容encoding或errors均缺省時,str(object)返回object對象的“非正式”或格式良好的字符串表示5.2.1字符串的創(chuàng)建print(str(1234)[1])

#整數(shù)轉(zhuǎn)字符串再索引,返回'2'print(str(1.234)[0:3])

#浮點數(shù)轉(zhuǎn)字符串再切片',返回1.2'print(str(1234)[1])

#整數(shù)轉(zhuǎn)字符串,返回'2'print(str([1,

2,

3])[1])

#列表轉(zhuǎn)字符串,返回'1',序號為0的元素為'['print(str((1,

2,

3))[1])

#元組轉(zhuǎn)字符串,返回'1',序號為0的元素為'('print(str({1,

2,

3})[1])

#集合轉(zhuǎn)字符串,返回'1',序號為0的元素為'{'print(str({'a':

1,

'b':

2}))

#"{'a':1,'b':2}"print(str({'a':

1,

'b':

2})[1:4])

#切片,序號1,2,3的字符:'a'

s

=

b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c

\xe6\x88\x91\xe7\x94\xa8Python!'print(str(s,

encoding='utf-8'))

#以utf-8編碼讀取二進制流的內(nèi)容“人生苦短,我用Python!”5.2.1字符串的創(chuàng)建讀文件生成字符串with和open()函數(shù)打開一個文件并創(chuàng)建一個文件對象。循環(huán)遍歷輸出,每次循環(huán)把其中一行讀取為一個以換行符“\n”結(jié)尾的字符串。#以只讀模式打開文件,創(chuàng)建文件對象filewith

open('明日歌.txt','r',encoding='utf-8')

as

file:

for

line

in

file:

#遍歷輸出文件對象中的每一行

print(line)

#每行為一個字符串,行末換行符解析為換行注:代碼中with…as為上下文管理器,將open()函數(shù)放在其中,可以在代碼結(jié)束縮進后自動關(guān)閉文件,避免顯式使用關(guān)閉文件的語句和關(guān)閉異常。5.2.2字符串中的常量Python內(nèi)置了一些字符串常量,封裝了一些常用字符集,如string.digits

代表'0123456789'使用字符串常量時,需先importstring導(dǎo)入string庫。5.2.2字符串中的常量字符串常量字符集string.ascii_letters'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'string.ascii_lowercase'abcdefghijklmnopqrstuvwxyz'string.ascii_uppercase'ABCDEFGHIJKLMNOPQRSTUVWXYZ'string.digits'0123456789'string.hexdigits'0123456789abcdefABCDEF'string.octdigits'01234567'.string.punctuation'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'string.printable'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\t\n\r\x0b\x0c'string.whitespace'\t\n\r\x0b\x0c'

5.6分類統(tǒng)計字符個數(shù)實例說明:輸入一個字符串,以回車結(jié)束,統(tǒng)計字符串里英文字母、數(shù)字和其他字符的個數(shù)(回車符代表結(jié)束輸入,不計入統(tǒng)計)。思路:遍歷輸入的字符串,依次判定每個字符的種類并做統(tǒng)計用字母和數(shù)字的字符串常量“string.ascii_letters”和“string.digits”做成員測試判定字符的類型。實例5.6分類統(tǒng)計字符個數(shù)實例import

string

def

count_characters(my_string):

"""my_string為輸入字符串,返回字母、數(shù)字和其他字符的數(shù)量"""

letter,

digit,

other

=

0,

0,

0

#用于計數(shù)的3個變量均設(shè)初值為0

for

c

in

my_string:

#遍歷,c依次取值為字符串中的字符

if

c

in

string.ascii_letters:

#若c在字母常量中存在,則c是字母

letter

+=

1

#字母計數(shù)加1個

elif

c

in

string.digits:

#若c在數(shù)字常量中存在,則c是數(shù)字

digit

+=

1

#數(shù)字計數(shù)加1個

else:

other

+=

1

#否則其他字符計數(shù)加1個

return

letter,

digit,

other

#返回字母、數(shù)字和其他字符的數(shù)量5.2.3字符串的表示Python支持中文,默認使用UTF-8編碼。UTF-8編碼是可變長度的編碼,用1到6個字節(jié)編碼Unicode字符。常用中文字符用UTF-8編碼占用3個字節(jié)(大約2萬字),超大字符集中的更大多數(shù)漢字要占4個字節(jié),某些生僻字可能用六個字節(jié)表示。UTF-8編碼既解決ASCII編碼容量不夠的問題,又避免了使用Unicode編碼浪費空間問題,并在最大限度上兼容了早期的ASCII編碼,使一些早期使用ASCII編碼的軟件在UTF-8編碼中可以繼續(xù)正常工作。5.2.3字符串的表示在UTF-8編碼環(huán)境下,任何一個數(shù)字、英文字母、漢字都被按一個字符進行對待和處理。s1

=

'湖北省武漢市'

#6個中文字符,長度為6s2

=

'hubei'

#5個英文字符,長度為5print(len(s1),

len(s2))

#len()是測試長度函數(shù),輸出6

55.2.4字符串的遍歷字符串的遍歷是指用循環(huán)的方法依次獲取字符串中的每個字符,字符串遍歷的方法如下:string為需要遍歷的字符串變量c依次被賦值為字符串中的字符循環(huán)次數(shù)為字符串中字符個數(shù)forcinstring:#變量c依次取值為字符串中的字符語句塊5.7字符串加密實例說明:在一行中輸入一個包括大小寫字母和數(shù)字的字符串,編程將其中的大寫字母用該字母后第4個字母替換,其他字符原樣輸出,實現(xiàn)字符串加密。思路:建立原字符序列和替換字符序列遍歷字符串,如果滿足大寫字母的條件,則將替換序列中對應(yīng)位置的字母進行替換。實例5.7字符串加密實例def

encrypt_string(plaincode):

"""plaincode:輸入的明文字符串,返回加密后的字符串"""

p

=

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

#原字符序列

s

=

'EFGHIJKLMNOPQRSTUVWXYZABCD'

#替換字符序列,s=p[4:]+p[:4]

ciphertext

=

''

#空字符串,存放加密字符串

for

c

in

plaincode:

#遍歷輸入的明文字符串

n

=

p.find(c)

#返回c在p中的位置序號,找不到時返回-1

if

n

==

-1:

#值為-1表示c在p中不存在,不是大寫字母

ciphertext

+=

c

#將原字符拼接到ciphertext上

else:

#c為大寫字母,用序列s中對應(yīng)位置的字母替換

ciphertext

+=

s[n]

#替換的字符拼接到ciphertext

return

ciphertext

#返回加密后的字符串輸入:LIFEisSHORT,youNEEDPYTHON輸出:PMJIisWLSVX,youRIIHTCXLSR5.2.5文件的遍歷應(yīng)用open()函數(shù)可以打開一個文件并創(chuàng)建一個文件對象:filename是讀取的帶路徑和擴展名的文件名mode為讀取模式參數(shù),值為“r”表示只讀取文件內(nèi)容,不修改文件,mode參數(shù)可省略,默認值為只讀。with…as為上下文管理器file為讀取文件后創(chuàng)建的文件對象with

open('filename',

mode='r',

encoding

=

'utf-8')

as

file:5.2.5文件的遍歷訪問文件數(shù)據(jù)常用方法:用文件對象的readline()方法和read()方法讀取其中的數(shù)據(jù)。對文件對象進行遍歷,逐行輸出其內(nèi)容。用遍歷文件對象的方法時,文件的每一行被作為一個字符串處理。在每行的行末,有一個隱藏的換行符“\n”,它會被作為字符串的一部分。輸出時,字符串中的“\n”會被解析為一次換行。for

line

in

file:#file為文件對象,循環(huán)次數(shù)為文件的行數(shù),

語句塊

變量line每次被賦值為文件的一行5.8遍歷輸出文件實例說明:有一個文本文件“靜夜思.txt”,編碼為“utf-8”,文件內(nèi)容如下,編程讀取文件的內(nèi)容:靜夜思床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉(xiāng)。實例5.8遍歷輸出文件實例with

open('靜夜思.txt',

'r',

encoding='utf-8')

as

poem:

for

line

in

poem:

#對文件對象poem進行逐行遍歷

print(line)

#每次循環(huán)輸出文件中的一行內(nèi)容用print()函數(shù)對其進行輸出時,行末的換行符“\n”會被解析為一個換行,導(dǎo)致輸出的每一行數(shù)據(jù)后有一個空行存在??梢杂胷eplace()函數(shù)替換掉行末的換行符,或用rstrip()函數(shù)去掉行末的空白字符,使輸出時不出現(xiàn)多余的空行。這里涉及replace()和rstrip()方法,這是字符串的操作方法,在本章后面會有詳細講述。5.2.6字符串處理方法方法名描述str.upper()/str.lower()轉(zhuǎn)換字符串str中所有字母為大寫/小寫str.strip()用于移除字符串開頭、結(jié)尾指定的字符(缺省時去掉空白字符,包括\t、\n、\r、\x0b、\x0c等)str.join(iterable)以字符串str作為分隔符,將可迭代對象iterable中字符串元素拼接為一個新的字符串。當iterable中存在非字符串元素時,觸發(fā)TypeError異常。str.split(sep=None,maxsplit=-1)根據(jù)分隔符sep將字符串str切分成列表,缺省時根據(jù)空格切分,可指定逗號或制表符等。Maxsplit值存在且非-1時,最多切分maxsplit次。str.count(sub[,start[,end]])返回sub

在字符串str里面出現(xiàn)的次數(shù),如果start或者end指定則返回指定范圍內(nèi)sub出現(xiàn)的次數(shù)。5.2.6字符串處理方法方法名描述str.find(sub[,start[,end]])檢測sub

是否包含在字符串str

中,如果是返回開始的索引值,否則返回-1。如果start和end指定范圍,則檢查是否包含在指定范圍內(nèi)。str.replace(old,new[,count])把字符串str中的old

替換成

new,如果count指定,則替換不超過count次,否則有多個old子串時全部替換為new。str.index(sub[,start[,end]])與find()方法一樣,返回子串存在的起始位置,如果sub不在字符串str中會觸發(fā)一個異常。for

<var>

in

<string>對字符串string進行遍歷,依次將字符串string中的字符賦值給前面的變量var5.2.6字符串處理方法str.upper()和str.lower()分別用于將其前面的字符串轉(zhuǎn)換成大寫字母和小寫字母,如input().upper()可以將用戶輸入的字符串中的小寫字母都轉(zhuǎn)換成大寫字母。例如,網(wǎng)頁上經(jīng)??梢钥吹捷斎腧炞C碼時是不區(qū)分大小寫的,其后臺的程序一般會將用戶的輸入和圖片中的字符都統(tǒng)一轉(zhuǎn)成大寫字母(或統(tǒng)一轉(zhuǎn)成小寫字母),再去一一比較是否一致。5.2.6字符串處理方法rstrip()和strip()函數(shù)rstrip()函數(shù)用于移除字符串結(jié)尾指定的字符strip()函數(shù)用于移除字符串開頭和結(jié)尾指定的字符。當參數(shù)缺省時,默認去掉字符串首尾的空白字符(不可見字符),包括"\t

(制表符)"、"\n

(換行符)"和"\r

(回車符)"等。s

=

'0089840'print(s)

#原字符串0089840s1

=

s.rstrip('0')

#移除結(jié)尾的0print(s1)

#008984s2

=

s.strip('0')

#去除字符串首尾0print(s2)

#89845.9隱私信息脫敏實例說明:手機號屬于個人隱私信息,編程將用戶輸入的手機號的4-7位用“*”替換。輸入格式為:11位數(shù)字的手機號碼,如思路:可以使用字符串切片,取出保留的數(shù)字,再加上星號,重新進行拼接也可以使用replace()方法,將4-7位的字符串替換為星號實例5.9隱私信息脫敏實例def

mask_phone_number(phone_number):

"""將手機號的4-7位用“*”替換,phone_number:11位數(shù)字的手機號碼

返回替換后的手機號碼或出錯信息

"""

if

len(phone_number)

!=

11

or

not

phone_number.isdigit():

return

"請輸入11位數(shù)字的手機號碼"

return

phone_number[:3]

+

"****"

+

phone_number[7:]

phone_number

=

input("請輸入11位數(shù)字的手機號碼:")masked_phone_number

=

mask_phone_number(phone_number)print(masked_phone_number)

字符串拼接5.9隱私信息脫敏實例info

=

input()

#輸nfoPvt1

=

info.replace(info[3:7],

'****')

#直接將字符串第3-6這4個字符進行替換infoPvt2

=

info.replace(info[3:7],

'****',

1)

#僅替換1次print(infoPvt1)

#139********print(infoPvt2)

#139****4321

replace()方法若不指定替換次數(shù),當字符串中有與需替換的字符串相同的子串時,也會被替換掉,當輸入時,輸出將變成“139********”。若替換的子串與其他位置的子串相同,也會有問題,例如輸入,會輸出“****32****1”。使用切片拼接方法最為穩(wěn)妥。5.10凱撒密碼實例說明:在密碼學(xué)中,愷撒密碼是一種最簡單且最廣為人知的加密技術(shù)。這是一種替換加密的技術(shù),明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進行偏移后被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。輸入一個字符串明文,再輸入一個正整數(shù),代表偏移量,用愷撒密碼對明文進行加密后輸出。實例5.10凱撒密碼實例import

string

def

caesar_cipher(plaintext,

shift):

"""愷撒加密,plaintext:輸入的明文字符串,shift:偏移量,返回加密后的密文字符串"""

lower

=

string.ascii_lowercase

#小寫字母

upper

=

string.ascii_uppercase

#大寫字母

before

=

string.ascii_letters

#全部大小寫字母

after

=

lower[shift:]

+

lower[:shift]

+

upper[shift:]

+

upper[:shift]

table

=

str.maketrans(before,

after)

#創(chuàng)建映射表

return

plaintext.translate(table)

#返回加密后的密文字符串輸入明文:Membershiptestoperations輸入偏移量:3輸出密文:Phpehuvklswhvwrshudwlrqv5.11模擬登錄驗證碼實例說明:使用Python來模擬一個簡單的驗證碼系統(tǒng),驗證碼顯示為隨機生成的字符序列,用戶需要正確輸入該驗證碼才能通過驗證。程序功能要求:生成一個隨機驗證碼。顯示驗證碼,要求用戶輸入。驗證用戶的輸入是否正確。如果輸入錯誤,允許用戶多次嘗試。實例5.11模擬登錄驗證碼思路:使用random和string模塊來生成一個包含字母和數(shù)字的隨機驗證碼。使用string.ascii_letters獲取所有大小寫字母,使用string.digits獲取數(shù)字0-9,并將兩個字符串拼接為一個字符串。使用random.choice()隨機選擇字符,生成指定長度的驗證碼。[random.choice(characters)foriinrange(length)]的作用是重復(fù)length次隨機選取字符,''.join()的作用是將參數(shù)序列中的字符元素拼接為一個字符串。實例5.11模擬登錄驗證碼實例import

randomimport

string

def

generate_captcha(length=6):

"""生成字母和數(shù)字組成的隨機驗證碼,length:驗證碼的長度默認為6,返回生成的驗證碼"""

#字符庫:大寫字母、小寫字母和數(shù)字

characters

=

string.ascii_letters

+

string.digits

#隨機選擇length個字符并連接為一個字符串

captcha

=

''.join([random.choice(characters)

for

i

in

range(length)])

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論