PUROGU LADESU

ポエムがメインのブログです。

速習Python:関数

関数

使う前に定義する。
引数の数が違うとエラー。(明示すれば可変長にできる)

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))