python 學習筆記
目錄- python 學習筆記
- 變數、運算子與資料型別
- 容器序列型別
- 串列
- 元組
- 字串
- 字典
- 集合
- 序列
變數、運算子與資料型別
點擊標題進行跳轉
容器序列型別
串列
串列是有序集合,無定長,能存盤任意數量和型別的資料,語法為:[元素1, 元素2, ..., 元素n]
-
創建串列
-
使用range()創建
-
使用推導式創建
由于串列中的元素可以任何物件,因此串列中保存的是物件的指標,使用推導式創建串列時,只是創建看
i個指向串列的參考, -
創建混合串列
串列的元素可以是任何物件
-
-
更新串列
-
list.append(obj)在串列末尾添加新的物件,只接受一個引數,引數可以是任何資料型別,被追加的元素在 list 中保持著原結構型別,x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] x.append(['Thursday']) print(x) # ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday']] print(len(x)) # 6 -
list.extend(seq)在串列末尾一次性追加另一個序列中的多個值(用新串列擴展原來的串列x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] x.append(['Thursday', 'Sunday']) print(x) # ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday', 'Sunday']] print(len(x)) # 6 -
list.insert(index, obj)在編號index位置插入obj, -
list.remove(obj)移除串列中某個值的第一個匹配項 -
list.pop([index=-1])移除串列中的一個元素(默認最后一個元素),并且回傳該元素的值 -
del [var1, var2 ……]洗掉單個或多個物件, -
獲取元素
- 索引
- 切片,切片的通用寫法是
start : stop : step
-
復制、淺拷貝與深拷貝
list1 = [123, 456, 789, 213] # 復制: 只是復制了新物件的參考,不會開辟新的記憶體空間, list2 = list1 # 淺拷貝: 創建新物件,其內容是原物件的參考,但是對于多層嵌套的可變物件(內層物件)隨著原序列的變化而變化,內層物件并不會改變,以下三種淺拷貝操作 # list3 = list1[:] # 切片 # list3 = list(list1)# 工廠函式 import copy list3 = copy.copy(list1)# copy()函式 # 深拷貝:和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層嵌套的元素,深拷貝出來的物件是一個全新的物件,不再與原來的物件有任何關聯, list4 = copy.deepcopy(list1) # 非可變物件 print(list1) # [123, 456, 789, 213] print(list2) # [123, 456, 789, 213] print(list3) # [123, 456, 789, 213] list1.sort() print(list2) # [123, 213, 456, 789] print(list3) # [123, 456, 789, 213] print(id(list1)) # 140442132250784 print(id(list2)) # 140442132250784 print(id(list3)) # 140442129839520 print('######************######') # 可變物件 listPlus1 = [[123, 456], [789, 213]] listPlus2 = listPlus1 listPlus3 = listPlus1[:] listPlus4 = copy.deepcopy(listPlus1) print(listPlus1) # [[123, 456], [789, 213]] print(listPlus2) # [[123, 456], [789, 213]] print(listPlus3) # [[123, 456], [789, 213]] print(listPlus4) # [[123, 456], [789, 213]] print(id(listPlus1)) # 140442130839584 print(id(listPlus2)) # 140442130839584 print(id(listPlus3)) # 140442132935696 print(id(listPlus4)) # 140442130944240 listPlus1[0][0] = 111 listPlus1.append([1, 2]) print(listPlus2) # [[111, 456], [789, 213], [1, 2]] print(listPlus3) # [[111, 456], [789, 213]] print(listPlus4) # [[123, 456], [789, 213]] -
常用運算子
- 等號運算子:
==,串列中元素相同時為True - 連接運算子
+,兩個串列相加拼接,記憶體增加,創建一個新的串列 - 重復運算子
*,數乘串列復制拼接,記憶體增加,創建一個新的串列 - 成員關系運算子
in、not in
- 等號運算子:
-
其他操作
list.count(obj)統計某個元素在串列中出現的次數list.index(x[, start[, end]])從串列中找出某個值第一個匹配項的索引位置list.reverse()反向串列中元素list.sort(key=None, reverse=False)對原串列進行排序,False默認升序,
-
元組
「元組」定義語法為:(元素1, 元素2, ..., 元素n)
-
創建元組
- Python 的元組與串列類似,不同之處在于tuple被創建后就不能對其進行修改,類似字串,
- 元組使用小括號,串列使用方括號,
- 元組與串列類似,也用整數來對它進行索引 (indexing) 和切片 (slicing),
- 元組中只包含一個元素時,需要在元素后面添加逗號,否則括號會被當作運算子使用,
-
更新元組
-
元組有不可更改的性質,因此不能直接給元組中的元素賦值,但是如果元組中元素是可更改的,那么就可以更改元組中元素的值,
t1 = (1, 2, 3, [4, 5, 6]) print(t1) # (1, 2, 3, [4, 5, 6]) t1[3][0] = 9 print(t1) # (1, 2, 3, [9, 5, 6]) -
常用運算子
可參考串列
-
內置方法
- count:
count(x)是記錄x在元組t中該元素出現幾次 - index:
index(x)是找到元素x在元組t的索引
- count:
-
解壓元組
-
解壓(unpack)一維元組(有幾個元組,定義幾個變數)
t = (1, 10.31, 'python') (a, b, c) = t print(a, b, c) # 1 10.31 python -
解壓二維元組(按照元組里的元組結構定義變數)
t = (1, 10.31, ('OK', 'python')) (a, b, (c, d)) = t print(a, b, c, d) # 1 10.31 OK python如果你只想要元組其中幾個元素,用通配符「 * 」,英文叫 wildcard,在計算機語言中代表一個或多個元素,例如把多個元素丟給了
rest變數,如果你根本不在乎 rest 變數,那么就用通配符「 * 」加上下劃線「 _ 」,
-
-
字串
python中引號之間的字符集合,pyhton中單引號與雙引號并無區別,
-
常用轉義字符
\\反斜杠符號 \'單引號 \"雙引號 \n換行 \t橫向制表符(TAB) \r回車 -
切片和拼接
- 類似于元組具有不可修改性
- 從 0 開始 (和 Java 一樣)
- 切片通常寫成
start:end這種形式,包括「start索引」對應的元素,不包括「end索引」對應的元素, - 索引值可正可負,正索引從 0 開始,從左往右;負索引從 -1 開始,從右往左,使用負數索引時,會從最后一個元素開始計數,最后一個元素的位置編號是 -1,
-
常用內置方法
-
capitalize()將字串的第一個字符轉換為大寫, -
lower()轉換字串中所有大寫字符為小寫, -
upper()轉換字串中的小寫字母為大寫, -
swapcase()將字串中大寫轉換為小寫,小寫轉換為大寫, -
count(str, beg= 0,end=len(string))回傳str在 string 里面出現的次數,如果beg或者end指定則回傳指定范圍內str出現的次數, -
endswith(suffix, beg=0, end=len(string))檢查字串是否以指定子字串suffix結束,如果是,回傳 True,否則回傳 False,如果beg和end指定值,則在指定范圍內檢查, -
startswith(substr, beg=0,end=len(string))檢查字串是否以指定子字串substr開頭,如果是,回傳 True,否則回傳 False,如果beg和end指定值,則在指定范圍內檢查, -
find(str, beg=0, end=len(string))檢測str是否包含在字串中,如果指定范圍beg和end,則檢查是否包含在指定范圍內,如果包含,回傳開始的索引值,否則回傳 -1, -
rfind(str, beg=0,end=len(string))類似于find()函式,不過是從右邊開始查找, -
isnumeric()如果字串中只包含數字字符,則回傳 True,否則回傳 False, -
ljust(width[, fillchar])回傳一個原字串左對齊,并使用fillchar(默認空格)填充至長度width的新字串, -
rjust(width[, fillchar])回傳一個原字串右對齊,并使用fillchar(默認空格)填充至長度width的新字串, -
lstrip([chars])截掉字串左邊的空格或指定字符, -
rstrip([chars])洗掉字串末尾的空格或指定字符, -
strip([chars])在字串上執行lstrip()和rstrip(), -
partition(sub)找到子字串sub,把字串分為一個三元組(pre_sub,sub,fol_sub),如果字串中不包含sub則回傳('原字串','',''), -
rpartition(sub)類似于partition()方法,不過是從右邊開始查找, -
replace(old, new [, max])把 將字串中的old替換成new,如果max指定,則替換不超過max次, -
split(str="", num)不帶引數默認是以空格為分隔符切片字串,如果num引數有設定,則僅分隔num個子字串,回傳切片后的子字串拼接的串列, -
splitlines([keepends])按照行('\r', '\r\n', \n')分隔,回傳一個包含各行作為元素的串列,如果引數keepends為 False,不包含換行符,如果為 True,則保留換行符, -
maketrans(intab, outtab)創建字符映射的轉換表,第一個引數是字串,表示需要轉換的字符,第二個引數也是字串表示轉換的目標, -
translate(table, deletechars="")根據引數table給出的表,轉換字串的字符,要過濾掉的字符放到deletechars引數中,str7 = 'this is string example....wow!!!' intab = 'aeiou' outtab = '12345' trantab = str7.maketrans(intab, outtab) print(trantab) # {97: 49, 111: 52, 117: 53, 101: 50, 105: 51} print(str7.translate(trantab)) # th3s 3s str3ng 2x1mpl2....w4w!!!
-
-
格式化
-
format格式化函式str8 = "{0} Love {1}".format('I', 'Lsgogroup') # 位置引數 print(str8) # I Love Lsgogroup str8 = "{a} Love {b}".format(a='I', b='Lsgogroup') # 關鍵字引數 print(str8) # I Love Lsgogroup str8 = "{0} Love {b}".format('I', b='Lsgogroup') # 位置引數要在關鍵字引數之前 print(str8) # I Love Lsgogroup str8 = '{0:.2f}{1}'.format(27.658, 'GB') # 保留小數點后兩位 print(str8) # 27.66GB -
格式化符號
%c 格式化字符及其ASCII碼 %s 格式化字串,用str()方法處理物件 %r 格式化字串,用rper()方法處理物件 %d 格式化整數 %o 格式化無符號八進制數 %x 格式化無符號十六進制數 %X 格式化無符號十六進制數(大寫) %f 格式化浮點數字,可指定小數點后的精度 %e 用科學計數法格式化浮點數 %E 作用同%e,用科學計數法格式化浮點數 %g 根據值的大小決定使用%f或%e %G 作用同%g,根據值的大小決定使用%f或%E -
運算子輔助指令
m.nm 是顯示的最小總寬度,n 是小數點后的位數(如果可用的話) -用作左對齊 +在正數前面顯示加號( + ) #在八進制數前面顯示零('0'),在十六進制前面顯示'0x'或者'0X'(取決于用的是'x'還是'X') 0顯示的數字前面填充'0'而不是默認的空格 print('%5.1f' % 27.658) # ' 27.7' print('%.2e' % 27.658) # 2.77e+01 print('%10d' % 10) # ' 10' print('%-10d' % 10) # '10 ' print('%+d' % 10) # +10 print('%#o' % 10) # 0o12 print('%#x' % 108) # 0x6c print('%010d' % 5) # 0000000005
-
字典
字典 是無序的 鍵:值({key:value})對集合,鍵必須是互不相同的(在同一個字典之內),
-
創建與訪問
通過字串或數值作為
key來創建字典dic1 = {1: 'one', 2: 'two', 3: 'three'} print(dic1) # {1: 'one', 2: 'two', 3: 'three'} print(dic1[1]) # one print(dic1[4]) # 字典中并不存在`key`為4的鍵值對,報錯:KeyError: 4, dic2 = {'rice': 35, 'wheat': 101, 'corn': 67} print(dic2) # {'wheat': 101, 'corn': 67, 'rice': 35} print(dic2['rice']) # 35通過建構式
dict()創建字典通過
key將資料放入字典,每個key只對應一個value,多次對一個key放入value只保存最后一個value -
內置方法
-
dict.fromkeys(seq, [value])用于創建一個新字典,以序列seq中元素做字典的鍵,value為字典所有鍵對應的初始值, -
dict.keys()回傳一個可迭代物件,可以使用list()來轉換為串列,串列為字典中的所有鍵, -
dict.values()回傳一個迭代器,可以使用list()來轉換為串列,串列為字典中的所有值, -
dict.items()以串列回傳可遍歷的 (鍵, 值) 元組陣列,dic = {'Name': 'Lsgogroup', 'Age': 7} print(dic.items()) # dict_items([('Name', 'Lsgogroup'), ('Age', 7)]) print(tuple(dic.items())) # (('Name', 'Lsgogroup'), ('Age', 7)) print(list(dic.items())) # [('Name', 'Lsgogroup'), ('Age', 7)] -
dict.get(key, default=None)回傳指定鍵的值,如果值不在字典中回傳默認值, -
dict.setdefault(key, default=None)和get()方法 類似, 如果鍵不存在于字典中,將會添加鍵并將值設為默認值, -
key in dictin運算子用于判斷鍵是否存在于字典中,如果鍵在字典 dict 里回傳true,否則回傳false,而not in運算子剛好相反,如果鍵在字典 dict 里回傳false,否則回傳true, -
dict.pop(key[,default])洗掉字典給定鍵key所對應的值,回傳值為被洗掉的值,key值必須給出,若key不存在,則回傳default值, -
del dict[key]洗掉字典給定鍵key所對應的值, -
dict.popitem()隨機回傳并洗掉字典中的一對鍵和值,如果字典已經為空,卻呼叫了此方法,就報出KeyError例外, -
dict.clear()用于洗掉字典內所有元素, -
dict.copy()回傳一個字典的淺復制,參考上篇博客中復制、淺拷貝、深拷貝的分析 -
dict.update(dict2)把字典引數dict2的key:value對 更新到字典dict里,
-
集合
Python 中set與dict類似,也是一組key的集合,但不存盤value,由于key不能重復,所以,在set中,沒有重復的key,
注意,key為不可變型別,即可哈希的值,
-
創建
- 先創建物件再加入元素,
- 在創建空集合的時候只能使用
s = set(),因為s = {}創建的是空字典, - 使用
set(value)工廠函式,把串列或元組轉換成集合,重復元素會被set自動過濾,
-
訪問
- 可以使用
for把集合中的資料一個個讀取出來,使用len()內建函式得到集合的大小, - 可以通過
in或not in判斷一個元素是否在集合中已經存在
- 可以使用
-
內置方法
-
set.add(elmnt)用于給集合添加元素,如果添加的元素在集合中已存在,則不執行任何操作, -
set.update(set)用于修改當前集合,可以添加新的元素或集合到當前集合中,如果添加的元素在集合中已存在,則該元素只會出現一次,重復的會忽略, -
set.remove(item)用于移除集合中的指定元素,如果元素不存在,則會發生錯誤, -
set.discard(value)用于移除指定的集合元素,remove()方法在移除一個不存在的元素時會發生錯誤,而discard()方法不會, -
set.pop()用于隨機移除一個元素, -
set.intersection(set1, set2)回傳兩個集合的交集, -
set1 & set2回傳兩個集合的交集, -
set.intersection_update(set1, set2)交集,在原始的集合上移除不重疊的元素, -
set.union(set1, set2)回傳兩個集合的并集, -
set1 | set2回傳兩個集合的并集, -
set.difference(set)回傳集合的差集, -
set1 - set2回傳集合的差集, -
set.difference_update(set)集合的差集,直接在原來的集合中移除元素,沒有回傳值, -
set.symmetric_difference(set)回傳集合的異或, -
set1 ^ set2回傳集合的異或, -
set.symmetric_difference_update(set)移除當前集合中在另外一個指定集合相同的元素,并將另外一個指定集合中不同的元素插入到當前集合中, -
set.issubset(set)判斷集合是不是被其他集合包含,如果是則回傳 True,否則回傳 False, -
set1 <= set2判斷集合是不是被其他集合包含,如果是則回傳 True,否則回傳 False, -
set.issuperset(set)用于判斷集合是不是包含其他集合,如果是則回傳 True,否則回傳 False, -
set1 >= set2判斷集合是不是包含其他集合,如果是則回傳 True,否則回傳 False, -
set.isdisjoint(set)用于判斷兩個集合是不是不相交,如果是回傳 True,否則回傳 False,集合的邏輯操作參考博客「python天池-part1-02」中的邏輯運算
-
-
轉換
se = set(range(4)) li = list(se) tu = tuple(se) print(se, type(se)) # {0, 1, 2, 3} <class 'set'> print(li, type(li)) # [0, 1, 2, 3] <class 'list'> print(tu, type(tu)) # (0, 1, 2, 3) <class 'tuple'> -
不可變集合
Python 提供了不能改變元素的集合的實作版本,即不能增加或洗掉元素,型別名叫
frozenset,需要注意的是frozenset仍然可以進行集合操作,只是不能用帶有update的方法,
序列
-
針對序列的內置函式
-
list(sub)把一個可迭代物件轉換為串列, -
tuple(sub)把一個可迭代物件轉換為元組, -
str(obj)把obj物件轉換為字串 -
len(s)回傳物件(字符、串列、元組等)長度或元素個數, -
max(sub)回傳序列或者引數集合中的最大值 -
min(sub)回傳序列或引數集合中的最小值 -
sum(iterable[, start=0])回傳序列iterable與可選引數start的總和, -
sorted(iterable, key=None, reverse=False)對所有可迭代的物件進行排序操作,iterable-- 可迭代物件,key-- 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自于可迭代物件中,指定可迭代物件中的一個元素來進行排序,reverse-- 排序規則,reverse = True降序 ,reverse = False升序(默認),- 回傳重新排序的串列,
x = [-8, 99, 3, 7, 83] print(sorted(x)) # [-8, 3, 7, 83, 99] print(sorted(x, reverse=True)) # [99, 83, 7, 3, -8] t = ({"age": 20, "name": "a"}, {"age": 25, "name": "b"}, {"age": 10, "name": "c"}) x = sorted(t, key=lambda a: a["age"]) print(x) # [{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}] -
reversed(seq)函式回傳一個反轉的迭代器,s = 'lsgogroup' x = reversed(s) print(type(x)) # <class 'reversed'> print(x) # <reversed object at 0x000002507E8EC2C8> print(list(x)) # ['p', 'u', 'o', 'r', 'g', 'o', 'g', 's', 'l'] t = ('l', 's', 'g', 'o', 'g', 'r', 'o', 'u', 'p') print(list(reversed(t))) # ['p', 'u', 'o', 'r', 'g', 'o', 'g', 's', 'l'] r = range(5, 9) print(list(reversed(r))) # [8, 7, 6, 5] x = [-8, 99, 3, 7, 83] print(list(reversed(x))) # [83, 7, 3, 99, -8] -
enumerate(sequence, [start=0]),用于將一個可遍歷的資料物件(如串列、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 回圈當中,seasons = ['Spring', 'Summer', 'Fall', 'Winter'] a = list(enumerate(seasons)) print(a) # [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] b = list(enumerate(seasons, 1)) print(b) # [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] for i, element in a: print('{0},{1}'.format(i, element)) # 0,Spring # 1,Summer # 2,Fall # 3,Winter -
zip(iter1 [,iter2 [...]])- 用于將可迭代的物件作為引數,將物件中對應的元素打包成一個個元組,然后回傳由這些元組組成的物件,這樣做的好處是節約了不少的記憶體,
- 我們可以使用
list()轉換來輸出串列, - 如果各個迭代器的元素個數不一致,則回傳串列長度與最短的物件相同,利用
*號運算子,可以將元組解壓為串列,
a = [1, 2, 3] b = [4, 5, 6] c = [4, 5, 6, 7, 8] zipped = zip(a, b) print(zipped) # <zip object at 0x000000C5D89EDD88> print(list(zipped)) # [(1, 4), (2, 5), (3, 6)] zipped = zip(a, c) print(list(zipped)) # [(1, 4), (2, 5), (3, 6)] a1, a2 = zip(*zip(a, b)) print(list(a1)) # [1, 2, 3] print(list(a2)) # [4, 5, 6]
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/468733.html
標籤:Python
