LoginSignup
0

More than 3 years have passed since last update.

Effective Python 学習備忘録 5日目 【5/100】

Last updated at Posted at 2021-01-06

はじめに

Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです!

今回学習する教材

今日の進捗

  • 進行状況: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)   # 動作する

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0