上級Python開発コース
チャプター
>
レベル
例外処理
else 節
目的
修理資材を取り出して仕分けし、例外処理付きのelse節を使用して不要な廃棄物を処分する。
建物の上部に修理資材が保管されており、これは嵐や通常の摩耗後の屋根修理に使用されます。一部は最近配達され、まだ包装や容器に入った状態で保管されており、他は長期間保管された後、雑多なゴミと一緒に混ぜられていました。資材を仕分け、適切に保管し、ゴミや廃棄物を処分することが望ましいでしょう。
混乱した資材の性質上、エラーが発生することが予想されます。try / except コードブロックで対処できますが、どのようなエラーが生じるかに慣れていない場合、少し手間取るかもしれません。しかし、else 節を追加することで、例外処理の手段を拡張することができます。これにより、exceptブロックが実行されなかった場合にコードを実行でき、コードの効率化が図られるとともに、エラーの特定と処理に適しています。
まず、左側の保管室に入り、明るいXマークの方向へ進んでください。この部屋には屋根タイルの修理に使われるシングルが保管されています。collect() 関数を使い、定数リストである shingles を取得してください。
リストにはおそらくいくつかの不良資材が混ざっており、除去する必要があります。さらに、これらは各々異なる量の資材が保管される6つの区画に分かれています。すべての資材をひとまとめにする必要があるため、全資材を保管する変数 red_storage と、廃棄資材を入れるためのリスト junk を作成してください。
通常なら、資材を識別し、int() を用いて整数に変換してから変数に格納し、片付けるでしょう。しかし、章の以前のレベルやこの演習の主題から予想されるように、エラーは避けられません。
for x in range(6): player.speak(int(shingles[x])) red_storage+=int(shingles[x])
これでは、リスト内の一部の項目が数字ではないため、残念ながら Value Error が発生します。これを解決するために、try / except および else コードブロックを使用して資材を仕分けします。else ブロックを用いることで、exceptブロックが不要な要素を除去するフィルターとして機能し、良好な要素を先に作成した変数に転送できるのです。
for x in range(6): try: player.speak(int(shingles[x])) except: player.speak("Item %s is junk" % (x)) junk.append(shingles[x]) else: red_storage+=int(shingles[x])
これにより、red_storage 変数にはすべての使用可能なシングルが格納され、不良品はすべて junk リストに追加されます。現在いる左側の保管室の金色のXマークまで歩き、write() 関数を使用して保管用のシングルの個数を記録してください(例:await player.write("There are %s shingles ready for use in storage" % (red_storage)))。その後、赤いカーペット上の暗いXマークまで歩き、place() 関数を使用して red_storage 変数をクレートに保管してください。
この作業が完了したら、右側の保管室へ向かってください。この部屋には、木製の板や、屋根・壁の修理に必要な資材が保管されています。緑のカーペット上の暗いXマークに向かい、collect() 関数を使用してクレートから、不良品が除去された木材板の定数リスト planks_set を取得してください。その隣の明るいXマークまで歩き、再度 collect() 関数を使用して、最近出荷された未処理の木材板資材が入った定数リスト shipment を取得してください。
前の部屋と同様に、shipment リストにはいくつかの不良資材が混ざっている可能性があり、除去する必要があります。これらはそれぞれ異なる量の資材が保管されている6つの区画に分かれています。すべての資材を一つの山にまとめるため、変数 blue_storage を作成してください。同様に、廃棄資材は junk リストに格納されます。
木材板については、shipment リスト内の有用な資材を int() を使って変換し、planks_set リストに加え、すべてまとめて blue_storage 変数に格納します。しかし、先ほどと同様にエラーが発生する可能性があります。
for y in range(6): planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) blue_storage+=int(planks_set[y])
今回は、数値と文字列を一緒に加えようとするために Type Error が発生することが予想されます。これも再び try / except および else コードブロックを使用して対処できます。try ブロックでリストを加算し、except ブロックで不良品を除去し、else 節で木材板を blue_storage に加えます。
for y in range(6): try: planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) except: player.speak( "Item %s is junk. Slot only has %s items" % (y,planks_set[y])) junk.append(shipment[y]) else: blue_storage+=int(planks_set[y])
これで blue_storage 変数が整えられたので、すべての木材板を記録し、保管することができます。右側の保管室の金色のXマークまで歩き、テーブルに向かって write() 関数を使用し、まとめた資材の数を記録してください(例:await player.write("There are %s planks ready for use in storage" % (blue_storage)))。
レベルを完了するには、青いカーペット上の暗いXマークまで歩き、place() 関数を使用して blue_storage 変数をクレートに保管します。次に、中程の部屋にある紫のカーペット上の暗いXマークまで歩き、place() 関数を使用して junk リストをゴミ投入口へ廃棄し、作業を完了させてください。