位置引数、キーワード引数、デフォルト引数

投稿者: | 2022-10-22

目次

位置引数

# 位置引数
def menu(entree, drink, dessert):
    print('entree = ', entree)
    print('drink = ', drink)
    print('dessert = ', dessert)
    
menu('beef', 'ice', 'beer')

キーワード引数

# キーワード引数
def menu(entree, drink, dessert):
    print('entree = ', entree)
    print('drink = ', drink)
    print('dessert = ', dessert) 
    
menu(entree='beef', dessert='ice', drink='beer')

デフォルト引数

# デフォルト引数
def menu(entree='beef', drink='wine', dessert='ice'):
    print('entree = ', entree)
    print('drink = ', drink)
    print('dessert = ', dessert) 
    
menu()
print('-'*5)
menu(entree='fish')

デフォルト引数でリストや辞書型を使う場合の注意点

def sample_func(x, l=[]):
    l.append(x)
    return l

y = [1, 2, 3]
r = sample_func(100, y)
print(r)

# [1, 2, 3, 100]
  • デフォルト引数のlを指定せずに100と入力すると、初回は空リスト[ ]に100が追加される
r = sample_func(100)
print(r)

# [100]
  • ただし同じことを続けると[100]になるはずが、[100,100]になってしまう
  • これはリストが参照渡しであるため、以前作成したリストのアドレスに紐付いている。そのため一度目に呼び出したリストをそのまま使用している
  • このような問題があるため、Pythonではリストをデフォルト引数に使うべきではない
r = sample_func(100)
print(r)
  • デフォルト引数に空のリストを使いたい場合
  • デフォルト引数を[]ではなくNoneを指定し、関数の中でリストの変数がNoneである場合は、リストを空にする(初期化する)処理を入れる
def sample_func(x, l=None):
    if l is None:
        l = []
    l.append(x)
    return l

r = sample_func(100)
print(r)

r = sample_func(100)
print(r)

#[100]
#[100]