Python入門(mén)課程系列:
序列(sequence):序列是python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列是一組按照順序排列的值,其中的元素帶編號(hào)(編號(hào)從0開(kāi)始)
在python中,存在三種內(nèi)置的序列類(lèi)型 ,即:字符串、列表和元組。其中列表是可變的(你可修改其內(nèi)容),而元組和字符串是不可變的(一旦創(chuàng)建,內(nèi)容就是固定的)。
字典不屬于序列,沒(méi)有下標(biāo),不能取切片
優(yōu)點(diǎn):可以支持索引和切片的操作
特征:第一個(gè)正索引為0,指向是從左往右。當(dāng)使用負(fù)數(shù)索引時(shí),Python將從右(即從最后一個(gè)元素)開(kāi)始往左數(shù),因此-1是最后一個(gè)元素的位置。
??1. 字符串及常用方法
所有標(biāo)準(zhǔn)序列操作(索引、切片、乘法、成員資格檢查、長(zhǎng)度、最小值和最大值)都適用于字符串,但字符串是不可變的,因此所有的元素賦值和切片賦值都是非法的。
- 將值轉(zhuǎn)換為字符串并設(shè)置其格式是一個(gè)重要的操作,主要的解決方案是使用字符串格式設(shè)置運(yùn)算符——百分號(hào)。在%左邊指定一個(gè)字符串(格式字符串),并在右邊指定要設(shè)置其格式的值。指定要設(shè)置其格式的值時(shí),可使用單個(gè)值(如字符串或數(shù)字),可使用元組(如果要設(shè)置多個(gè)值的格式),還可使用字典,其中最常見(jiàn)的是元組。
- %s稱(chēng)為轉(zhuǎn)換說(shuō)明符,指出了要將值插入什么地方。s意味著將值視為字符串進(jìn)行格式設(shè)置。如果指定的值不是字符串,將使用str將其轉(zhuǎn)換為字符串。其他說(shuō)明符將導(dǎo)致其他形式的轉(zhuǎn)換。例如,%.3f將值的格式設(shè)置為包含3位小數(shù)的浮點(diǎn)數(shù)。
難點(diǎn)
1.字符串常用方法
2.切片操作
?? 切片:可以根據(jù)下標(biāo)來(lái)獲取序列對(duì)象的任意部分?jǐn)?shù)據(jù),語(yǔ)法結(jié)構(gòu)[start:end:step],step默認(rèn)為1。
??切片是左包含右不包含
3.與其他類(lèi)型綜合操作


Test="python"
print('Test的內(nèi)存地址%d'%id(Test)) #id函數(shù)可以查看一個(gè)對(duì)象的內(nèi)存地址
Test1=Test #這里只是把Test對(duì)象的地址賦給了Test1,Test和Test1的ip地址是一樣的
print(type(Test))
print('獲取第一個(gè)字符%s'%Test[0])
#取切片操作
strMsg='hello world'
#slice[start:end:step] #左閉右開(kāi) 范圍:start<=value<end
print(strMsg) #輸出完整的數(shù)據(jù)
print(strMsg[0]) #輸出第一個(gè)數(shù)據(jù)
print(strMsg[2:5]) #取第三個(gè)到第五個(gè)數(shù)據(jù)之間數(shù)據(jù)
print(strMsg[2:]) #從第三個(gè)值取到最后
print(strMsg[:3]) #從第一個(gè)值取到第三個(gè)
print(strMsg[::-1]) #倒序輸出負(fù)號(hào)表示方向是從右往左
#常用函數(shù)操作
#1. 首字母大寫(xiě)
name='peter'
print('姓名首字母轉(zhuǎn)換大寫(xiě)%s'%name.capitalize())
#2. 刪除空格
a=' hello '
b=a.strip() #strip是刪除空格,lstrip是刪除左邊空格,rstrip是刪除右邊空格
print(b)
#3. 查找某個(gè)字符是否在某個(gè)字符串內(nèi)
dataStr='I love python'
print(dataStr.find('p')) #查找目標(biāo)對(duì)象在序列對(duì)象中的位置,返回第一個(gè)下標(biāo)值,沒(méi)找到返回-1,并非返回布爾值
print(dataStr.index('l')) #檢測(cè)字符串中是否包含子字符串,返回第一個(gè)下標(biāo)值,沒(méi)找到會(huì)報(bào)錯(cuò)
#4. 判斷字符串的開(kāi)頭和結(jié)尾
dataStr='I love python'
print(dataStr.startswith('I'))
print(dataStr.endswith('I'))
#5. 大小寫(xiě)轉(zhuǎn)換
print(dataStr.upper())
print(dataStr.lower())
#6. join 其作用與split相反,用于合并序列的元素。
#所合并序列的元素必須都是字符串。
seq = [1, 2, 3, 4, 5]
sep = '+'
sep.join(seq) # 嘗試合并一個(gè)數(shù)字列表會(huì)報(bào)錯(cuò)
#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)) # 合并一個(gè)字符串列表
# '1+2+3+4+5'
????2. 列表及常用方法
list:python中非常重要的數(shù)據(jù)結(jié)構(gòu),是一種有序的數(shù)據(jù)集合
內(nèi)置函數(shù)list可以將字符串轉(zhuǎn)化成列表
特點(diǎn):
1.支持增、刪、改、查
2.列表中的數(shù)據(jù)是可以變化的【數(shù)據(jù)項(xiàng)可以變化,內(nèi)存地址不會(huì)改變】
3.用[]來(lái)表示列表類(lèi)型,數(shù)據(jù)項(xiàng)之間用逗號(hào)來(lái)分割 ,注意:數(shù)據(jù)項(xiàng)可以是任意類(lèi)型的數(shù)據(jù)
4.支持索引和切片來(lái)進(jìn)行操作
列表與元組的主要不同在于:列表可以修改,元組不可以。這意味著列表適用于需要中途添加元素的情形,而元組適用于處于某種考慮禁止修改序列的情形。


