anyとall
このレッスンでできるようになること。any と all を使って、「1件でもあるか」「全件そうか」をフラグ変数なしで判定できるようになります。
any(判定の並び) は1つでも真があれば True、all(判定の並び) は全部が真なら True を返します。中身は真偽値の並びなので、第3章のジェネレータ式と組み合わせるのが定番です。
Python
ages = [12, 17, 19]
print(any(age >= 18 for age in ages)) # True
print(all(age >= 18 for age in ages)) # Falseこれを for 文で書くと、フラグ変数を用意して途中で break する形になります。any と all を使えば意図がそのまま1行で表せますし、真偽が確定した時点で走査を打ち切ってくれるので無駄もありません。
空のリストを渡したときの答えは覚えておく価値があります。any([]) は False、all([]) は True です。all が True になるのは「反例が1つも無い」からで、支出が0件のときに「全件が予算内」と判定されるのはそのためです。空のときにどう振る舞ってほしいかは、必ず自分で決めて書き分けてください。
条件と for を読む順番を、商品の在庫で確かめます。
Python
stocks = [4, 0, 7]
sold_out = any(stock == 0 for stock in stocks)
all_available = all(stock > 0 for stock in stocks)
print(sold_out, all_available) # True Falseany は先頭の判定が False でも続け、0 の在庫で True が出たら止まります。all は先頭が True でも続け、0 の在庫で False が出たら止まります。条件が先頭で決まるなら、2件目以降は調べません。これが短絡評価です。演習でも2つの判定を別の変数に入れてから、指定されたキーの辞書で返してください。
金額は int で比べます。float にすると 1000.0000000000001 のような値で判定がひっくり返ることがあるためです。
要件
- over_exists は any と判定のジェネレータ式で判定する
- all_within は all と判定のジェネレータ式で判定する
- 予算ちょうどを超過にせず、2つの指定キーを持つ辞書を返す
ヒント
編集 ゆめさく編集部