ジェネレータ・デコレータ

  • python

ジェネレータ関数

  • yieldの部分で処理がストップ
  • yieldの後に記載された値が呼び出し元に返される
  • 再度ジェネレータ関数を呼び出すとyieldからスタート
  • プログラムが終了するまで何度もジェネレータ関数を呼び出せる

独自メソッド

  • send() yieldで停止している箇所に値を送る   受け取る変数が必要
    x = yield n
  • throw() 指定した例外を発生させ処理を終了させる
  • close() ジェネレータを正常終了させる

サブジェネレータ

  • yield from サブジェネレータの呼び出し
  • return 呼び出し元に値を返す
  • yield 処理を停止してメインに値を返す
def sub_sub_gen():
    yield 'sub sub yield'
    return 'sub sub return'
def sub_gen():
    yield 'sub yield'
    res = yield from sub_sub_gen()
    print(f'Print{res}')
    return 'sub return'
def gen():
    yield 'gen yield'
    res = yield from sub_gen()
    print(f'Print{res}')
    return 'gen return'
gen = gen()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

'''実行 結果
gen yield
sub yield
sub sub yield
Printsub sub return
Printsub return
'''

メモリを圧迫しない

def bignum(s, b):
    number = s
    while number < b:
        yield number
        number += 1

for i in bignum(1, 10000000):
    print(i)

デコレータ

関数間である処理を共通で利用したい場合など
関数オブジェクトを引数にとって、引数にとった関数、実行時に変更を加える

  • 関数を関数の引数として受け取れる
  • 関数を返す関数を作成できる
  • 関数を変数に代入できる
def my_dec(func): 
   def wrap(*args, **kwargs):
       print('*'*10)
       func(*args, **kwargs)
       print('*'*10)
   return wrap

@my_dec
def func_a(*args, **kwargs):
    print('func_a実行')
    print(args)

@my_dec
def func_b(*args, **kwargs):
    print('func_b実行')
    print(args)

func_a(1,2,3)
func_b(5,6,7)

'''結果
**********
func_a実行
(1, 2, 3)
**********
**********
func_b実行
(5, 6, 7)
**********
'''

Home