python基礎-namedtuple、queue佇列、deque雙向佇列
阿新 • • 發佈:2019-01-27
namedtuple模組
1.namedtuple: 生成可以使用名字來訪問元素內容的tuple
from collections import namedtuple
//Point = namedtuple("P",("x","y"))這樣方式也可以
Point = namedtuple("P",["x","y"])
print("-----3種定義方式--------")
#定義方式1
p1 = Point(1,2)
#定義方式2
p2 = Point(x=1,y = 2)
#定義方式3
p3 = Point._make([1,2])
#記憶體地址不同
print(p1,p2,p3)
print(id(p1),id(p2),id(p3))
print("-----獲取p的屬性值--------" )
print(p1.x,p1.y)
#for迴圈輸出p的屬性值
for i in p1:
print(i)
print("-----通過索引輸出屬性值--------")
indexV1,indexV2= p1[0],p1[1]
print(indexV1,indexV2)
print("-----轉為list-----")
lis = list(p1)
print(lis)
ite = p1.__iter__()
for i in ite:
print(i)
print("-----修改屬性-----")
p4 = p1._replace(x = 7)
print(p4)
print(p1)
print("-----將物件轉為字典-----" )
print(p1._asdict())
print("-------第二波-------------")
Point = namedtuple("P",["x","y","z"])
p1 = Point(1,2,1)
#獲取值相同的鍵數量
print(p1.count(1),p1.count(2))
#獲取值的索引
print(p1.index(1),p1.index(2))
輸出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4collections.py
-----3種定義方式--------
P(x=1, y=2) P(x=1 , y=2) P(x=1, y=2)
54627144 54627184 54627224
-----獲取p的屬性值--------
1 2
1
2
-----通過索引輸出屬性值--------
1 2
-----轉為list-----
[1, 2]
1
2
-----修改屬性-----
P(x=7, y=2)
P(x=1, y=2)
-----將物件轉為字典-----
OrderedDict([('x', 1), ('y', 2)])
-------第二波-------------
2 1
0 1
Process finished with exit code 0
queue佇列
import queue
q = queue.Queue()
#放列表、整數、字串、元組、字典都可以
q.put([1])
q.put(2) #處理任務
q.put("safly")
q.put((1,3,4))
q.put({"a":1})
print("----queue格式輸出----")
print(q.queue)
print("----迴圈獲取\list獲取----")
for i in q.queue:
print(i)
print(list(q.queue))
#迭代去獲取方式是錯誤的
# for i in q.queue:
# print(q.get)
print("----get從隊頭刪除並返回一個專案----")
print(q.get())
print(q.get())
#判斷還剩幾個沒有獲取
print("還剩%d個"%q.qsize())
print(q.get())
print("還剩%d個"%q.qsize())
print(q.get())
print(q.get())
print(q.empty())
輸出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4collections.py
----queue格式輸出----
deque([[1], 2, 'safly', (1, 3, 4), {'a': 1}])
----迴圈獲取\list獲取----
[1]
2
safly
(1, 3, 4)
{'a': 1}
[[1], 2, 'safly', (1, 3, 4), {'a': 1}]
----get從隊頭刪除並返回一個專案----
[1]
2
還剩3個
safly
還剩2個
(1, 3, 4)
{'a': 1}
True
Process finished with exit code 0
我們來分析下get、get_nowait的問題
import queue
print("---新增元素另外方式")
q = queue.Queue()
if q.empty():
q = queue.Queue(maxsize = 4)
for i in range(4):
q.put(i)
print(q.queue)
print(q.get_nowait())
print(q.get())
print(q.get())
print(q.get())
print("---null嗎?",q.empty())
#如何刪除完畢,在進行get刪除不會報錯
q.put(8)
#在等待需要填入上面的8
print(q.get())
q.put(8)
#如何刪除完畢,在進行get_nowait刪除會報錯queue.Empty
print(q.get_nowait())
# print(q.get_nowait())
輸出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4collections.py
---新增元素另外方式
deque([0, 1, 2, 3])
0
1
2
3
---null嗎? True
8
8
Process finished with exit code 0
如果上面的程式碼中將# print(q.get_nowait())註釋去掉,就會報錯如下:
File "E:\python\python_sdk\lib\queue.py", line 192, in get_nowait
8
return self.get(block=False)
8
File "E:\python\python_sdk\lib\queue.py", line 161, in get
raise Empty
queue.Empty
原因是:q.get()起到阻塞作用,而get_nowait不需要阻塞,不需要等待直接執行,當佇列為空時候,直接get_nowait會報錯,如果使用get()不會報錯,會等待元素填入,等待刪除
deque
deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧:
from collections import deque
dq = deque()
dq.append('a')
dq.append(1)
dq.appendleft((1,3))
dq.appendleft([1,3,4])
dq.appendleft('c')
print(dq)
#extend(從佇列右邊擴充套件一個列表的元素)
dq.extend([1,3,9])
print(dq)
dq.extendleft([1,5])
print(dq)
#index(查詢某個元素的索引位置)
print(dq.index("c"))
#pop(獲取最右邊一個元素,並在佇列中刪除)
dq.pop()
#popleft(獲取最左邊一個元素,並在佇列中刪除)
dq.popleft()
print(dq)
#insert(在指定位置插入元素)
dq.insert(0,[1,23])
print(dq)
dq.remove([1,3,4])
print(dq)
#沒有元素時候,報錯
# dq.remove("safly")
輸出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4collections.py
deque(['c', [1, 3, 4], (1, 3), 'a', 1])
deque(['c', [1, 3, 4], (1, 3), 'a', 1, 1, 3, 9])
deque([5, 1, 'c', [1, 3, 4], (1, 3), 'a', 1, 1, 3, 9])
2
deque([1, 'c', [1, 3, 4], (1, 3), 'a', 1, 1, 3])
deque([[1, 23], 1, 'c', [1, 3, 4], (1, 3), 'a', 1, 1, 3])
deque([[1, 23], 1, 'c', (1, 3), 'a', 1, 1, 3])
Process finished with exit code 0