ロゴ

プログラミング初心者がアプリ開発を目指すブログ

【Python入門】関数オブジェクト デコレーター スコープ- Python初心者勉強記023

関数オブジェクト

Pythonでは関数をオブジェクトとして利用することができます。関数を宣言すると、その関数名の変数に、関数オブジェクトが代入されます。
これにより、関数を関数の引数として利用することもできます。


>>> def square(x):
...     return x * x
... 
>>> def distance(x, y, func):
...     return func(x-y)
... 
>>> distance(3,1,square) #squareを引数として使用
4

さらに、関数のなかに関数を定義することも可能です。


>>> def func():
...     def in_func():
...             pass
...     print(in_func)
... 
>>> func()


デコレーター

デコレーターは関数を修飾する機能です。複数の関数に共通する補助機能を作りたいときに利用します。

基本文法

基本的に、デコレーターはcます。
修飾したい関数の定義の前に「@デコレーター関数」と書くことで、関数が修飾されます。


>>> def decorate(f):
...     f.x=1
...     return f
... 
>>> @decorate
... def func():
...     pass
... 
>>> func.x
1

この例では、
decorateという名前のデコレーター用関数を定義しています。
関数は受け取った関数に、属性xを定義して、そのxに1を代入しています。
その後、@decorateとして、func関数を定義しているので、
decorete関数の機能が働いて、func関数の属性xに1が代入されています。

一般的にはデコレーター関数内で新たな関数を定義して使用することが多いです。


>>> def add1(f):
...     def new_f(*args,**kwds):
...             result = f(*args,**kwds)
...             return result + 1
...     return new_f
... 
>>> @add1
... def func():
...     return 3
... 
>>> func()
4

この例では、修飾した関数の戻り値に1を足すというデコレーター関数add1を作成しています。

引数付きデコレーターの作成

デコレーターに引数を指定したい場合は、引数を受ける関数を書いてその中で、「関数を受け取り、修飾した関数を返す関数」を書きます。


>>> def add(x):
...     def _add(f):
...             def new_f(*args,**kwds):
...                     result =f(*args,**kwds)
...                     return result + x
...             return new_f
...     return _add
... 
>>> @add(3)
... def func():
...     return 3
... 
>>> func()
6

時間計測デコレーター

デコレーターがよく用いられる例として、時間計測や引数の型チェックなどがあります。
ここでは、時間計測デコレーターを書いてみます。


>>> def timing(f):
...     import time
...     def new_f(*args,**kwds):
...             start_t=time.time()#時間を計る
...             result=f(*args,**kwds)
...             print('%s: %s s'%(f.func_name,time.time()-start_t))#f.func_nameで関数名を取り出せる。
...             return result
...     return new_f
... 
>>> @timing
... def stop1():
...     import time
...     time.sleep(1)#1秒待つ
... 
>>> stop1()
stop1: 1.00222206116 s

スコープについて

スコープとは、変数の利用可能範囲のことです。例えば、関数内で定義した変数は、その関数外では参照することができません。
関数内で参照のみされる変数は暗黙のうちにグローバル変数となり、関数内のどこかで値が変数に代入された場合はローカル変数として扱われます。


>>> GLOBAL_X=1
>>> def func():
...     print(GLOBAL_X)#グローバル変数の参照
... 
>>> func()
1
>>> GLOBAL_X=1
>>> def func():
...     GLOBAL_X=2#普通に代入するとローカル変数扱いになる
... 
>>> func()
>>> GLOBAL_X#値は変更されない
1

関数内でグローバル変数に値を代入するには「global」を使って、代入したグローバル変数を明示的に指定します。


>>> GLOBAL_X=1
>>> def func():
...     global GLOBAL_X #グローバル変数の操作が可能になる
...     GLOBAL_X=2
... 
>>> func()
>>> GLOBAL_X#値が変更されている
2

Python入門講座の次の記事はこちら => 【Python入門】クラスの基本 インスタンス- Python初心者勉強記024

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA