Python tuple(タプル)の使い方

python

今までずっとpythonのtupleの存在意義をよく分かってなかったのですが、仕事で使用するケースがあり理解をしたので書き示します。

タプルとは更新不可、不変な配列!

tuple(タプル)型とは

tuple(タプル)型とはイミュータブル(更新不可)、不変な配列を行う型のことをさします。

タプルはリストに似ていますが、定義後に要素を変更できない点がリストと違います。

つまり更新不可なので、リストのようなappendで要素を追加なんでできませんし、そもそもappendメソッドを使うこともできません。

list(リスト)型とは

list(リスト)型は、リストと呼ばれる可変な配列を扱う型です。後から中身が変化、追加、削除できる型になります。

dict(辞書)型とは

dict(辞書)型は、辞書を扱う型です。語源はその名の通りdictionary(辞書)ですね。

辞書はキーとバリューのセットで扱うデータ型で、他の言語ではハッシュやマップ、連想配列とも呼ばれます。

タプルの使用例

week = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
print(type(week)) # <class 'tuple'>
ヒロヤン
week(1週間)は不変な配列なので例題として使用してみました。
mylist = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
mylist.append("oneday")
print(mylist) # ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'oneday']

以下はtupleを理解した上で少し高度なコードを書いてみました。

問合せ管理画面で、現在の状態を新しい状態に更新した際のコードになります。

そのままコピペで動きます。

class Inquiry():
    class InquiryStatus():
        Pending = 0
        Ignore = 0
        Completed = 0

def inquiry_status(current_status, new_status):
    RET_KEEP = (True, 'keep status')
    RET_DENIED = (False, 'request denied!')
    RET_COMPLETED = (True, 'status changed!')
    STATUS_CHANGED_DICT = {
        Inquiry.InquiryStatus.Pending:{
            Inquiry.InquiryStatus.Pending: RET_KEEP,
            Inquiry.InquiryStatus.Ignore: RET_DENIED,
            Inquiry.InquiryStatus.Completed: RET_COMPLETED,
        },
        Inquiry.InquiryStatus.Ignore:{
            Inquiry.InquiryStatus.Pending: RET_KEEP,
            Inquiry.InquiryStatus.Ignore: RET_DENIED,
            Inquiry.InquiryStatus.Completed: RET_COMPLETED,
        },
        Inquiry.InquiryStatus.Completed:{
            Inquiry.InquiryStatus.Pending: RET_KEEP,
            Inquiry.InquiryStatus.Ignore: RET_DENIED,
            Inquiry.InquiryStatus.Completed: RET_COMPLETED,
        },
    }
    (success, msg) = STATUS_CHANGED_DICT[current_status][new_status]
    return (success, msg,)

inquiry = Inquiry()
current_status = inquiry.InquiryStatus.Completed
new_status = inquiry.InquiryStatus.Pending
(success, msg,) = inquiry_status(current_status,new_status)
print(success, msg) # True status changed!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です