ホームページ >バックエンド開発 >Python チュートリアル >Pythonでswitch/case文を実装する方法

Pythonでswitch/case文を実装する方法

不言
不言オリジナル
2018-09-18 15:21:168758ブラウズ

この記事の内容は、Python での switch/case 文の実装方法に関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

Python には Switch/Case ステートメントがありません。多くの人は、このステートメントは洗練されておらず、十分な柔軟性がないと考えています。Python で複数条件の一致の問題を処理するには、辞書を使用する方が簡単で効率的です。 Python Player の経験がある人は、これが実際に当てはまることを認めなければなりません。

しかし、今日は Python を使用する必要がある場合に Switch/Case をプレイする方法を見ていきます。

構文制約

まず、Switch/Case の表現方法を定義しましょう。簡単にするために、次のようになります。

def cn():
    print('cn')

def us():
    print('us')

switch(lang).case('cn',cn)
            .case('us',us)
               .default(us)

クラス実装 1

上記の制約により、switch をクラスとして実装できます。受信パラメータはコンストラクターで処理され、その後、case メソッドと default メソッドがそれぞれ実装されます。

class switch(object):
    def __init__(self, case_path):
        self.switch_to = case_path
        self._invoked = False

    def case(self, key, method):
        if self.switch_to == key and not self._invoked:
            self._invoked = True
            method()

        return self

    def default(self, method):
        if not self._invoked:
            self._invoked = True
            method()

コンストラクターでは、現在の キー の場合、case()case_path と実行ステータス _invoked を記憶します。 switch_to と一致し、関数がまだ実行されていない場合は、_invoked を更新して、対応するメソッドを実行します。 default()_invoked を確認します。まだ実行されていない場合は、default ブランチの関数を呼び出します。

なかなか良さそうなので、試してみましょう。

switch('cn').case('cn',cn).case('us',us).default(fail)
>>> cn
switch('us').case('cn',cn).case('us',us).default(fail)
>>> cn
switch('jp').case('cn',cn).case('us',us).default(fail)
>>> fail
switch('cn').case('cn',cn).case('us',us)
>>> cn

いくつかの奇妙なケースを見てみましょう。

# duplicate case
switch('us').case('us',cn).case('us',us).default(fail)
>>> cn

def cn() return 'cn'
def us() return 'us'

# return value
result = switch('cn').case('cn',cn).case('us',us)
result
>>> <python_switch_case.switch object at 0x11034fb70>

わかりましたか? 上記の実装では、繰り返し発生するケースは処理されません。もちろん、できれば例外をスローすることで、ケース メソッドを強化できます。これは通常、他のプログラミング言語で行われます。

2つ目の質問は、ケースの戻り値を取得したいのですが、上記のように書いても捨てられてしまうので仕方ありません。実行結果を保存するために、switch クラスに結果変数を追加することを検討できます。

class switch(object):
    def __init__(self, case_path):
        ...
        self.result = None

    def case(self, key, method):
        ...
        self.result = method()
    ...

通話が完了すると、result を通じて結果を取得できます。

_ = switch('cn').case('cn',cn).case('us',us)
_.result
>>> cn

クラスの実装 2

おそらくインターネットで検索したと思います。クラスを介して Swich/Case を実装する方法については、Brian Beck を参照することもできます。

class switch(object):
    def __init__(self, value):
        self.value = value
        self.fall = False

    def __iter__(self):
        """Return the match method once, then stop"""
        yield self.match
        raise StopIteration

    def match(self, *args):
        """Indicate whether or not to enter a case suite"""
        if self.fall or not args:
            return True
        elif self.value in args:
            self.fall = True
            return True
        else:
            return False


c = 'z'
for case in switch(c):
    if case('a'): pass  # only necessary if the rest of the suite is empty
    if case('c'): pass
    # ...
    if case('y'): pass
    if case('z'):
        print("c is lowercase!")
        break
    if case('A'): pass
    # ...
    if case('Z'):
        print("c is uppercase!")
        break
    if case():  # default
        print("I dunno what c was!")

この種の実装は比較的複雑で、for と if の両方が必要であるため、あまり快適に使用できません (直接の if/else ほど快適ではありません)。もちろん、同じ結果のケースをまとめられる、ケース内にメソッド名だけでなく、より多くの内容を記述できるなどのメリットもあります。

最後に書いてあります

最後に、switch/case 問題に対処するために Python が推奨する方法に戻る必要があります。一般に、このマルチブランチ問題は次の方法で対処できます。例として辞書。

MAPPING = {
    'cn': cn,
    'us': us
}

lang = 'cn'
result = MAPPING.get(lang, default=us)

一目で分かりやすく、読みやすいだけでなく保守も容易ですか。キーはディクショナリ内で一意であり、値はクラスまたはメソッドのいずれかのタイプのデータであるため、十分な柔軟性があります。

以上がPythonでswitch/case文を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。