一. 基礎數據類型補充內容
1.1 字符串
字符串我們以前已經講了一些很是重要的方法,剩下還有一些方法雖然不是那麼重要,可是也算是比較經常使用,在此給你們在補充一些,須要你們儘可能記住。python
複製代碼api
print(name.capitalize()) #首字母大寫
print(name.swapcase()) #大小寫翻轉
msg='taibai say hi'
print(msg.title()) #每一個單詞的首字母大寫網絡
ret2 = a1.center(20,"*")
print(ret2)併發
複製代碼
1.2 元組
python中元組有一個特性,元組中若是隻含有一個元素且沒有逗號,則該元組不是元組,與改元素數據類型一致,若是有逗號,那麼它是元組。app
複製代碼
tu = (1)
print(tu,type(tu)) # 1 <class 'int'>
tu1 = ('alex')
print(tu1,type(tu1)) # 'alex' <class 'str'>
tu2 = ([1, 2, 3])
print(tu2,type(tu2)) # [1, 2, 3] <class 'list'>編輯器
tu = (1,)
print(tu,type(tu)) # (1,) <class 'tuple'>
tu1 = ('alex',)
print(tu1,type(tu1)) # ('alex',) <class 'tuple'>
tu2 = ([1, 2, 3],)
print(tu2,type(tu2)) # ([1, 2, 3],) <class 'tuple'>
複製代碼
元組也有一些其餘的方法:學習
index:經過元素找索引(可切片),找到第一個元素就返回,找不到該元素即報錯。編碼
tu = ('太白', [1, 2, 3, ], 'WuSir', '女神')
print(tu.index('太白')) # 0
count: 獲取某元素在列表中出現的次數翻譯
tu = ('太白', '太白', 'WuSir', '吳超')
print(tu.count('太白')) # 2
1.3 列表
列表的其餘操做方法:3d
count(數)(方法統計某個元素在列表中出現的次數)。
1 a = ["q","w","q","r","t","y"]
2 print(a.count("q"))
index(方法用於從列表中找出某個值第一個匹配項的索引位置)
1 a = ["q","w","r","t","y"]
2 print(a.index("r"))
sort (方法用於在原位置對列表進行排序)。
reverse (方法將列表中的元素反向存放)。
1 a = [2,1,3,4,5]
2 a.sort()# 他沒有返回值,因此只能打印a
3 print(a)
4 a.reverse()#他也沒有返回值,因此只能打印a
5 print(a)
列表也能夠相加與整數相乘
l1 = [1, 2, 3]
l2 = [4, 5, 6]
print(l1*3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
循環列表,改變列表大小的問題
先不着急,說這個問題,先作一道小題:
有列表l1, l1 = [11, 22, 33, 44, 55],請把索引爲奇數對應的元素刪除(不能一個一個刪除,此l1只是舉個例子,裏面的元素不定)。
有人說這個還不簡單麼?我循環列表,而後進行判斷,只要他的索引爲奇數,我就刪除。OK,你能夠照着這個思路去作。
那麼根據題意,這個題最終的結果應該是:l1 = [11, 33, 55],可是你獲得的結果倒是: l1 = [11, 33, 44] 爲何不對呢???
用這個進行舉例:當你循環到22時,你將列表中的22刪除了,可是你帶來的影響是:33,44,55都會往前進一位,他們的索引由原來的2,3,4變成了1,2,3 因此你在往下進行循環時,就會發現,額........徹底不對了。
那這個怎麼解決呢?有三種解決方式:
想看? 門都沒有,課上聽吧。
你以爲我會寫答案麼?
哈哈,就不告訴你。
因此,咱們要總結一下:
在循環一個列表時的過程當中,若是你要改變列表的大小(增長值,或者刪除值),那麼結果極可能會出錯或者報錯。
1.4 dict
首先是字典的增刪改查有幾個方法須要給你們講解一下:
複製代碼
dic = {'name': '太白', 'age': 18}
ret = dic.popitem()
print(ret,dic) # ('age', 18) {'name': '太白'}
dic = {'name': '太白', 'age': 18}
dic.update(sex='男', height=175)
print(dic) # {'name': '太白', 'age': 18, 'sex': '男', 'height': 175}
dic = {'name': '太白', 'age': 18}
dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')])
print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
dic1 = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic1.update(dic2)
print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
print(dic2) # {'name': 'alex', 'weight': 75}
複製代碼
fromkeys:建立一個字典:字典的全部鍵來自一個可迭代對象,字典的值使用同一個值。
複製代碼
dic = dict.fromkeys([1, 2, 3], [])
dic[1].append(666)
print(id(dic[1]),id(dic[2]),id(dic[3])) # {1: [666], 2: [666], 3: [666]}
print(dic) # {1: [666], 2: [666], 3: [666]}
複製代碼
循環字典,改變字典大小的問題
來,先來研究一個小題,有以下字典:
dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18} 請將字典中全部鍵帶k元素的鍵值對刪除。那麼拿到這個題,有人說我一個一個刪除,這是不行的,由於這個字典只是舉個例子,裏面的元素不肯定,因此你要怎麼樣?你要遍歷全部的鍵,符合的刪除,對吧? 嗯,終於上套了,哦不,上道了,請開始你的表演。
複製代碼
dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18}
for i in dic:
if 'k' in i:
del dic[i]
print(dic)
你會發現,報錯了。。。。。
錯誤緣由:
RuntimeError: dictionary changed size during iteration
翻譯過來是:字典在循環迭代時,改變了大小。
複製代碼
這是什麼意思? 他的意思很簡單,你的字典在循環時,不要改變字典的大小,只要改變大小,就會報錯!那麼怎麼解決???
哈哈哈哈哈,天真。
因此說,他和列表差很少,只不過比列表更暴力一些,對其進行總結就是:
在循環一個字典的過程當中,不要改變字典的大小(增,刪字典的元素),這樣會直接報錯。
python基礎數據類型全部數據最全面詳細的方法彙總
二. 數據類型間的轉換問題
我們如今學過的數據類型有:int bool str list tuple dict set ,這些數據類型之間都存在着相互轉換的問題,有些轉換是很是重要的,那麼有些轉換則基本不用,那麼接下來咱們學習一下比較重要的數據的轉換問題。
int bool str 三者轉換
複製代碼
i = 100
print(bool(i)) # True # 非零即True
i1 = 0
print(bool(i1)) # False 零即False
t = True
print(int(t)) # 1 True --> 1
t = False
print(int(t)) # 0 False --> 0
i1 = 100
print(str(i1)) # '100'
s1 = '90'
print(int(s1)) # 90
s1 = '太白'
s2 = ''
print(bool(s1)) # True 非空即True
print(bool(s2)) # False
t1 = True
print(str(True)) # 'True'
複製代碼
str list 二者轉換
複製代碼
s1 = 'alex 太白 武大'
print(s1.split()) # ['alex', '太白', '武大']
l1 = ['alex', '太白', '武大']
print(' '.join(l1)) # 'alex 太白 武大'
複製代碼
list set 二者轉換
複製代碼
s1 = [1, 2, 3]
print(set(s1))
set1 = {1, 2, 3, 3,}
print(list(set1)) # [1, 2, 3]
複製代碼
str bytes 二者轉換
複製代碼
s1 = '太白'
print(s1.encode('utf-8')) # b'\xe5\xa4\xaa\xe7\x99\xbd'
b = b'\xe5\xa4\xaa\xe7\x99\xbd'
print(b.decode('utf-8')) # '太白'
複製代碼
全部數據均可以轉化成bool值
轉化成bool值爲False的數據類型有:
'', 0, (), {}, [], set(), None
剩下的一些數據類型也能夠互相轉化,在這裏我就不一一介紹了。
三.基礎數據類型的總結
按存儲空間的佔用分(從低到高)
數字
字符串
集合:無序,即無序存索引相關信息
元組:有序,須要存索引相關信息,不可變
列表:有序,須要存索引相關信息,可變,須要處理數據的增刪改
字典:有序,須要存key與value映射的相關信息,可變,須要處理數據的增刪改(3.6以後有序)
按存值個數區分
標量/原子類型 數字,字符串
容器類型 列表,元組,字典
按可變不可變區分
可變 列表,字典
不可變 數字,字符串,元組,布爾值
按訪問順序區分
直接訪問 數字
順序訪問(序列類型) 字符串,列表,元組
key值訪問(映射類型) 字典
四. 編碼的進階
前兩天我們已經講了編碼,我相信你們對編碼有必定的瞭解了,那麼,我們先回顧一下:
首先來講,編碼便是密碼本,編碼記錄的就是二進制與文字之間的對應關係,現存的編碼本有:
ASCII碼:包含英文字母,數字,特殊字符與01010101對應關係。
a 01000001 一個字符一個字節表示。
GBK:只包含本國文字(以及英文字母,數字,特殊字符)與0101010對應關係。
a 01000001 ascii碼中的字符:一個字符一個字節表示。
中 01001001 01000010 中文:一個字符兩個字節表示。
Unicode:包含全世界全部的文字與二進制0101001的對應關係。
a 01000001 01000010 01000011 00000001
b 01000001 01000010 01100011 00000001
中 01001001 01000010 01100011 00000001
UTF-8:包含全世界全部的文字與二進制0101001的對應關係(最少用8位一個字節表示一個字符)。
a 01000001 ascii碼中的字符:一個字符一個字節表示。
To 01000001 01000010 (歐洲文字:葡萄牙,西班牙等)一個字符兩個字節表示。
中 01001001 01000010 01100011 亞洲文字;一個字符三個字節表示。
簡單回顧完編碼以後,再給你們普及一些知識點:
1. 在計算機內存中,統一使用Unicode編碼,當須要將數據保存到硬盤或者須要網絡傳輸的時候,就轉換爲非Unicode編碼好比:UTF-8編碼。
其實這個不用深刻理解,他就是規定,舉個例子:用文件編輯器(word,wps,等)編輯文件的時候,從文件將你的數據(此時你的數據是非Unicode(多是UTF-8,也多是gbk,這個編碼取決於你的編輯器設置))字符被轉換爲Unicode字符讀到內存裏,進行相應的編輯,編輯完成後,保存的時候再把Unicode轉換爲非Unicode(UTF-8,GBK 等)保存到文件。
2. 不一樣編碼之間,不能直接互相識別。
好比你的一個數據:‘老鐵沒毛病’是以utf-8的編碼方式編碼併發送給一個朋友,那麼你發送的確定是經過utf-8的編碼轉化成的二進制01010101,那麼你的朋友接收到你發的這個數據,他若是想查看這個數據必須將01010101轉化成漢字,才能夠查看,那麼此時那也必須經過utf-8編碼反轉回去,若是要是經過gbk編碼反轉,那麼這個內容可能會出現亂碼或者報錯。
那麼瞭解完這兩點以後,我們開始進入編碼進階的最重要的內容。
前提條件:python3x版本(python2x版本與這個不一樣)。
主要用途:數據的存儲或者傳輸。
剛纔我們也說過了,在計算機內存中,統一使用Unicode編碼,當須要將數據保存到硬盤或者須要網絡傳輸的時候,就轉換爲非Unicode編碼好比:UTF-8編碼。
我們就以網絡傳輸爲例:
好那麼接下來我們繼續討論,首先先聲明一個知識點就是這裏所說的'數據',這個數據,其實準確的說是以字符串(特殊的字符串)類型的數據。那麼有同窗就會問到,python中的數據類型不少,int bool list dict str等等,若是我想將一個列表數據經過網絡傳輸給小明同窗,不行麼? 確切的說不行,你必須將這個列表轉化成一個特殊的字符串類型,而後才能夠傳輸出去,數據的存儲也是如此。
那麼你就清楚一些了,你想經過存儲或者網絡傳輸的數據是一個特殊的字符串類型,那麼我就直接將這個字符串傳出去不就好了麼?好比我這有一個數據:'今晚10點吃雞,大吉大利' 這不就是字符串類型麼?我直接將這個數據經過網絡發送給小明不就能夠了麼?不行。這裏你尚未看清一個問題,就是特殊的字符串。爲何?
那麼這個解決方式是什麼呢?
那麼這個bytes類型是個什麼類型呢?其實他也是Python基礎數據類型之一:bytes類型。
這個bytes類型與字符串類型,幾乎如出一轍,能夠看看bytes類型的源碼,bytes類型能夠用的操做方法與str相差無幾.
bytes類型的源碼
那麼str與bytes類型到底有什麼區別和聯繫呢,接下來我們以表格的形式給你作對比。
類名 str類型 bytes類型 標註
名稱 str,字符串,文本文字 bytes,字節文字 不一樣,能夠經過文本文字或者字節文字加以區分
組成單位 字符 字節 不一樣
組成形式 '' 或者 "" 或者 ''' ''' 或者 """ """ b'' 或者 b"" 或者 b''' ''' 或者 b""" """ 不一樣,bytes類型就是在引號前面+b(B)大小寫均可以
表現形式
英文: 'alex'
中文: '中國'
英文:b'alex'
中文:b'\xe4\xb8\xad\xe5\x9b\xbd'
字節文字對於ascii中的元素是能夠直接顯示的,
可是非ascii碼中的元素是以十六進制的形式表示的,不易看出。
編碼方式 Unicode 可指定編碼(除Unicode以外)好比UTF-8,GBK 等 不一樣
相應功能 upper lower spllit 等等 upper lower spllit 等等 幾乎相同
轉譯 可在最前面加r進行轉譯 可在最前面加r進行轉譯 相同
重要用途 python基礎數據類型,用於存儲少許的經常使用的數據
負責以二進制字節序列的形式記錄所需記錄的對象,
至於該對象到底表示什麼(好比究竟是什麼字符)
則由相應的編碼格式解碼所決定。
Python3中,bytes一般用於網絡數據傳輸、
二進制圖片和文件的保存等等
bytes就是用於數據存儲和網絡傳輸數據
更多 ...... ......
那麼上面寫了這麼多,我們不用所有記住,對於某些知識點了解一下便可,可是對於有些知識點是須要你們理解的:
bytes類型也稱做字節文本,他的主要用途就是網絡的數據傳輸,與數據存儲。那麼有些同窗確定問,bytes類型既然與str差很少,並且操做方法也很類似,就是在字符串前面加個b不就好了,python爲何還要這兩個數據類型呢?我只用bytes不行麼?
若是你只用bytes開發,不方便。由於對於非ascii碼裏面的文字來講,bytes只是顯示的是16進制。很不方便。
s1 = '中國'
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' # utf-8 的編碼
好,上面我們對於bytes類型應該有了一個大體的瞭解,對str 與 bytes的對比也是有了對比的瞭解,那麼我們最終要解決的問題,如今能夠解決了,那就是str與bytes類型的轉換的問題。
若是你的str數據想要存儲到文件或者傳輸出去,那麼直接是不能夠的,上面咱們已經圖示了,咱們要將str數據轉化成bytes數據就能夠了。
str ----> bytes
複製代碼
s1 = '中國'
b1 = s1.encode('utf-8') # 轉化成utf-8的bytes類型
print(s1) # 中國
print(b1) # b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = '中國'
b1 = s1.encode('gbk') # 轉化成gbk的bytes類型
print(s1) # 中國
print(b1) # b'\xd6\xd0\xb9\xfa'
複製代碼
bytes ---> str
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = b1.decode('utf-8')
print(s1) # 中國
那麼這裏還有一個最重要的,也是大家之後工做中常常遇到的讓人頭疼的問題,就是gbk編碼的數據,轉化成utf-8編碼的數據。有人說老師,我怎麼有點蒙呢?這是什麼? 來,捋一下,bytes類型他叫字節文本,他的編碼方式是非Unicode的編碼,非Unicode便可以是gbk,能夠是UTF-8,能夠是GB2312.....
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd' # 這是utf-8編碼bytes類型的中國
b2 = b'\xd6\xd0\xb9\xfa' # 這是gbk編碼bytes類型的中國
那麼gbk編碼的bytes如何轉化成utf-8編碼的bytes呢?
不一樣編碼之間,不能直接互相識別。
上面我說了,不一樣編碼之間是不能直接互相是別的,這裏說了不能直接,那就能夠間接,如何間接呢? 現存世上的全部的編碼都和誰有關係呢? 都和萬國碼Unicode有關係,因此須要藉助Unicode進行轉換。
看下面的圖就好了!