li=[1,2,3,'你好'] #使用[]創(chuàng)建列表
print(len(li)) #len函數(shù)可以獲取列表對(duì)象中的數(shù)據(jù)個(gè)數(shù)/也可查看字符串中的字符數(shù)
#鑒于不能像修改列表那樣修改字符串,因此在有些情況下使用字符串來(lái)創(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]) #輸出第一個(gè)元素
print(listA[1:3]) #獲取第2-3個(gè)元素
print(listA[2:]) #獲取3到最后一個(gè)元素
print(listA[::-1]) #倒序輸出
print(listA*2) #輸出兩遍【復(fù)制】
#修改
listA[0]='Peter'
print(listA)
listA[0]=1
print(listA)
#方法1: append 追加操作
listA.append(['fff','ddd',333]) #在列表里面插入列表,插入的列表算一個(gè)元素,只是這個(gè)元素又包含了三個(gè)元素
print(listA)
print(len(listA))
#方法2: insert 插入操作,需要指定位置
listA.insert(1,'新插入') #插入在第二個(gè)位置
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。這個(gè)函數(shù)不返回列表,而是返回一個(gè)迭代器,可使用list將返回的對(duì)象轉(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] #刪除第一個(gè)數(shù)據(jù)
print(listB)
del listB[1:3] #通過(guò)切片刪除多個(gè)數(shù)據(jù)(第二項(xiàng)到第三項(xiàng))
listB.remove(20) #移除指定元素,括號(hào)內(nèi)的是需要移除的指定項(xiàng)
listB.pop(1) #移除指定元素,如果不指定,則移除第一個(gè)數(shù)據(jù)。pop后面的參數(shù)是需要移除的指定項(xiàng)的索引值
#??pop是唯一既修改列表又返回一個(gè)非None值的列表方法。
#??方法6: copy 復(fù)制列表
#常規(guī)復(fù)制只是將另一個(gè)名稱(chēng)關(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 于對(duì)列表就地排序。就地排序意味著對(duì)原來(lái)的列表進(jìn)行修改,使其元素按順序排列,而不是返回排序后的列表的副本。
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)過(guò)排序的,而y包含None。
#None.
#為實(shí)現(xiàn)前述目標(biāo),正確的方式之一是先將y關(guān)聯(lián)到x的副本,再對(duì)y進(jìn)行排序
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í)際上,這個(gè)函數(shù)可用于任何序列,但總是返回一個(gè)列表。
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接受兩個(gè)可選參數(shù):key和reverse。
#這兩個(gè)參數(shù)通常是按名稱(chēng)指定的,稱(chēng)為關(guān)鍵字參數(shù)。
#參數(shù)key類(lèi)似于參數(shù)cmp:你將其設(shè)置為一個(gè)用于排序的函數(shù)。然而不會(huì)直接使用這個(gè)函數(shù)來(lái)判斷一個(gè)元素是否比另一個(gè)元素小,而是使用它來(lái)為每個(gè)元素創(chuàng)建一個(gè)鍵,再根據(jù)這些鍵對(duì)元素進(jìn)行排序。因此,要根據(jù)長(zhǎng)度對(duì)元素進(jìn)行排序,可將參數(shù)key設(shè)置為函數(shù)len。
#對(duì)于另一個(gè)關(guān)鍵字參數(shù)reverse,只需將其指定為一個(gè)真值(True或False),以指出是否要按相反的順序?qū)α斜磉M(jìn)行排序。
#函數(shù)sorted也接受參數(shù)key和reverse。在很多情況下,將參數(shù)key設(shè)置為一個(gè)自定義函數(shù)很有用。
??3. 元組
元組是一種不可變的序列,在創(chuàng)建之后不能做任何的修改
元組語(yǔ)法很簡(jiǎn)單,只要在括號(hào)中添加元素,并使用逗號(hào)分隔。
函數(shù)tuple的工作原理與list很像:它將一個(gè)序列作為參數(shù),并將其轉(zhuǎn)換為元組。如果參數(shù)已經(jīng)是元組,就原封不動(dòng)地返回它。
元組可以用作映射中的鍵(以及集合的成員),而列表不行。
特點(diǎn):
1.不可變
2.用()創(chuàng)建元組類(lèi)型,數(shù)據(jù)項(xiàng)用逗號(hào)來(lái)分割
3.可以是任何的類(lèi)型
4.當(dāng)元組中只有一個(gè)元素時(shí) ,要加上逗號(hào),不然解釋器會(huì)當(dāng)作整型來(lái)處理
5.同樣可以支持切片操作

