2016-10-11 5 views
-1

これは私のコードです:funcとは何ですか?それはどこから来たの?

def testit(func, *nkwargs, **kwargs): 
    try: 
     retval = func(*nkwargs, **kwargs) 
     result = (True, retval) 
    except Exception, diag: 
     result = (False, str(diag)) 
    return result 

def test(): 
    funcs = (int, long, float) 
    vals = (1234, 12.34, '1234', '12.34') 

    for eachFunc in funcs: 
     print '-' * 20 
     for eachVal in vals: 
      retval = testit(eachFunc, eachVal) 
      if retval[0]: 
       print '%s(%s) =' % \ 
        (eachFunc.__name__, `eachVal`), retval[1] 
      else: 
       print '%s(%s) = FAILED:' % \ 
        (eachFunc.__name__, `eachVal`), retval[1] 

if __name__ == '__main__': 
    test() 

3行目のfuncの機能は何ですか。私はそれが変数だと思う。どのように関数名になりましたか?

+1

Pythonでは、関数は一流の市民です。つまり、それらを通常の変数として使用して関数に渡すことができます。 – Axnyff

答えて

0

Python関数はファーストクラスのオブジェクトです。これは、そのようなオブジェクトを変数に割り当てて、それを別の関数に渡すことができることを意味します。

>>> def foo(): return 42 
... 
>>> foo 
<function foo at 0x107e9f0d0> 
>>> bar = foo 
>>> bar 
<function foo at 0x107e9f0d0> 
>>> bar() 
42 

funcs = (int, long, float) 

は3組み込み関数を取り、タプルにそれらを置くように、発現:def functionname(): ...文を実行するという行為は、名前(ここではfunctionname)にそのようなオブジェクトを割り当てます。 funcs[0]('10')funcs[0]int()関数の別の参照であるため、整数オブジェクト10を返します。funcs[0]('10')int('10')とまったく同じ結果を返します。だから、eachFuncが関数にバインドされている

for eachFunc in funcs: 
    print '-' * 20 
    for eachVal in vals: 
     retval = testit(eachFunc, eachVal) 

は、オブジェクトをそのfuncsタプルの参照、一つずつ:

これらの関数オブジェクトは、ループにtestit()関数に渡されます。

testit()は、funcパラメータとしてその関数オブジェクトを受け取り、それを呼び出す:

def testit(func, *nkwargs, **kwargs): 
    try: 
     retval = func(*nkwargs, **kwargs) 

ので、これはvaluesタプルから、様々な検査値にint()long()float()を呼び出します。

関連する問題