Python入門課程系列:
序列(sequence):序列是python中最基本的數(shù)據(jù)結(jié)構(gòu)赎瞎。序列是一組按照順序排列的值,其中的元素帶編號(編號從0開始)
在python中,存在三種內(nèi)置的序列類型 ,即:字符串、列表和元組威兜。其中列表是可變的(你可修改其內(nèi)容),而元組和字符串是不可變的(一旦創(chuàng)建,內(nèi)容就是固定的)熟史。
字典不屬于序列,沒有下標窄俏,不能取切片
優(yōu)點:可以支持索引和切片的操作
特征:第一個正索引為0蹂匹,指向是從左往右。當使用負數(shù)索引時凹蜈,Python將從右(即從最后一個元素)開始往左數(shù)限寞,因此-1是最后一個元素的位置。
??1. 字符串及常用方法
所有標準序列操作(索引仰坦、切片履植、乘法、成員資格檢查悄晃、長度玫霎、最小值和最大值)都適用于字符串,但字符串是不可變的妈橄,因此所有的元素賦值和切片賦值都是非法的庶近。
- 將值轉(zhuǎn)換為字符串并設(shè)置其格式是一個重要的操作,主要的解決方案是使用字符串格式設(shè)置運算符——百分號眷蚓。在%左邊指定一個字符串(格式字符串)鼻种,并在右邊指定要設(shè)置其格式的值。指定要設(shè)置其格式的值時溪椎,可使用單個值(如字符串或數(shù)字)璧南,可使用元組(如果要設(shè)置多個值的格式)刨摩,還可使用字典敞曹,其中最常見的是元組丧靡。
- %s稱為轉(zhuǎn)換說明符,指出了要將值插入什么地方歉秫。s意味著將值視為字符串進行格式設(shè)置蛾洛。如果指定的值不是字符串,將使用str將其轉(zhuǎn)換為字符串。其他說明符將導(dǎo)致其他形式的轉(zhuǎn)換轧膘。例如钞螟,%.3f將值的格式設(shè)置為包含3位小數(shù)的浮點數(shù)。
難點
1.字符串常用方法
2.切片操作
?? 切片:可以根據(jù)下標來獲取序列對象的任意部分數(shù)據(jù)谎碍,語法結(jié)構(gòu)[start:end:step]鳞滨,step默認為1。
??切片是左包含右不包含
3.與其他類型綜合操作
Test="python"
print('Test的內(nèi)存地址%d'%id(Test)) #id函數(shù)可以查看一個對象的內(nèi)存地址
Test1=Test #這里只是把Test對象的地址賦給了Test1惦费,Test和Test1的ip地址是一樣的
print(type(Test))
print('獲取第一個字符%s'%Test[0])
#取切片操作
strMsg='hello world'
#slice[start:end:step] #左閉右開 范圍:start<=value<end
print(strMsg) #輸出完整的數(shù)據(jù)
print(strMsg[0]) #輸出第一個數(shù)據(jù)
print(strMsg[2:5]) #取第三個到第五個數(shù)據(jù)之間數(shù)據(jù)
print(strMsg[2:]) #從第三個值取到最后
print(strMsg[:3]) #從第一個值取到第三個
print(strMsg[::-1]) #倒序輸出負號表示方向是從右往左
#常用函數(shù)操作
#1. 首字母大寫
name='peter'
print('姓名首字母轉(zhuǎn)換大寫%s'%name.capitalize())
#2. 刪除空格
a=' hello '
b=a.strip() #strip是刪除空格兵迅,lstrip是刪除左邊空格,rstrip是刪除右邊空格
print(b)
#3. 查找某個字符是否在某個字符串內(nèi)
dataStr='I love python'
print(dataStr.find('p')) #查找目標對象在序列對象中的位置趁餐,返回第一個下標值喷兼,沒找到返回-1,并非返回布爾值
print(dataStr.index('l')) #檢測字符串中是否包含子字符串后雷,返回第一個下標值,沒找到會報錯
#4. 判斷字符串的開頭和結(jié)尾
dataStr='I love python'
print(dataStr.startswith('I'))
print(dataStr.endswith('I'))
#5. 大小寫轉(zhuǎn)換
print(dataStr.upper())
print(dataStr.lower())
#6. join 其作用與split相反吠各,用于合并序列的元素臀突。
#所合并序列的元素必須都是字符串。
seq = [1, 2, 3, 4, 5]
sep = '+'
sep.join(seq) # 嘗試合并一個數(shù)字列表會報錯
#Traceback (most recent call last):
#File "<stdin>", line 1, in ?
#TypeError: sequence item 0: expected string, int found
seq = ['1', '2', '3', '4', '5']
print(sep.join(seq)) # 合并一個字符串列表
# '1+2+3+4+5'
????2. 列表及常用方法
list:python中非常重要的數(shù)據(jù)結(jié)構(gòu)贾漏,是一種有序的數(shù)據(jù)集合
內(nèi)置函數(shù)list可以將字符串轉(zhuǎn)化成列表
特點:
1.支持增候学、刪、改纵散、查
2.列表中的數(shù)據(jù)是可以變化的【數(shù)據(jù)項可以變化梳码,內(nèi)存地址不會改變】
3.用[]來表示列表類型,數(shù)據(jù)項之間用逗號來分割 伍掀,注意:數(shù)據(jù)項可以是任意類型的數(shù)據(jù)
4.支持索引和切片來進行操作
列表與元組的主要不同在于:列表可以修改掰茶,元組不可以。這意味著列表適用于需要中途添加元素的情形蜜笤,而元組適用于處于某種考慮禁止修改序列的情形濒蒋。
li=[1,2,3,'你好'] #使用[]創(chuàng)建列表
print(len(li)) #len函數(shù)可以獲取列表對象中的數(shù)據(jù)個數(shù)/也可查看字符串中的字符數(shù)
#鑒于不能像修改列表那樣修改字符串,因此在有些情況下使用字符串來創(chuàng)建列表很有幫助围橡。
#為此暖混,可使用內(nèi)置函數(shù)list
a=list('Hello')
print(a)
#['H', 'e', 'l', 'l', 'o'] #將字符串轉(zhuǎn)換為列表
#取切片操作
listA=['abcd',789,12.23,'qiuzhi',True]
print(listA) #輸出完整列表
print(listA[0]) #輸出第一個元素
print(listA[1:3]) #獲取第2-3個元素
print(listA[2:]) #獲取3到最后一個元素
print(listA[::-1]) #倒序輸出
print(listA*2) #輸出兩遍【復(fù)制】
#修改
listA[0]='Peter'
print(listA)
listA[0]=1
print(listA)
#方法1: append 追加操作
listA.append(['fff','ddd',333]) #在列表里面插入列表,插入的列表算一個元素翁授,只是這個元素又包含了三個元素
print(listA)
print(len(listA))
#方法2: insert 插入操作儒恋,需要指定位置
listA.insert(1,'新插入') #插入在第二個位置
print(listA)
#方法3: entend 拓展數(shù)據(jù),等于批量添加
rsData=list(range(10))
listA.extend(rsData)
print(listA)
listA.extend([11,12,13,14]) #直接追加也可以 ??和append不同
print(listA)
# 方法4: reverse 按相反的順序排列列表中的元素
#??如果要按相反的順序迭代序列黔漂,可使用函數(shù)reversed诫尽。這個函數(shù)不返回列表,而是返回一個迭代器炬守,可使用list將返回的對象轉(zhuǎn)換為列表牧嫉。
x = [1, 2, 3]
x.reverse()
print(x)
#[3, 2, 1]
# 方法5: 刪除 del remove pop
listB=list(range(10,50))
print(listB)
del listB[0] #刪除第一個數(shù)據(jù)
print(listB)
del listB[1:3] #通過切片刪除多個數(shù)據(jù)(第二項到第三項)
listB.remove(20) #移除指定元素,括號內(nèi)的是需要移除的指定項
listB.pop(1) #移除指定元素减途,如果不指定酣藻,則移除第一個數(shù)據(jù)。pop后面的參數(shù)是需要移除的指定項的索引值
#??pop是唯一既修改列表又返回一個非None值的列表方法鳍置。
#??方法6: copy 復(fù)制列表
#常規(guī)復(fù)制只是將另一個名稱關(guān)聯(lián)到列表
a = [1, 2, 3]
b = a
b[1] = 4 #指向相同的內(nèi)存內(nèi)容
print(a)
# [1, 4, 3]
#要讓a和b指向不同的列表辽剧,就必須將b關(guān)聯(lián)到a的副本。
a = [1, 2, 3]
b = a.copy()
b[1] = 4
print(a)
# [1, 2, 3]
#??方法7: sort 于對列表就地排序税产。就地排序意味著對原來的列表進行修改怕轿,使其元素按順序排列,而不是返回排序后的列表的副本辟拷。
x = [4, 6, 2, 1, 7, 9]
x.sort()
print(x)
# [1, 2, 4, 6, 7, 9]
x = [4, 6, 2, 1, 7, 9]
y = x.sort() # Don't do this!
print(y) #鑒于sort修改x且不返回任何值撞羽,最終的結(jié)果是x是經(jīng)過排序的,而y包含None衫冻。
#None.
#為實現(xiàn)前述目標诀紊,正確的方式之一是先將y關(guān)聯(lián)到x的副本,再對y進行排序
x = [4, 6, 2, 1, 7, 9]
y = x.copy()
y.sort()
print(x)
#[4, 6, 2, 1, 7, 9]
print(y)
#[1, 2, 4, 6, 7, 9]
#??或者使用函數(shù)sorted隅俘。實際上邻奠,這個函數(shù)可用于任何序列,但總是返回一個列表为居。
x = [4, 6, 2, 1, 7, 9]
y = sorted(x)
print(x)
#[4, 6, 2, 1, 7, 9]
print(y)
#[1, 2, 4, 6, 7, 9]
#方法sort接受兩個可選參數(shù):key和reverse碌宴。
#這兩個參數(shù)通常是按名稱指定的,稱為關(guān)鍵字參數(shù)颜骤。
#參數(shù)key類似于參數(shù)cmp:你將其設(shè)置為一個用于排序的函數(shù)唧喉。然而不會直接使用這個函數(shù)來判斷一個元素是否比另一個元素小,而是使用它來為每個元素創(chuàng)建一個鍵,再根據(jù)這些鍵對元素進行排序八孝。因此董朝,要根據(jù)長度對元素進行排序,可將參數(shù)key設(shè)置為函數(shù)len干跛。
#對于另一個關(guān)鍵字參數(shù)reverse子姜,只需將其指定為一個真值(True或False),以指出是否要按相反的順序?qū)α斜磉M行排序楼入。
#函數(shù)sorted也接受參數(shù)key和reverse哥捕。在很多情況下,將參數(shù)key設(shè)置為一個自定義函數(shù)很有用嘉熊。
??3. 元組
元組是一種不可變的序列遥赚,在創(chuàng)建之后不能做任何的修改
元組語法很簡單,只要在括號中添加元素阐肤,并使用逗號分隔凫佛。
函數(shù)tuple的工作原理與list很像:它將一個序列作為參數(shù),并將其轉(zhuǎn)換為元組孕惜。如果參數(shù)已經(jīng)是元組愧薛,就原封不動地返回它。
元組可以用作映射中的鍵(以及集合的成員)衫画,而列表不行毫炉。
特點:
1.不可變
2.用()創(chuàng)建元組類型,數(shù)據(jù)項用逗號來分割
3.可以是任何的類型
4.當元組中只有一個元素時 削罩,要加上逗號瞄勾,不然解釋器會當作整型來處理
5.同樣可以支持切片操作
#tuple函數(shù)可以把序列轉(zhuǎn)為tuple。
a=tuple('1,2,3') #并不是創(chuàng)建了包含1,2和3的tuple鲸郊,而是單引號包含了1 2 3和兩個逗號這五個元素的字符串丰榴,a是把這個字符串轉(zhuǎn)為 tuple,所以有5個元素
print(len(a))
#5
print(a)
#('1', ',', '2', ',', '3')
for item in tupleA:
print(item,end=' ')
pass #pass是一個占位符秆撮,能夠保證程序的代碼結(jié)構(gòu)正確,程序運行時换况,關(guān)鍵字不會執(zhí)行任何 操作
print(tupleA[2:4])
print(tupleA[::-1]) #倒序
print(tupleA[::-2]) #倒序 每兩個數(shù)取一個
print(tupleA[-2:-1:]) #倒著取下標為-2到-1之間的數(shù)據(jù)
#元組不可修改职辨,但元組中包含的列表中的數(shù)據(jù)可以修改
tupleA=('abcd',89,9.13,'peter',[11,12,13])
print(tupleA)
tupleA[4][0]=345
print(tupleA)
#當元組中只有一個元素時 ,要加上逗號
tupleB=('1')
print(type(tupleB))
tupleB=('1',)
print(type(tupleB))
#數(shù)值轉(zhuǎn)成元組
tupleC=tuple(range(10))
print(tupleC)
print(tupleC.count(8)) #統(tǒng)計8出現(xiàn)了幾次
????4. 字典及常用方法
字典是python中重要的數(shù)據(jù)類型戈二,字典是由鍵值對組成的集合舒裤,通常使用鍵來訪問數(shù)據(jù),效率非常高觉吭,和list一樣支持對數(shù)據(jù)的添加腾供、修改、刪除。
函數(shù)dict可以從其他映射(如其他字典)或鍵值對創(chuàng)建字典伴鳖。
特點:
1.不是序列類型节值,沒有下標概念 ,是一個無序的鍵值集合榜聂,是內(nèi)置的高級數(shù)據(jù)類型
2.用{}來表示字典對象搞疗,每個鍵值對用逗號分隔
3.鍵必須是不可變的類型【元組、字符串等】值可以是任意的類型
4.每個鍵必定是唯一的须肆,如果存在重復(fù)的鍵匿乃,后者會覆蓋前者
#創(chuàng)建/更新字典 (以前不存在,就直接創(chuàng)建豌汇,已經(jīng)存在就在原有基礎(chǔ)追加)
dictA={}
print(type(dictA))
#方法1
dictA['name']='hui' #左邊[]中的是鍵幢炸,右邊{}中的是value
dictA['age']='24'
dictA['pos']='med'
print(dictA)
#方法2
dictB={'name':'me','school':'tjmu'}
print(dictB)
#方法3 #使用dict函數(shù)從其他映射或鍵值對創(chuàng)建字典
items = [('name', 'Gumby'), ('age', 42)]
d = dict(items)
print(d)
#{'age': 42, 'name': 'Gumby'}
d['name']
# 'Gumby'
#方法4
dictA.update({'school':'hnmu'})
#方法5 fromkeys創(chuàng)建一個新字典,其中包含指定的鍵拒贱,且每個鍵對應(yīng)的值都是None宛徊。
a={}.fromkeys(['name', 'age'])
print(a)
# {'age': None, 'name': None}
#查找元素
print(dictB['name']) #通過鍵獲取對應(yīng)的值
dictB['name']='lee' #更改鍵對應(yīng)的值
print(dictB)
#獲取所有的鍵
print(dictA.keys())
#獲取所有的值
print(dictA.values())
#獲取所有的項/鍵值對
print(dictA.items())
for key,value in dictA.items():
print('%s==%s'%(key,value))
#通過指定鍵來進行刪除
del dictA['name']
print(dictA)
dictA.pop('age')
print(dictA)
#對字典進行排序 ??
print(sorted(dictA.items(),key=lambda d:d[0]))
print(sorted(dictA.items(),key=lambda d:d[1]))
5. 共有操作
#合并
strA='人生苦短'
strB='我用python'
print(strA+strB)
listA=list(range(10))
listB=list(range(11,20))
print(listA+listB)
#復(fù)制
print(strA*3)
# 在位于屏幕中央且寬度合適的方框內(nèi)打印一個句子
sentense=input("請輸入Sentence:")
screen_width=80
text_width=len(sentense)
box_witdth=text_width+2
left_margin=(screen_width-box_witdth)//2
print()
print(' '*left_margin+'*'+'-'*(box_witdth-2)+'*')
print(' '*left_margin+'|'+' '*text_width+'|')
print(' '*left_margin+'|'+ sentense +'|')
print(' '*left_margin+'|'+' '*text_width+'|')
print(' '*left_margin+'*'+'-'*(box_witdth-2)+'*')
*------------------------*
| |
|carpe diem,seize the day|
| |
*------------------------*
#in 判斷對象是否存在,結(jié)果是一個bool值
print('生' in strA)
print('20' in listA)
dictA={'name':'Peter'}
print('name' in dictA)
>課后練習(xí)題(答案見正文示例)
- 在位于屏幕中央且寬度合適的方框內(nèi)打印一個句子
>思考
- 方法與函數(shù)的區(qū)別