Python進階——First

1.列表生成式實現笛卡爾積

names = ['張三', '李四', '王麻子']
sexs = ['男', '女', '男']
new_list = [(name, sex) for name in names for sex in sexs]

輸出 new_list 是 3*3=9 個元組 

附:

    生成器表達式只需將中括號換成小括號即可
    生成器表達式逐個產生元素而不是一次性產出一個列表(內存)
    這樣有利於避免額外內存佔用

2.具名元組

from collections import namedtuple

city = namedtuple('city', 'name username country age')
tokyo = city('Tokyo', '小胡', '日本', '22')

第一行參數是類名以及它的屬性名稱
第二行是屬性賦值,字段信息獲取和對象一樣

附: 切片賦值必須爲可迭代對象,即是可變型數據類型
缺點: 無法指定各參數的默認值

3.排序區別

a = ['a', 'b', 'dd', 'c']
a.sort() 對a進行排序,不會生成新列表,原存儲位置不變
sorted(a) 會生成新列表,佔據新內存


整形與字符串的排序

l = [0, '1', 2, '3', 11, 25, '25']
print(sorted(l, key=int))
print(sorted(l, key=str))

[0, '1', 2, '3', 11, 25, '25']
[0, '1', 11, 2, 25, '25', '3']

4.雙向隊列

此類是一個線程安全、可以快速從兩端添加或者刪除元素的數據類型

from collections import deque

d = deque(range(10), maxlen=10)  設置最大長度爲10,一旦設置則不能修改
                                 超出則刪除;不設置也可以
d.rotate(2)    設置旋轉2個數字,參數爲正數則將右邊移到左邊,反之相反
print(d)

d.appendleft(-1)  從頭部添加一個元素 -1 ,若超出限制則從右邊刪除
print(d)

d.append(2)       尾部添加,超出則從左邊刪除;extend方法同理
print(d)

結果
deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7], maxlen=10)
deque([-1, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 2], maxlen=10)

Queue類也是一種隊列類,但當其隊列滿時會被鎖住,直到有空才能使用

5.字典

d = {}
d.setdefault(key, value)

顧名思義,設置默認值。如果原有則無意義,否則添加

d.get() 原有則返回值,否則返回None

實現隊列或棧

from collections import OrderedDict

d = OrderedDict([('1', 1), ('2', 2), ('3', 3)])

d.popitem(last=False)
實現先進先出(隊列), 當沒有 last 參數時,先進後出()
此類型添加鍵時會保持順序


6.簡便統計字典中各元素次數

from collections import Counter

c = Counter('aaabbbvd')
lis = c.most_common()
元素個數元組展示--> [('a',3), ('b',2), ('c',1), ('d',1)]

result = {key: value for key, value in lis}
元素個數字典存儲--字典生成式-->{'a': 3, 'b': 3, 'v': 1, 'd': 1}

7.集合

可變數據類型中僅集合支持 交併補集以及子父集 操作
不可變類型=可散列的

discard() 方法,有則移除,無則不操作
remove() 方法,有則移除, 無則報錯

8.散列表

即哈希表

散列表是一個稀疏數組(總有空白), 集合和字典的實現都依賴它
它在被創建時有一個閾值,當空白小於閾值時會進行擴容,原有的
散列表會被複制到一個更大的空間裏
一個可散列對象支持 hash()函數,若a==b,則hash(a)==hash(b)
字典和集合都是以犧牲空間來換取時間,內存消耗大但查詢速度快

9.編碼與解碼

編碼--encode()用於機器間存儲和傳輸,將字符串變爲字節序列
解碼--decode()用於人類識別, 將字節序列轉爲文本字符串

str.encode('utf8')
bytes.decode('utf8')

編碼的等價交換

a = 'ss'
a = a.encode('utf8')

a = bytes('ss').encode('utf8')

a = bytes('ss', encoding='utf8')

輸出爲 b'ss'
實現字符串轉化爲 bytes類型

使用 errors參數可以將無法解碼的部分用 ? 表示
a.decode('utf8', errors='replace')

聲明編碼格式

# coding: utf-8

10.小問題

with open('xxx.txt', 'wb') as f:
    f.write()

會調用系統默認的編碼方式編碼寫入

with open('xxx.txt', 'r') as f:
    f.read()
    
同理,也可以自己設置編碼格式 encoding

正則表達式匹配字節序列
re.compile(rb'\d+')
re.compile(rb'\w+')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章