Python基礎六(day06)

(本文僅作為學習記錄使用) 感謝太白老師和王sir的諄諄教導.
01 昨日內容回顧

昨日主要講解的是字典。
字典考察字典的增刪改查和其他操作。

字典的增加(2種)
  1.直接改,按照key改. dic[key] = value. 有則修改,無則增加.
  2.setdefault. dic.setdefault[key,value] 有則不改,無則添加.
    注意,key是唯一的,value是任意的. key必須有,value可以沒. value沒的話就是none,可以視為set. set是特殊的字典.

字典的刪除(4種)
  1.pop. 按key刪除. dic.pop(key)
  2.clear . 清空字典. dic.clear()
  3.popitem . 刪除最後一個.(Python 3.6以後) dic.popitem()
  4.del. 可以按鍵刪除. 也可以刪除dic. del dic , del dic[key]

字典的改(2種)
  1.直接改.dic[key] = value. 有則修改,無則增加.
  2.update. dic.update(key=value) dic.update(dic2)
  注意,update既可直接修改(用等號,key不用引號),也可直接把一個字典改進去. 而dic.setdefault後面的是逗號.

字典的查(2種)
  1.直接查 . 找到dic的key . print(dic[key]) . 如此.
  2.用get. dic.get[key] 獲取key對應的value.

其他操作:
  1.對key操作的手段很少,只有2種.
    1.通過for循環遍歷.

demo1: d = {k1:v1,k2:v2,k3:v3} for i in d : print(i) 結果:輸出key.這個是單個單個的字元串輸出.

    2.通過list.

demo2:

d = {k1:v1,k2:v2,k3:v3}

l = list(d)

print(l)

結果:輸出key.這個是輸出的列表.

  其他,dic.keys() 輸出所有key(列表中的元素是字元串)

    dic.values() 輸出所有value(列表中的元素是字元串)

    dic.items() 輸出所有key和value(列表中的元素是元組)

  鏈接:https://www.cnblogs.com/smithpath/articles/10486405.html
02 作業講解

