Lesson_5
【1】元組(牢籠中的的列表)
元組 tuple
我們這里說的元組不是那個赫赫有名的元組零食、元組蛋糕歧沪。
能力越大的人都有可能濫用權(quán)力歹撒,反而導(dǎo)致自身萬劫不復(fù)。
同樣诊胞,因為列表過于強大暖夭,python的作者發(fā)明了它的表親---元組。
元組和列表的最大區(qū)別就是,元組里面的數(shù)據(jù)是不可動的迈着。
訪問和創(chuàng)建一個元組
元組和列表竭望,除了不可變這個特征意外,那就是list用的中括號裕菠,tuple用的是小括號
tuple1 = ()
tuple2 = (1,) #只有一個元素的時候一定要在結(jié)尾加上一個逗號咬清,不加上逗號就是number
tuple3 = (1,2,3)
print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))
print('tuple3:',tuple3,type(tuple3))
#tuple1: () <class 'tuple'>
#tuple2: (1,) <class 'tuple'>
#tuple3: (1, 2, 3) <class 'tuple'>
另類定義:
tuple1 = 1, #number加上逗號就是tuple,不加就是數(shù)字
tuple2 = 1,2,3
print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))
#tuple1: (1,) <class 'tuple'>
#tuple2: (1, 2, 3) <class 'tuple'>
我們嘗試一下不帶逗號會怎么樣:
tuple1 = (1)
tuple2 = (1,)
print(tuple1 * 3)
print(tuple2 * 3)
#3
#(1, 1, 1)
訪問tuple的索引和list是一樣的:
tuple1 = ((1,2,3),4,(5,6,7),[1,2,3])
#二維的元組糕韧,可以嵌套多類型的數(shù)據(jù)
print(tuple1[0][0])
print(tuple1[1])
print(tuple1[3][2])
#1
#4
#3
tuple也是可以切片的:
tuple1 = 1,2,3,4,5,6,7,8,9
print(tuple1[:5]) #從0開始取列表中錢5個元素
print(tuple1[-1]) #查找最后一個元素
print(tuple1[::2]) #隔2個查一次
print(tuple1[::-1]) #返回翻轉(zhuǎn)的結(jié)果
#(1, 2, 3, 4, 5)
#9
#(1, 3, 5, 7, 9)
#(9, 8, 7, 6, 5, 4, 3, 2, 1)
tuple的元素是不可變的:
修改:
tuple1 = 1,2,3,4,5,6,7,8,9
tuple1[0] = 0
print(tuple1)
#TypeError: 'tuple' object does not support item assignment
刪除:
tuple1 = 1,2,3,4,5,6,7,8,9
del tuple1[-1]
print(tuple1)
#TypeError: 'tuple' object does not support item assignment
更新和刪除元組
修改
前面說過了枫振,元組的元素具有不可變性,那么有沒有其它辦法了萤彩?
我們可以通過合并的方式向元組的尾部或者頭部插入數(shù)據(jù)
tuple1 = '成龍','李連杰','李小龍'
name1 = '梁小龍',
name2 = '元彪','洪金寶'
tuple1 = tuple1 + name1 #通過拼接在重新賦值給 tuple1
tuple1 = name2 + tuple1
print(tuple1)
#('元彪', '洪金寶', '成龍', '李連杰', '李小龍', '梁小龍')
#注意:拼接只能是同類型之間拼接
得到結(jié)論粪滤,元組要修改就必須要重新賦值。
刪除元組
刪除元組的元素我們在上面的內(nèi)容已經(jīng)嘗試過了雀扶,是不可實現(xiàn)的杖小。
元組的刪除和修改差不多,要刪就全刪愚墓。
tuple1 = '成龍','李連杰','李小龍'
del tuple1
返回指定值得下標(biāo)
tuple1 = '成龍','李連杰','李小龍'
print(tuple1.index('成龍'))
#0
返回元組的個數(shù)
tuple1 = '成龍','李連杰','李小龍'
print(len(tuple1))
#3
返回元組中的最大值和最小值
tuple1 = 1,2,3,4,5,6,7
print(max(tuple1))
print(min(tuple1))
#7
#1
返回數(shù)組的和
tuple1 = 1,2,3,4,5,6,7
tuple1 = 1,2,3,4,5,6,7
print(sum(tuple1))
#28
將元組轉(zhuǎn)成列表
tuple1 = 1,2,3,4,5,6,7
print(list(tuple1))
#[1, 2, 3, 4, 5, 6, 7]
將其它類型轉(zhuǎn)成tuple
list1 = [1,2,3,4,5,6,7]
string = '123344'
print(tuple(list1))
print(tuple(string))
#(1, 2, 3, 4, 5, 6, 7)
#('1', '2', '3', '3', '4', '4')
#number 和 bool 類型的值是不可迭代的予权,所以不能轉(zhuǎn)換
元組的遍歷
tuple1 = [1,2,3,4,5,6,7]
for i in tuple1:
print(i)
【2】string補充
字符串我們在前面的內(nèi)容里面已經(jīng)學(xué)過不少了,想必大家消化的差不多了浪册,
我們今天再來一波新的用法扫腺。
splitlines([keepends]) 多行分割
默認(rèn)keepends = false的,表示不保留換行符
str40 = '''sunck is a good man!
sunck is a nice man!
sunck is handsome man!
'''
print(str40.splitlines(True))
#['sunck is a good man!\n', 'sunck is a nice man!\n', 'sunck is handsome man!\n']
max()村象、min()
max()笆环、min()可以判斷字符串大小值
str1 = "abcdefg!"
print(max(str1))
print(min(str1))
#g
#!
<image src='images/timg.jpeg'/>
創(chuàng)建字符映射的轉(zhuǎn)換表
str.maketrans(intab, outtab) 方法用于創(chuàng)建字符映射的轉(zhuǎn)換表,對于接受兩個參數(shù)的最簡單的調(diào)用方式厚者,第一個參數(shù)是字符串躁劣,表示需要轉(zhuǎn)換的字符,第二個參數(shù)也是字符串表示轉(zhuǎn)換的目標(biāo)库菲。
str1 = str.maketrans("ac", "65")
print(str1)
#{97: 54, 99: 53}
過濾字符映射
translate() 方法根據(jù)參數(shù)table給出的表(包含 256 個字符)轉(zhuǎn)換字符串的字符,要過濾掉的字符放到 deletechars 參數(shù)中账忘。
str.translate(table, deletechars)
table -- 翻譯表,翻譯表是通過 maketrans() 方法轉(zhuǎn)換而來熙宇。
deletechars -- 字符串中要過濾的字符列表鳖擒。
例如:
intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab) # 制作翻譯表
str = "this is string example....wow!!!"
print(str.translate(trantab))
#th3s 3s str3ng 2x1mpl2....w4w!!!
編碼
encode() 方法以 encoding 指定的編碼格式編碼字符串。errors參數(shù)可以指定不同的錯誤處理方案奇颠。
encoding -- 要使用的編碼败去,如"UTF-8"。
errors -- 設(shè)置不同錯誤的處理方案烈拒。默認(rèn)為 'strict',意為編碼錯誤引起一個UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通過 codecs.register_error() 注冊的任何值。
看個例子:
str1 = "這是一個字符串"
#ignore忽略錯誤
data2 = str1.encode("utf-8", "ignore")
print(data2)
print(type(data2))
#解碼 注意:要與編碼時的編碼格式一致
str3 = data2.decode("gbk", "ignore")
print(str3)
#b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
#<class 'bytes'>
#榪欐槸涓涓瀛楃︿覆
字符判斷
isalpha()
如果字符串中至少有一個字符且所有的字符都是字母返回True,否則返回False
str1 = "abcde"
print(str1.isalpha())
>>>True
isalnum()
如果字符串中至少有一個字符且所有的字符都是字母或數(shù)字返回True,否則返回False
str1 = "1a2b3"
print(str1.isalnum())
>>>True
isspace()
如果字符中只包含空格則返回True,否則返回False
print(" ".isspace())
print(" ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())
【3】字典(dict)
我們在翻開《新華字典》的時候想查一個字的時候荆几,比如“萬“吓妆,我們不會從‘a(chǎn)’到‘z’開始逐個查找,而是直接從‘w’開始吨铸,接著找wan這個發(fā)音行拢,最終找個”萬“字。
python中的字典類型會把‘wan’看著是 鍵(key),”萬“字看著是值(value)诞吱,另外python中的 dict在有些地方稱為哈希(hash)舟奠,有些地方稱為 關(guān)系數(shù)組,也和javascript 的輕量數(shù)據(jù)交換格式(json)是一樣的房维。
用鍵-值(key-value)存儲沼瘫,具有極快的查找速度
<font color='red'>注意:字典是映射關(guān)系,字典不能被切片</font>
key的特性:
1、字典中的key必須唯一
2咙俩、key必須是不可變對象
3耿戚、字符串、整數(shù)等都是不可變的阿趁,可以作為key
4膜蛔、list是可變的,不能作為key
字典是Python語言中唯一的映射類型脖阵。
映射類型對象里哈希值(鍵皂股,key)和指向的對象(值,value)是一對多的的關(guān)系命黔,通常被認(rèn)為是可變的哈希表呜呐。
字典對象是可變的,它是一個容器類型纷铣,能存儲任意個數(shù)的Python對象卵史,其中也可包括其他容器類型。
字典類型與序列類型的區(qū)別:
1.存取和訪問數(shù)據(jù)的方式不同搜立。
2.序列類型只用數(shù)字類型的鍵(從序列的開始按數(shù)值順序索引)以躯;
3.映射類型可以用其他對象類型作鍵(如:數(shù)字、字符串啄踊、元組忧设,一般用字符串作鍵),和序列類型的鍵不同颠通,映射類型的鍵直接或間接地和存儲數(shù)據(jù)值相關(guān)聯(lián)址晕。
4.映射類型中的數(shù)據(jù)是無序排列的。這和序列類型是不一樣的顿锰,序列類型是以數(shù)值序排列的谨垃。
5.映射類型用鍵直接“映射”到值启搂。
字典是Python中最強大的數(shù)據(jù)類型之一。
創(chuàng)建和訪問dict
創(chuàng)建dict
字典在創(chuàng)建的時候必須是{'key':'value'}
dict1 = {}
dict2 = {'name':'tom','sex':'male','age':25}
dict3 = dict()
print(dict1,type(dict1))
print(dict2,type(dict2))
print(dict3,type(dict3))
#{} <class 'dict'>
#{'name': 'tom', 'sex': 'male', 'age': 25} <class 'dict'>
#{} <class 'dict'>
訪問dict
訪問dict必須要指定它的key
dict1 = {'name':'tom','sex':'male','age':25}
print(dict1['name'])
#tom
添加一個新的值
dict1 = {'name':'tom','sex':'male','age':25}
dict1['height'] = '175cm'
print(dict1)
#{'name': 'tom', 'sex': 'male', 'age': 25, 'height': '175cm'}
修改指定的值
dict1 = {'name':'tom','sex':'male','age':25}
dict1['age'] = '30'
print(dict1)
#{'name': 'tom', 'sex': 'male', 'age': '30'}
刪除指定的值
dict1 = {'name':'tom','sex':'male','age':25}
dict2 = dict1.copy()
dict3 = dict1.copy()
del dict1['age'] #直接刪除
print(dict2.pop('sex')) #彈出一個指定的鍵刘陶,并返回被彈出的值
print(dict3.popitem()) #彈出最后一項胳赌,并返回被彈出的值
print(dict1)
print(dict2)
print(dict3)
#male
#('age', 25)
#{'name': 'tom', 'sex': 'male'}
#{'name': 'tom', 'age': 25}
#{'name': 'tom', 'sex': 'male'}
深度拷貝dict
dict1 = {'name':'tom','sex':'male','age':25}
dict2 = dict1.copy()
dict3 = dict1
dict1.pop('age')
print(id(dict1),dict1)
print(id(dict2),dict2)
print(id(dict3),dict3)
#4303185888 {'name': 'tom', 'sex': 'male'}
#4303185960 {'name': 'tom', 'sex': 'male', 'age': 25}
#4303185888 {'name': 'tom', 'sex': 'male'}
清除dict
dict.clear()
不管是list還是dict,清除都建議使用clear(),為什么了匙隔?舉個例子
dict1 = {'name':'tom','sex':'male','age':25}
dict2 = dict1
dict1 = {}
print(id(dict1),id(dict2))
print(dict1,dict2)
#4301088808 4301088736
#{} {'name': 'tom', 'sex': 'male', 'age': 25}
上面的例子中 dict1 = {} 并沒有把內(nèi)存中的值給去除疑苫, 而是從新定義了一個 空dict,把指針指向了另一個地址.
dict2是淺拷貝dict1的纷责,那么原來的值還在內(nèi)存中捍掺。這樣做的弊端就是浪費內(nèi)存的使用空間。
使用clear()試一下
dict1 = {'name':'tom','sex':'male','age':25}
dict2 = dict1
print(id(dict1),id(dict2)) #這是清理之前的內(nèi)存地址
dict1.clear()
print(id(dict1),id(dict2))
print(dict1,dict2)
#4301088736 4301088736
##4301088736 4301088736
{} {}
使用clear()以后兩個被一起清理了再膳,而且是在原內(nèi)存空間上做清理的挺勿。
所以不論是list、dict都建議使用.clear()
修改dict
dict1 = {'name':'tom','sex':'male','age':25}
dict1['age'] = 26
dict1.update(sex = 'female')
dict1['cname'] = '湯姆' #指定key可以修改也可以添加
dict1.update(height = '170') #height并不存在
print(dict1)
#{'name': 'tom', 'sex': 'female', 'age': 26, 'cname': '湯姆', 'height': '170'}
上面的例子我們能看出來.update()和指定key的效果是一樣的饵史,如果指定的 鍵值對 已經(jīng)存在 則修改满钟,不存在 則添加
<font color='red'>注意:update(key = ‘value’)中key是不帶引號的,而value是帶引號的胳喷,除非它是整數(shù)</font>
寬松訪問
get()方法提供了更加合適的訪問方式湃番。
dict1 = {'name':'tom','sex':'male','age':25}
print(dict1.get('age'))
print(dict1.get('height'))
print(dict1.get('height','not find'))
#25 找到對應(yīng)的key則返回value
#None 沒有找到key返回None
#not find 如果設(shè)置第二個參數(shù),找到key返回對應(yīng)的value吭露,沒有找到返回設(shè)定的默認(rèn)值
相同的吠撮,可以用 in 和 not in 判斷是否在dict里面,但是只能用key作為查找條件
dict1 = {'name':'tom','sex':'male','age':25}
print('name' in dict1)
#True
其它方式創(chuàng)建dict
fromkeys()用于創(chuàng)建一個新的字典讲竿,它有兩個參數(shù)泥兰,第一個參數(shù)是字典的 鍵 ,第二個參數(shù)是可選的题禀,是傳入鍵的對應(yīng)值鞋诗,第二個參數(shù)不寫的話,值默認(rèn)是None迈嘹。
<font color='red'>注意:第一個參數(shù)必須是可迭代的序列削彬,在我們python中可迭代的序列中有三種,str秀仲,list融痛,tuple。而且它是返回一個新的字典神僵,并不會改變原來的值</font>
dict1 = {}
print(dict1.fromkeys('12','str'))
print(dict1.fromkeys([2,3],(1,2,3)))
print(dict1.fromkeys((5,6)))
#{'1': 'str', '2': 'str'}
#{2: (1, 2, 3), 3: (1, 2, 3)}
#{5: None, 6: None}
上面的例子告訴我們做事不能想當(dāng)然雁刷,在第二個print()中并不會將(1,2,3)拆開霎匈,而是將他們當(dāng)著一個值泡一。
keys(),values(),items()
訪問字典的方法還有keys(),values(),items()
keys()是返回字典中的所有鍵诵竭,values()是返回字典中的值到旦,那么items()就是返回字典中的鍵值對亮曹。items()返回的是一個list严沥,每個元素都是tuple焕盟。
dict1 = {'name':'tom','sex':'male','age':25}
print(dict1.keys())
print(dict1.values())
print(dict1.items())
#dict_keys(['name', 'sex', 'age'])
#dict_values(['tom', 'male', 25])
#dict_items([('name', 'tom'), ('sex', 'male'), ('age', 25)])
課堂小作業(yè):
list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]
我們將list轉(zhuǎn)換成dict夜畴,不使用dict()铝阐。
list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]
dict1 = {}
for each in list1:
dict1[each[0]] = each[1]
print(dict1)
#{'name': 'tom', 'sex': 'male', 'age': 25}