Python
 Computer >> コンピューター >  >> プログラミング >> Python

キューモジュールを使用したPythonでのスタックとキュー


Pythonでは、スタックとキューのデータ構造を実装するのは非常に簡単です。スタックは「後入れ先出し」の原理で動作するため、スタックはLIFOと呼ばれ、キューは「先入れ先出し」の原理で動作するため、キューはFIFOと呼ばれ、Pythonの組み込み関数は短くてシンプルなコード。

キューモジュールは、マルチプロデューサー、マルチコンシューマーのキューを実装します。これは、情報を複数のスレッド間で安全に交換する必要があるスレッドプログラミングで特に役立ちます。このモジュールのQueueクラスは、必要なすべてのロックセマンティクスを実装し、Pythonでのスレッドサポートの可用性に依存します。

このモジュールは、エントリが取得される順序のみが異なる3種類のキューを実装します。 FIFOキューの場合、最初に追加されたタスクが最初に取得され、LIFOキューの場合、最後に追加されたエントリが最初に取得されます(スタックのように動作します)。また、優先キューの場合、エントリは(heapqモジュールを使用して)並べ替えられたままになり、値の最も低いエントリが最初に取得されます。

このキューモジュールは、次のクラスと例外を定義します。

class Queue.Queue(maxsize =0)

これはFIFOキューのコンストラクターです。引数maxsizeは、キューに入れることができるアイテムの数の上限を設定する整数です。このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsizeがゼロ以下の場合、キューサイズは無限になります。

class Queue.LifoQueue(maxsize =0)

これはLIFOキューのコンストラクターです。引数maxsizeは、キューに入れることができるアイテムの数の上限を設定する整数です。このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsizeがゼロ以下の場合、キューサイズは無限になります。

class Queue.PriorityQueue(maxsize =0)

これは優先キューのコンストラクターです。引数maxsizeは、キューに入れることができるアイテムの数の上限を設定する整数です。このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsizeがゼロ以下の場合、キューサイズは無限大です。

例外Queue.Empty

この行は、非ブロッキングget()(またはget_nowait())が空のQueueオブジェクトで呼び出されたときに発生した例外を示しています。

例外Queue.Full

この行は、非ブロッキングput()(またはput_nowait())がいっぱいのQueueオブジェクトで呼び出されたときに発生した例外を示しています。

キューオブジェクト

Queue.qsize()

この関数は、キューのおおよそのサイズを返します。

Queue.empty()

この関数は、キューが空の場合はTrueを返し、それ以外の場合はFalseを返します。 empty()がTrueを返す場合、それ以降のput()の呼び出しがブロックされないことを保証するものではありません。同様に、empty()がFalseを返す場合、get()への後続の呼び出しがブロックされないことを保証するものではありません。

Queue.full()

キューがいっぱいの場合はTrueを返し、それ以外の場合はFalseを返します。 full()がTrueを返す場合、get()への後続の呼び出しがブロックされないことを保証するものではありません。同様に、full()がFalseを返した場合、それ以降のput()の呼び出しがブロックされないことを保証するものではありません。

Queue.put(item [、block [、timeout]])

アイテムをキューに入れます。オプションのargsブロックがtrueで、timeoutがNone(デフォルト)の場合、必要に応じて、空きスロットが使用可能になるまでブロックします。タイムアウトが正の数の場合、最大でタイムアウト秒数をブロックし、その時間内に使用可能な空きスロットがない場合は完全例外を発生させます。それ以外の場合(ブロックはfalse)、空きスロットがすぐに利用できる場合はアイテムをキューに入れ、それ以外の場合は完全例外を発生させます(その場合はタイムアウトは無視されます)。

Queue.get([block [、timeout]])

キューからアイテムを削除して返します。オプションのargsブロックがtrueで、timeoutがNone(デフォルト)の場合、アイテムが使用可能になるまで必要に応じてブロックします。タイムアウトが正の数の場合、最大でタイムアウト秒数をブロックし、その時間内に使用可能なアイテムがない場合は空の例外を発生させます。それ以外の場合(ブロックはfalse)、アイテムがすぐに利用できる場合はアイテムを返し、そうでない場合は空の例外を発生させます(その場合はタイムアウトは無視されます)。

Queue.task_done()

以前にキューに入れられたタスクが完了したことを示します。キューコンシューマスレッドによって使用されます。タスクのフェッチに使用されるget()ごとに、後続のtask_done()の呼び出しは、タスクの処理が完了したことをキューに通知します。

join()が現在ブロックしている場合、すべてのアイテムが処理されると再開します(つまり、キューに入れられたすべてのアイテムに対してtask_done()呼び出しが受信されました)。

キューに入れられたアイテムよりも多く呼び出された場合、ValueErrorを発生させます。

Queue.join()

キュー内のすべてのアイテムが取得されて処理されるまでブロックします。

アイテムがキューに追加されるたびに、未完了のタスクの数が増えます。コンシューマースレッドがtask_done()を呼び出して、アイテムが取得され、そのアイテムに対するすべての作業が完了したことを示すたびに、カウントが減少します。未完了のタスクの数がゼロになると、join()はブロックを解除します。

サンプルコード

import queue
#maximum capacity of queue is 20
Q = queue.Queue(maxsize=40)
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print(Q.get())
print(Q.get())
print(Q.get())
print(Q.get())

出力

50
90
10
70

アンダーフロー/オーバーフローの例

import queue
Q = queue.Queue(maxsize=30)
print(Q.qsize())
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print("Full: ", Q.full())
Q.put(90)
Q.put(100)
print("Full: ", Q.full())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print("Full: ", Q.full())

出力

0
Full: False
Full: False
50
90
10
Empty: False
70
90
100
Empty: True
Full: False

スタックの例3

import queue
S = queue.LifoQueue(maxsize=10)
# qsize() give the maxsize of
# the Queue
print(S.qsize())
S.put(50)
S.put(90)
S.put(10)
S.put(70)
S.put(90)
S.put(10)
print("Full: ", S.full())
print("Size: ", S.qsize())
# Data will be accessed in the
# reverse order Reverse of that
# of Queue
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print("Empty: ", S.empty())

出力

0
Full: False
Size: 6
10
90
70
10
90
Empty: False

  1. Pythonopenpyxlモジュールを使用してExcelファイルの読み取りと書き込み

    Pythonは、Excelファイルを操作するためのopenpyxlモジュールを提供します。 このモジュールでは、Excelファイルの作成方法、書き込み方法、読み取り方法などを実装できます。 openpyxlモジュールをインストールするには、コマンドプロンプトでこのコマンドを記述できます pip install openpyxl シートにタイトル名を付けたい場合 サンプルコード import openpyxl my_wb = openpyxl.Workbook() my_sheet = my_wb.active my_sheet_title = my_sheet.title print

  2. MacでのPython3のアップグレードと使用

    あなたはあなたの真新しいMacがすべての関連するソフトウェアの最新バージョンを持っていると思うかもしれません。ほとんどのユーザーアプリにとっては正しいでしょうが、基盤となるフレームワークにとっては別の話です。最新の安定版リリースはPython3.5ですが、新しいMacにはPython2.7.10が付属しています。これがバージョン間の大きなギャップのように思われる場合、それはそうだからです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python3はPython 2と下位互換性がなく、ほとんどの開発者は引き続きPython2を使用しています。 2to3か2to3ではないか?