はじめに
Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです!
今回学習する教材
-
Effective Python
- 8章構成
- 本章216ページ
今日の進捗
- 進行状況:48-55ページ
- 本日学んだことの中で、よく忘れるところ、知らなかったところを書いていきます。
動的なデフォルト引数を指定するときにはNoneとドキュメンテーション文字列を使う
デフォルト引数は一度しか評価されない
キーワード引数のデフォルト値に、現在時刻を使うプログラムを考える。
from datetime import datetime
from time import sleep
def log(message, when=datetime.now()):
print('%s: %s' % (when, message))
log('Hi there!')
sleep(0.1)
log('Hi again!')
出力結果
2021-01-06 14:52:16.518219: Hi there!
2021-01-06 14:52:16.518219: Hi again!
キーワード引数はモジュールロード時の関数定義の時だけなので、時刻は変化しない。デフォルト値をNoneにして、ドキュメンテーション文字列に実際の振る舞いを文書化することで、可読性を担保しつつ、正しい動作を得ることができる。
def log(message, when=None):
"""Log a message with a timestamp.
Args:
message: Message to print.
when: datetime of when the message occurred.
Defaults to the present time.
"""
when = datetime.now()
print('%s: %s' % (when, message))
log('Hi there!')
sleep(0.1)
log('Hi again!')
出力結果
2021-01-06 15:20:07.665323: Hi there!
2021-01-06 15:20:12.870457: Hi again!
キーワード専用引数で明確さを高める
関数の引数が多くなった際に、位置引数を用いると可読性が落ちる。
例として、4つの引数を持ち、初めの2つはint型、最後の二つはboolian型を受け取る、関数を考える。
def sample(int_a, int_b, bool_c, bool_d):
# ...
sample(1, 2, True, False)
この場合、bool_c, bool_dを容易に位置を取り違える可能性がある。
キーワード引数であれば、そのような心配は無くなる。Pythonでは、位置で引数を指定できなくする、キーワード専用引数が用意されている。
引数リストの中の*記号が、位置引数の終わりと、キーワード専用引数の始まりを示す。
def sample(int_a, int_b, *, bool_c, bool_d)
# ...
sample(1, 2, True, False) # Error になる
sample(1, 2, bool_c=True, bool_d=False) # 動作する