ガードとワイルドカード
条件とすべてに一致するケースを追加します
「ガードとワイルドカード」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- matchとcaseの基礎
- シーケンスとマッピングのマッチング
- クラスパターン
- ガードとワイルドカード