#python #function
#python #функция
Вопрос:
Это мой код:
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. В python функции являются гражданами первого класса, это означает, что вы можете использовать их как обычные переменные и передавать их в function.
Ответ №1:
Функции 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')
даст вам точно такой же результат, как int('10')
.
Эти функциональные объекты передаются testit()
функции в цикле с:
for eachFunc in funcs:
print '-' * 20
for eachVal in vals:
retval = testit(eachFunc, eachVal)
So eachFunc
привязан к объектам функции, на которые funcs
ссылается кортеж, один за другим.
testit()
принимает этот объект функции в качестве func
параметра, затем вызывает его:
def testit(func, *nkwargs, **kwargs):
try:
retval = func(*nkwargs, **kwargs)
итак, это вызывает int()
long()
float()
различные тестовые значения из values
кортежа.