Python実践入門 5章 関数
Pythonはreturn文省略できるよ(最後に評価された値が帰されるでなくNoneが帰されるので注意)
引数にはデフォルト値を持たせることもできるよ
code: デフォルト.py
def print_test(content='no content'):
print(content)
pythonでは関数もオブジェクト
code: 変数的にも扱えるよ.py
def print_test(content='no content'):
print(content)
f = print_test
f() # print_testと同義
Python特有の引数について
位置引数
関数定義時に指定する引数名が仮引数、実行時に実際に指定するのが実引数という 位置引数は実行時に仮引数名を指定せずに実行するやつ(他の言語での一般的な呼び出しと同じ)
code: 位置引数.py
def print_test(content='no content'):
print(content)
# 位置引数での呼び出し
print_test('foo')
キーワード引数
実行時に仮引数名を指定して実行する
ちなみに仮引数で指定してない引数名を使うとエラーになる
code: キーワード.py
print_test(content='foo')
デフォルト引数
は省略できる
という都合上、デフォルト値のない引数より後ろに配置しないといけない
デフォルト値は関数定義時に評価されるので、仮引数で冪等性のない関数とかを読んでるとバグる
code: 失敗する例.py
def print_datetime(timestamp=datetime.now()):
print(timestamp)
# 実行しても毎回同じ結果になってしまう
print_datetime()
code: 正しい例.py
def print_datetime(timestamp=None):
if timestamp is None:
timestamp = datetime.now()
print(timestamp)
可変長引数
GoとかJavaとかのと同じ*をつけると可変長引数になる、慣習として*argsとすることが多い
code: 可変長引数.py
def f(*args):
for a in args:
print(a)
可変長キーワード引数
**をつけるといい、慣習として**kwargsを使うことが多いらしい、map形式で渡される
code: 可変長キーワード.py
def f(**kwargs):
for k, v in kwargs.items():
print(f'{k}: {v}')
f(hoge='foo', bar='bar')
キーワードのみ引数
実行時にキーワード引数呼び出しを強制する
def f(content, *, forced_arg=False):, これの*`以降はキーワード引数よびが必須になる
位置のみ引数
こっちは逆に/より前のが位置のみ引数となる
引数リストのアンパック
code: リストとかを引数ようにアンパックできる.py
def f(a, b, c):
print(a, b, c)
# *つけたらアンパックする, **でマップを渡せばキーワード引数としても渡せる
f(*content)
5.2 lambda式
フォーマットは lambda 引数1, 引数2..: 戻り値になる式
filterとかmapとかで使うくらいで、可読性落ちるしあんま多用しないでね
型ひんと
引数と返り値の型をアノテーションで指定できる、やっても実行時型チェックするわけではない
コードの保守性向上や、IDEで利用できる情報になる
code: 型チェック.py
def f(a: int, b: int) -> int:
return a + b
mypy を使えば、型ヒントを使って静的型チェックできる