#tuple函數(shù)可以把序列轉(zhuǎn)為tuple。
a=tuple('1,2,3') #并不是創(chuàng)建了包含1,2和3的tuple,而是單引號(hào)包含了1 2 3和兩個(gè)逗號(hào)這五個(gè)元素的字符串,a是把這個(gè)字符串轉(zhuǎn)為 tuple,所以有5個(gè)元素
print(len(a))
#5
print(a)
#('1', ',', '2', ',', '3')
for item in tupleA:
print(item,end=' ')
pass #pass是一個(gè)占位符,能夠保證程序的代碼結(jié)構(gòu)正確,程序運(yùn)行時(shí),關(guān)鍵字不會(huì)執(zhí)行任何 操作
print(tupleA[2:4])
print(tupleA[::-1]) #倒序
print(tupleA[::-2]) #倒序 每?jī)蓚€(gè)數(shù)取一個(gè)
print(tupleA[-2:-1:]) #倒著取下標(biāo)為-2到-1之間的數(shù)據(jù)
#元組不可修改,但元組中包含的列表中的數(shù)據(jù)可以修改
tupleA=('abcd',89,9.13,'peter',[11,12,13])
print(tupleA)
tupleA[4][0]=345
print(tupleA)
#當(dāng)元組中只有一個(gè)元素時(shí) ,要加上逗號(hào)
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)計(jì)8出現(xiàn)了幾次
????4. 字典及常用方法
字典是python中重要的數(shù)據(jù)類(lèi)型,字典是由鍵值對(duì)組成的集合,通常使用鍵來(lái)訪問(wèn)數(shù)據(jù),效率非常高,和list一樣支持對(duì)數(shù)據(jù)的添加、修改、刪除。
函數(shù)dict可以從其他映射(如其他字典)或鍵值對(duì)創(chuàng)建字典。
特點(diǎn):
1.不是序列類(lèi)型,沒(méi)有下標(biāo)概念 ,是一個(gè)無(wú)序的鍵值集合,是內(nèi)置的高級(jí)數(shù)據(jù)類(lèi)型
2.用{}來(lái)表示字典對(duì)象,每個(gè)鍵值對(duì)用逗號(hào)分隔
3.鍵必須是不可變的類(lèi)型【元組、字符串等】值可以是任意的類(lèi)型
4.每個(gè)鍵必定是唯一的,如果存在重復(fù)的鍵,后者會(huì)覆蓋前者


#創(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ù)從其他映射或鍵值對(duì)創(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)建一個(gè)新字典,其中包含指定的鍵,且每個(gè)鍵對(duì)應(yīng)的值都是None。
a={}.fromkeys(['name', 'age'])
print(a)
# {'age': None, 'name': None}
#查找元素
print(dictB['name']) #通過(guò)鍵獲取對(duì)應(yīng)的值
dictB['name']='lee' #更改鍵對(duì)應(yīng)的值
print(dictB)
#獲取所有的鍵
print(dictA.keys())
#獲取所有的值
print(dictA.values())
#獲取所有的項(xiàng)/鍵值對(duì)
print(dictA.items())
for key,value in dictA.items():
print('%s==%s'%(key,value))
#通過(guò)指定鍵來(lái)進(jìn)行刪除
del dictA['name']
print(dictA)
dictA.pop('age')
print(dictA)
#對(duì)字典進(jìn)行排序 ??
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)打印一個(gè)句子
sentense=input("請(qǐng)輸入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 判斷對(duì)象是否存在,結(jié)果是一個(gè)bool值
print('生' in strA)
print('20' in listA)
dictA={'name':'Peter'}
print('name' in dictA)

>課后練習(xí)題(答案見(jiàn)正文示例)
- 在位于屏幕中央且寬度合適的方框內(nèi)打印一個(gè)句子
>思考
- 方法與函數(shù)的區(qū)別