0Pricing
Python Academy · レッスン

ガードとワイルドカード

条件とすべてに一致するケースを追加します

「ガードとワイルドカード」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

マッチ条件の調整

構造化パターンだけでは不十分で、条件も必要になることがあります。ガードを使うとcaseにifによるテストを追加でき、ワイルドカードを使うと柔軟な包括処理を記述できます。

ガードの追加

パターンの後にif <condition>と書きます。パターンに一致し、かつガードが真の場合にだけcaseがマッチします。

n = 7

match n:
    case x if x < 0:
        print('negative')
    case x if x == 0:
        print('zero')
    case x if x > 0:
        print('positive')

ガードでキャプチャした名前を使う

ガードでは、パターンによって束縛された変数を参照できます。ここでは、キャプチャしたペアが等しいかどうかを確認しています。

point = [3, 3]

match point:
    case [x, y] if x == y:
        print('on the diagonal')
    case [x, y]:
        print('off the diagonal')

ガードが失敗した場合

構造にはマッチしてもガードが偽の場合、マッチングは停止せず、次のcaseへ続行します。

value = 5

match value:
    case n if n > 100:
        print('big')
    case n:
        print('fell through to here:', n)

クラスパターンとガード

ガードはクラスパターンを含むあらゆる種類のパターンと組み合わせられ、オブジェクトの属性に対して正確な条件を指定できます。

from dataclasses import dataclass

@dataclass
class Order:
    total: float

def discount(order):
    match order:
        case Order(total=t) if t > 100:
            return 'free shipping'
        case Order():
            return 'standard shipping'

print(discount(Order(150)))
print(discount(Order(50)))

ワイルドカードのまとめ

単独のアンダースコア_はあらゆるものにマッチしますが、何も束縛しません。最後のcaseに置くと、それ以前に捕捉されなかったすべての値を処理できます。

x = 'unexpected'

match x:
    case 'a':
        print('letter a')
    case _:
        print('catch-all')

キャプチャとワイルドカードの違い

名前付きキャプチャもあらゆるものにマッチしますが、値を保持します。一方、_は値を破棄します。caseの本体で値が必要な場合は名前を使います。

value = 42

match value:
    case 0:
        print('zero')
    case other:        # capture: keeps the value
        print('value was', other)

パターン内のワイルドカード

アンダースコアは、より大きなパターンの中に置いて、関心のない部分を無視することもできます。

record = ('user', 42, 'ignore_me')

match record:
    case ('user', user_id, _):
        print('user id:', user_id)

OR、ガード、ワイルドカードの組み合わせ

これらの機能は組み合わせて使えます。ORパターン、ガード、最後のワイルドカードを順に配置すると、表現力の高い分類処理になります。

def classify(n):
    match n:
        case 0 | 1:
            return 'binary digit'
        case x if x % 2 == 0:
            return 'even'
        case _:
            return 'odd'

print(classify(0))
print(classify(4))
print(classify(7))

網羅性

一部の言語とは異なり、Pythonではmatchがすべてのケースを網羅することを強制されません。どのcaseにもマッチしなければ、文は何もせずに終了します。必ず分岐を実行したい場合は、最後にcase _を追加します。

color = 'purple'
result = 'no match'

match color:
    case 'red':
        result = 'stop'
    case 'green':
        result = 'go'

print(result)

デストラクチャリングしたデータへのガード

ガードはシーケンスパターンやマッピングパターンと自然に組み合わせられ、取り出したばかりの値をテストできます。

data = [10, 20]

match data:
    case [a, b] if a + b > 25:
        print('sum is large')
    case [a, b]:
        print('sum is small')

確認問題

パターンの構造にはマッチしたものの、ガード条件が偽だった場合はどうなりますか?

まとめ

条件と包括処理のcaseを追加する方法を学びました。

  • ガードはifによるテストを追加し、キャプチャした名前を利用できます。
  • ガードが失敗すると、次のcaseへフォールスルーします。
  • _はマッチして値を破棄し、名前は値をキャプチャします。
  • 必ず分岐を実行するには、最後にcase _を追加します。

よくある質問

「ガードとワイルドカード」レッスンは無料ですか?

はい。「ガードとワイルドカード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「ガードとワイルドカード」で何を学びますか?

条件とすべてに一致するケースを追加します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ガードとワイルドカード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. matchとcaseの基礎
  2. シーケンスとマッピングのマッチング
  3. クラスパターン
  4. ガードとワイルドカード
← Python Academyに戻る