# 1.有如下變數(tu是個元祖),請實現要求的功能 # tu = ("alex", [11, 22, {"k1": v1, "k2": ["age", "name"], "k3": (11, 22, 33)}, 44]) # a.講述元祖的特性 # 元組通常上來說不可變,格式是(,)等(可以隔許多個),是存儲大量容器型數據的數據。 # 其他語言中沒有元組的概念,只有Python有。 # 元組中的數據不能修改,只能查詢。雖然元組不能修改,但是裡面的字典、列表等元素可被修改。 # 元組中存儲的一般是非常重要的數據,如個人信息等。一般來說元組很少用。 # b.請問tu變數中的第一個元素"alex"是否可被修改? # 不可以.因為是元組. # 嘗試: # tu[0] = 1 # print(tu)#tuple是只可讀,而不支持寫的,所以,在這就出現了關於tuple的問題,就會出現問題。 # c.請問tu變數中的"k2"對應的值是什麼類型?是否可以被修改?如果可以,請在其中添加一個元素"Seven" # 對應的是list列表. 可以被修改. # print(tu[1][2][k2],type(tu[1][2][k2])) #如果不知道dict中是否有key的值 # tu[1][2][k2].append(seven) # dict.get(key) # print(tu[1][2][k2]) #如果用 dict[key] 讀取會報KeyError異常 # d.請問tu變數中的"k3"對應的值是什麼類型?是否可以被修改?如果可以,請在其中添加一個元素"Seven" # 是元組. 不可以被修改. # print(tu[-1][-2][k3],type(tu[-1][-2][k3])) # 2.字典dic, dic = {k1: "v1", "k2": "v2", "k3": [11, 22, 33]} # dic = {k1: "v1", "k2": "v2", "k3": [11, 22, 33]} # a.請循環輸出所有的key # for key in dic : # print(key) # b.請循環輸出所有的value # for key in dic : # print(dic[key]) # c.請循環輸出所有的key和value # 不美觀: # for key in dic : # print(key,dic[key]) # 較美觀: # for key in dic: # print(dic[%s]= % key,dic[key] ) # d.請在字典中添加一個鍵值對,"k4": "v4",輸出添加後的字典 # 法一: # dic[k4] = v4 # print(dic) # 法二: # dic.setdefault(k4,v4) # print(dic) # dic = {k1: "v1", "k2": "v2", "k3": [11, 22, 33]} # e.請在修改字典中"k1"對應的值為"alex",輸出修改後的字典 # 法一: # dic[k1] = alex # print(dic) # 法二: # dic.update(k1=alex) # print(dic) # f.請在k3對應的值中追加一個元素44,輸出修改後的字典 # dic[k3].append(44) # print(dic) # g.請在k3對應的值的第1個位置插入個元素18,輸出修改後的字典 # dic[k3].insert(0,18) # print(dic) # 3. # av_catalog = { # "歐美": # { # "www.太白.com": ["很多免費的,世界最大的", "質量?般"], # "alex.com": ["很多免費的,也很大", "質量比yourporn比高點"], # "oldboy.com": ["多是自拍,比高質量圖片很多", "資源不多,更新慢"], # "hao222.com": ["質量很高,真的很高", "全部收費,屌絲請繞過"] # }, # "日韓": # { # "tokyo-hot": ["質量怎樣不清楚,個人已經不喜歡日韓范了", "verygood"] # }, # "大陸": # { # "1024": ["全部免費,真好,好人?生平安", "伺服器在國外,慢"] # } # } # a, 給此["很多免費的,世界最大的", "質量?般"]列表第?個位置插入?個元素:量很大。 # av_catalog[歐美][www.太白.com].insert(1,量很大) # print(av_catalog) # b, 將此["質量很比高,真的很比高", "全部收費,屌絲請繞過"]列表的"全部收費,屌絲請繞過"刪除。 # 法一: # av_catalog[歐美][hao222.com].pop(1) # print(av_catalog) # 法二: # av_catalog[歐美][hao222.com].remove("全部收費,屌絲請繞過") # print(av_catalog) # 法三: # del av_catalog[歐美][hao222.com][1] # print(av_catalog) # c, 將此["質量怎樣不清楚,個人已經不喜歡日韓范了", "verygood"]列表的"verygood"全部變成大寫。 # av_catalog[日韓][tokyo-hot][1] = av_catalog[日韓][tokyo-hot][1].upper() # print(av_catalog) # d, 給大陸對應的字典添加?個鍵值對1048: [?天就封了] # 法一: # av_catalog[大陸][1048]=[?天就封了] # print(av_catalog) # 法二: # av_catalog[大陸].setdefault(1048, [?天就封了]) # print(av_catalog) # e.刪除該鍵值對. "oldboy.com": ["多是自拍,高質量圖片很多", "資源不多,更新慢"] # del av_catalog[歐美][oldboy.com] # print(av_catalog) # f, 給此["全部免費,真好,好人?生平安", "伺服器在國外,慢"]列表的第?個元素,加上?句話:可以爬下來 # av_catalog[大陸][1024][0]+=,可以爬下來 # print(av_catalog) # 4.有字元串"k: 1|k1 :2|k2:3 |k3 :4"處理成字典{k: 1, k1: 2....}(升級題) # 法一: # s1 = "k: 1|k1 :2|k2:3 |k3 :4" # l2 = [] # dic1={} # l1 = s1.split(|) # for i in l1: # l2 = i.split(:) # dic1[%s%l2[0].strip()]= int(l2[1]) # print(dic1) # 法二: # strings = "k: 1|k1 :2|k2:3 |k3 :4" # li2 = [] # dic = {} # # li = strings.split("|") # # for lst in li: # lst = lst.split(":") # li2.append(lst) # # for x, y in li2: # x = x.strip() # y = int(y.strip()) # dic[x] = y # # print(dic) # 5.元素分類有如下值li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90],將所有大於66的值 # 保存至字典的第一個key中,將小於66的值保存至第二個key的值中。 # 即: {k1: 大於66的所有值列表, k2: 小於66的所有值列表} # 法一: # li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] # dic ={k1:[],k2:[]} # for i in li : # if int(i) < 66 : # dic[k1].append(i) # elif int(i) > 66 : # dic[k2].append(i) # print(dic) # 法二: # li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] # d = {} # for e in li: # if e > 66: # # 若bigger鍵已經存在,就把已經存在的列表取出,然後再把當前元素追加到列表上. # value = d.get(bigger, []) # value.append(e) # d[bigger] = value # elif e < 66: # # 若smaller鍵已經存在,就把已經存在的列表取出,然後再把當前元素追加到列表上. # value = d.get(smaller, []) # value.append(e) # d[smaller] = value # print(d) # 6.輸出商品列表,用戶輸入序號,顯示用戶選中的商品 # 商品列表: # goods = [{"name": "電腦", "price": 1999}, # {"name": "滑鼠", "price": 10}, # {"name": "遊艇", "price": 20}, # {"name": "美女", "price": 998}, ] # # 要求: # 1:?面顯示 序號 + 商品名稱 + 商品價格,如: # 1 電腦 1999 # 2 滑鼠 10 # … # 2:用戶輸入選擇的商品序號,然後列印商品名稱及商品價格 # 3:如果用戶輸入的商品序號有誤,則提示輸入有誤,並重新輸入。 # 4:用戶輸入Q或者q,退出程序。 # 法一(寫錯了,題目理解錯誤): # while True: # num = input(請輸入商品序號(1~4,按Q(不區分大小寫)退出):).strip() # if num == Q or num == q: # break # for i in range(1, len(goods)+1): # if num == str(i): # print( # 序號 商品名稱 商品價格 # %s %s %s # % (num, goods[int(i)-1][name], goods[int(i)-1][price])) # break # else: # if i == len(goods): # print(輸入有誤,請重新輸入) # 法二: # # 輸出商品信息 # print("序號 商品 價格") # for i in range(len(goods)): # print(i+1, " ", goods[i]["name"], " ", goods[i]["price"], sep="") # # while True: # 用戶選擇商品並反饋信息 # buy = input("請輸入: ").strip() # if buy.upper() == "Q": # break # # if buy.isdigit() and int(buy) <= len(goods): # # 由於buy是字元串類型, 負數在字元串中由於存在特殊字元"-", 因此不是純數字組成, 如果用戶輸入負數, buy.isdigit()返回False # print("商品", " ", "價格", sep="") # print(goods[int(buy) - 1]["name"], " ", goods[int(buy) - 1]["price"], sep="") # else: # print("輸入錯誤, 請重新輸入") # 法一: # while 1: # for i in range(len(goods)): # print(序號 name price
{} {} {}.format(i + 1, goods[i][name], goods[i][price])) # msg = input(請輸入序號(1~4),按Q可退出:) # if msg.upper() == Q : # break # for i in range(len(goods)): # if 0< i+1 < len(goods) : # if msg == str(i+1) : # print(name price
{} {}.format(goods[i][name], goods[i][price])) # break # else : # print(輸入錯誤,請重新輸入) # break#isdigit會過濾小數

