在Python中,函数也是对象。所以函数是可以被引用的,也可以作为参数传入函数(想想装饰器),话不多说,上例子。(例子来源于《python核心编程第二版》)
例1.使用别名调用
def foo():
print('in foo()')
bar = foo # 对函数对象新建一个引用
>>>bar()
in foo()
在上述代码中,把foo
赋值给bar
,此时bar
和foo
引用了同一个函数对象,所以可以使用bar()
的形式调用foo()
。此处要注意foo
和foo()
的区别,前者是函数的引用,后者是函数的调用,因此在装饰器中嵌套内返回的是函数的调用,而外层返回的是函数的引用。(此处插入一例)
例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的函数比较灵活,使用时有很多技巧。