関数
使う前に定義する。
引数の数が違うとエラー。(明示すれば可変長にできる)
def add(a, b): return a + b def menu(entree ,drink, dessert='cake'): print(entree, drink, dessert) #キーワード引数も対応 menu(entree='chikin', drink='beer')
型宣言できるがエラーにならないので普通は使わない。
def add_num(a: int, b: int) -> int: return a + b
注意点
リスト、ディクショナリなど参照渡しの変数を[]や{}をデフォルト引数にしたら、
引数がない場合に同じ参照が残るのでダメ。
やるときはNoneをデフォルトにして、Noneの場合に生成する。
def test(x, y=None): if y is None: y = [] y.append(x) return y test(9) #1回目 test(9) #前回のyに追加されて[9,9]が返される
可変長引数
argsは引数をタプル化して受け取る
def multiArg(word, *args): print(word) print(args) for arg in args: print(arg) multiArg('aa','bb','cc','dd')
タプルのアンパッキング
tt = ('11','22','33') print(*tt)
タプルはアンパッキングしてからargsに渡すと一個ずつ取り出せる
ディクショナリ引数
キーワード引数はディクショナリ化
def dictArg(**kwargs): print(kwargs) dictArg(entree='chikin', drink='beer')
ディクショナリのアンパッキング
dd = {'aa':11,'bb':22,'cc':33} dictArg(**dd)
複合
argsはkwargsより前に書かないとエラー
def argMixed(fixed, *args, **kwargs): print(fixed) print(args) print(kwargs) argMixed('11','22','33',entree='chikin', drink='beer')
Docstring
関数の中にドキュメントを書く。
def something(param1, param2): """ This is example. Args: Returns: """
help(something) または、
something.__doc__ で参照可能。
関数内関数
中に入れるだけ
クロージャー
その場では実行せず、戻り値として関数内関数を返して後で使う。
外側の関数の引数が、内側の関数で保持されるので、設定値などをいちいち渡す必要がなくなる。
変数の束縛、binding
def closuer(msg): def inner(name): return f'{msg},{name}' return inner cl1 = closuer('hello') cl2 = closuer('bye') cl1('brad') cl2('jack')
デコレータ
内部で渡された別の関数を実行するような関数。
関数の実行前後になにかするなど。
関数の上に@でデコレータ関数を指定する。複数指定も可能。
def printinfo(func): def wrapper(*args, **kwargs): print('start') result = func(*args, **kwargs) print('end') return result return wrapper @printinfo def add2(a, b): return a + b デコレータに引数を渡せる @route('/hello') def printinfo(deco_param): def decorator(func): def wrapper(*args, **kwargs):
ラムダ
lambda 引数:戻り値 で関数をかける。
無駄な関数を作らずに住む
# def samplefunc(word): # return word.capitalize() # 上記の関数をラムダで表現 samplefunc = lambda word: word.capitalize() weekd= ['mon','tue','wed'] def changewords(words, func): for word in words: print(func(word))
ジェネレーター
関数の中にyeildを設定して値を追加
next()が呼ばれるたびにyeildが計算され取り出される。
yeildが全部呼ばれるとエラーが返る。
def greeting(): yield 'Good morning' yield 'Good afternoon' yield 'Good night g = greeting() print(next(g)) print(next(g)) print(next(g))