python学習の伝達関数


Pythonでは、関数もオブジェクトです.だから関数は引用されることができて、パラメータとして関数に入ることができて(装飾器を考えてみて)、話は多くなくて、前の例.(例は『pythonコアプログラミング第2版』)例1.エイリアス呼び出しの使用
def foo():
    print('in foo()')

bar = foo    #            

>>>bar()
in foo()

上記コードでは、foobarに割り当て、このときbarfooは同じ関数オブジェクトを参照するので、bar()の形式でfoo()を呼び出すことができる.ここでは、foofoo()の違いに注意してください.前者は関数の参照であり、後者は関数の呼び出しであるため、装飾器にネストされた内部では関数の呼び出しが返され、外側では関数の参照が返されます.例2.装飾器の内外層の戻り値の違い
def dec(func):
    def wrapper(*args,**kwargs):
        do something...
        return func(*args,**kwargs)    #        ,         
    return wrapper

上記の例では、内層が関数の呼び出しを返すので、装飾器機能を実現した後に被装飾関数の呼び出しを完了することができ、内層がfuncを返すと、被装飾関数は呼び出されない.本題に戻ると、関数はパラメータとして他の関数に呼び出すことができます:例3.関数を他の関数のパラメータとして使用
def bar(argfunc):
    argfunc()

>>>bar(foo)
in foo()

上記の例では、foo()関数の参照をパラメータとしてbar()に入力し、foo()の機能を実現することに成功した.実際の例を見てみましょう.例4.関数の転送と呼び出し
def convert(func,seq):
    'conv. sequence of numbers to same type'
    return [func(eachNum) for eachNum in seq]

myseq = (123,45.67,-6.2e8,999999999L)
print (convert(int,myseq))    # [123,45,-62000000,999999999]
print (convert(long,myseq))   # [123L,45L,-62000000L,999999999L]
print (convert(float,myseq))  # [123.0,45.67,-62000000.0,999999999.0]

総じてpythonの関数は柔軟で、多くのテクニックがあります.