03 小數據池(了解)

  不多解釋,只需要注意,同一代碼塊和不同代碼塊的緩存機制(駐留機制)不同.
  同一代碼塊的id相同.

s = zhangwuji print(id(s)) # 獲取內存地址 # == 判斷兩個對象的值相同.

is 身份運算:判斷的是兩個對象的內存地址是否相同.

demo3: i1 =1000 i2 = 1000 print(i1 is i2) 輸出結果為True.

  不同代碼塊參考小數據池(緩存範圍是-5~256)即數字在這區間是正確的.

超過該區間則錯誤.

# 一個文件是一個代碼塊.(函數,類都是一個代碼塊.)
# 交互命令中一行就是一個代碼塊.

# 同一個代碼塊駐留機制的目的:

1,節省內存空間.
2,提升性能.

# 駐留機制針對的對象: int bool str ()空元組.

# int: 範圍 任意數字
# i1 = 1212312312312312312312312
# i2 = 1212312312312312312312312
# print(i1 is i2)
# bool True Fasle
# str:幾乎所有的字元串都會符合緩存機制,

# 通過相乘的形式構建的字元串長度不能超過20滿足同一代碼塊的駐留機制.

# 不同的代碼塊之間: 小數據池.
# 小數據池是針對 不同代碼塊 之間的緩存機制!!!

# 小數據池的目的:

1,節省內存空間.
2,提升性能.

# 小數據池針對的對象: int bool str ()空元組.

# int: -5 ~256
# str: 一定規則的字元串

# 總結

 如果在同一代碼塊下,則採用同一代碼塊下的換緩存機制。

  如果是不同代碼塊,則採用小數據池的駐留機制。

04 數據類型的補充

# 數據類型之間的轉換
# int bool str list tuple dict set
int bool str 三者轉化是可以的.

# bool 可以與所有的數據類型進行轉換.
# 所有為空的數據類型轉化成bool都為Fasle.
# 0 [] () {} None ----> Fasle

# list ---> str join # list裡面的元素全部都是str類型

注意,dic = dict.fromkeys()
坑: 如果你的值是一個可變的數據類型, 他在內存中是一個.id相同.

tuple: 如果元組中只有單個元素並且沒有 , 則類型是元素本身的類型.

join的用法. .join(list)

