検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>

【Python 雑談・雑学】 else ステートメントは if 文、for 文とだけではなくて try ブロックでも使えるよ、とアドバイスしたら、またまた感心されていい気分になった話 投稿一覧へ戻る

Published 2020年5月23日19:47 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

次のコードでは、User オブジェクト作成時に渡される grades パラメータはディクショナリであり、キーとして 'algebra' と 'programming' が含まれていることを前提としています。


class User:
def __init__(self, name, grades):
self.name = name
self.grades = grades
self.weighted_score = 0

def __repr__(self):
return f'<User {self.name}>'


def email_engaged_user(user):
try:
user.weighted_score = calculate_weighted_score(user.grades)
except KeyError:
print('異なるキー名が指定されました。')
else:
if user.weighted_score > 500:
send_grade_notification(user)


def calculate_weighted_score(grades):
return grades['algebra'] * 5 + grades['programming'] * 2


def send_grade_notification(user):
print(f'この通知は {user.name} へ送っています。{user.weighted_score} 点を獲得しました。')



もしこれらのキーが含まれていない場合、calculate_weighted_score() での実行でエラーが発生し、それが呼び出し元である email_engaged_user() でキャッチされます。


この場合は当たり前ですが except KeyError: ブロックが実行されて、設定した print ステートメントでエラーが出力されます。例えば下を実行してみましょう。


my_user = User('Nana', {'algebla': 73, 'programming': 100})
email_engaged_user(my_user)

# 異なるキー名が指定されました。




では、try ブロックが正常に終了した場合、必ず何らかの処理をしたい場合はどうしたらいいでしょう?


finally ステートメントを最後に追加しますか?


ご存知のように finally ステートメントは、エラーが発生してもしなくても必ず実行されます。
ですから、この場合には利用できません。


実は、try ブロックに else ステートメントを含めると、例外が発生せずに処理が通常に終了した場合のみ実行したい処理を記述することができます。


下を実行してみてください。


my_user = User('Nana', {'algebra': 73, 'programming': 100})
email_engaged_user(my_user)

# この通知は Nana へ送っています。565 点を獲得しました。




calculate_weighted_score() が正常に終了した場合に限り、else ステートメントが実行され、if 判定が True であれば send_grade_notification() が実行されるているのが分かると思います。


先日も記事にしたように、else ステートメントは if 文だけではなく、for 文とも try 文とも使えるんです。


こんなアドバイスをしたら、またまた感心されて、ちょっといい気分です。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -
Python 雑談・雑学 - else ステートメントは if 文だけではなくて for 文とも使えるよ、と教えたら感心された話
【 Effective Python, 2nd Edition 】yield from ステートメントでネストしたジェネレータ ( nested generators, composed generators ) を効率よく処理しよう!
【Python 雑談・雑学】 ユーザー入力に応じて異なる処理関数を実行する際の少し面白い実装方法 - ユーザーの選択項目とそれに応じる関数名をディクショナリで保持する -
【Python 雑談・雑学】 デコレータ (decorators) を理解しよう - デコレータ、オリジナル関数からの引数の渡し方、受け取り方
Python coding challenge - 隣り合った庭園には異なる花が植えられているようにするにはどの花を植えればいい?
【 Effective Python, 2nd Edition + coding challenge 】プログラム開発のどの段階で並列処理 ( concurrency ) が必要になるのだろう? そのときどのようにリファクタリング ( refactoring ) していけばいいのだろう? を考えてみるシリーズ ( のはず ) 第1回
【Python 雑談・雑学】 Python におけるマルチスレッド実行 (multi threading) について - マルチスレッドで実行すれば何でもかんでも速くなる、と思っていませんか? -