1. 程式人生 > >python基礎-namedtuple、queue佇列、deque雙向佇列

python基礎-namedtuple、queue佇列、deque雙向佇列

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