l1 = [11, 22, 33, 44, 55] # 將此列表索引為奇數位對應的元素全部刪除. # 方法一: # del l1[1::2] # print(l1) # 方法二:錯誤示例: # 循環一個列表時,不要改變列表的大小.這樣會影響你最後的結果. # for index in range(len(l1)): # if index % 2 == 1: # # index 奇數 # l1.pop(index) # print(l1) # 方法三 # new_l = [] # for index in range(len(l1)): # if index % 2 == 0: # new_l.append(l1[index]) # # print(new_l) # l1 = new_l # print(l1) # 方法三: # for index in range(len(l1)-1,-1,-1): # if index % 2 == 1: # l1.pop(index) # print(l1) # 循環一個列表時,最好不要對原列表有改變大小的操作,這樣會影響你的最終結果. # dic = {k1: v1, k2: v2, k3: v3, name: alex} # 將字典中的key中含有k元素的所有鍵值對刪除. # dictionary changed size during iteration # for key in dic: # if k in key: # dic.pop(key) # print(dic) # l1 = [] # for key in dic: # if k in key: # l1.append(key) # # print(l1) # for key in l1: # dic.pop(key) # print(dic) # 循環一個字典時,不能改變字典的大小,這樣會報錯.


05 集合(了解即可)

回顧:字典特點:

1.key是唯一的.

2.key必須是可以哈希的(不可變數據類型:字元串,元組,數值)

3.key是無序的.

3.6中dict的元素有序是解釋器的特點,不是python源碼的特點.

xxx.py

Cpython -> 有序

Jpython -> 無序

集合:set

實際上就是一種特殊的字典.

所有value都是None的字典,就是集合.

對比字典和集合的特點:

字典

集合

Key唯一

元素唯一

Key可以哈希

元素可以哈希

Key無序

元素無序

如何獲取集合?

1.手動創建集合.

1.創建空集合

d = {}

創建空集合,只有一種方式:調用set函數.

S = set()

2.創建帶元素集合

S = {1,2,3}

從可迭代對象中(字元串,列表,元組,字典)創建集合.

s = set(『abc』)

S = set([1,2,3])

S = set((1,2,3))

S = set({『name』:』Andy』,』age』:10})

2.通過方法調用

-> str

-> list

-> set

集合的操作:

查看集合可用的方法:

[x for x in dir(set) if not x.startswith(『_』)]

[add, clear, copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update]

增:

add:如果元素存在,沒有做任何動作.

刪:

Pop() :依次從集合中彈出一個元素,如果集合為空,報錯

Discard(ele) :從集合中刪除指定的元素,如果不存在,什麼都不執行

Remove(ele) :從集合中刪除指定的元素,如果不存在,報錯

Clear() :清空

集合的四大常用操作:

並集:union

交集:intersection

差集:difference

對稱差:symmetric_difference

改(更新):

Update :用二者的並集更新當前集合

difference_update:用二者的差集更新當前集合

intersection_update:用二者的交集更新當前集合

symmetric_difference_update:用二者的對稱差集更新當前集合

判斷功能:

Isdisjoint:判斷兩個集合是否沒有交集

Issubset:判斷當前集合是否是後者的子集

Issuperset:判斷後者是否是當前集合的子集

集合基本沒有單獨取其中元素的需求.

集合的使用場景:

1.判斷一個元素是否在指定的範圍之內.

2.方便數學上的集合操作.

並,交,差,對稱差

有簡化寫法:

並:|

交:&

差:-

對稱差:^

3.對序列數據類型中的重複元素進行去重

如果想遍歷集合中的元素.

通常用for循環.

frozenset:凍結的集合

最大的特點:不可變.

[copy, difference, intersection, isdisjoint, issubset, issuperset, symmetric_difference, union]

少了添加,更新的方法.

s = frozenset()

s = frozenset(abcabc)

s = frozenset([1,2,3])

s = frozenset((1,2,3))

s = frozenset({name:Andy,age:10})

集合的四大方法:並,交,差,對稱差.

set,frozenset是否可以混用?

可以!

總結:

如果兩種數據類型混用,方法的主調者的類型決定了最終結果的類型.

frozenset應用場景:

凡是使用到不可改變的數據的場景,都是可以使用frozenset的.

set集合的元素:必須是可以哈希的,set本身不是可以哈希.

但是frozenset是不可變的數據.(可以哈希的),它是可以放到集合中.

set和frozenset可以互相轉換.


推薦閱讀:

TAG:Python | Python入門 |