这里有什么功能?它从哪里来的?

时间:2016-10-11 12:24:20

标签: python function

这是我的代码:

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

第三行中func的功能是什么?我认为这是一个变量。它是如何成为一个功能名称?

1 个答案:

答案 0 :(得分:0)

Python函数是第一类对象。这意味着您可以将这样的对象分配给变量并将其传递给另一个函数。执行def functionname(): ...语句的行为将此类对象分配给名称(此处为functionname):

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

所以表达式

funcs = (int, long, float)

需要3个内置函数并将它们放入元组中。 funcs[0]('10')将返回整数对象10,因为funcs[0]是对int()函数的另一个引用,因此funcs[0]('10')会给出与{{完全相同的结果1}}。

这些函数对象在循环中传递给int('10')函数:

testit()

因此 for eachFunc in funcs: print '-' * 20 for eachVal in vals: retval = testit(eachFunc, eachVal) 被绑定到eachFunc元组逐个引用的函数对象。

funcs将该函数对象作为testit()参数,然后调用它:

func

所以这会从def testit(func, *nkwargs, **kwargs): try: retval = func(*nkwargs, **kwargs) 元组中调用int()long()float()各种测试值。