Python对于将函数作为参数传递给另一个函数调用是非常方便的,只要你在函数中将调用的参数按照函数处理进行调用,这种操作就能顺利完成。如:
def S(n):
sum=0
for i in range(n): sum+=i
return sum
def P(f):
a=eval(input('输入一个数'))
print('数的累加为:'f(a))
运行P(S),即能够从键盘获得输入并打印出结果。这里将函数S作为参数传递给P是非常方便的。而在P中,之所以将参数f认为是函数,则是因为对它的使用是按照函数进行的。
在Python中,修饰器是C++等其它语言中没有的新特性,通过修饰器的定义,可以对一个对象在其外部通过修饰器对其进行修改,而不用修改这个对象本身。如下:
def myDec(f): #定义一个函数,该函数以另一个函数f作为参数
if(f()>=5): lambda:return f()*2
else: return lambda:f()
@myDec #定义一个下面的Hello对象的myDec修饰器
def Hello():
return eval(input('输入一个数'))
在上面的例子中首先定义了一个函数myDec,函数接收一个函数参数。该函数就可以被修饰器作用用来修饰其它函数对象了。
下面定义了一个函数Hello,该函数将myDec作为修饰器。当修饰器定义完成后,Python解释器会自动调用函数Hello并将修饰器作用于Hello,即相当于进行了如下表达式的函数调用:
Hello=myDec(Hello)
其结果是把函数myDec中的效果施加在了函数Hello之上。在本例中,如果用户输入的数大于等于5,最后形成的Hello函数实际上是对原Hello函数乘以2,否则就是原Hello函数,从而在没有修改Hello的基础上完成了对Hello的修改或者修饰。
通过这个例子我们可以注意有以下几个要点:
- 对被修饰对象的修改和修饰是由修饰器函数完成的(本例中的myDec),该函数由于要对被修饰对象进行修饰,所以应该首先定义,并接收一个被修饰对象参数,以便完成对该对象的修饰;
- 如例子中所表达的,修饰器实际完成的是被修饰对象通过修饰函数进行修饰的操作,即如例子的Hello=myDec(Hello),所以修饰函数的返回值最终将作用于被修饰对象。所以从逻辑上讲,修饰器函数应该返回与被修饰对象相同的对象,如例子中通过无名函数返回的依然是相类似的函数。当然,理论上讲,修饰器函数完全可以返回其它任何类型的对象,当然这样的结果实际上就完全修改了被修饰对象,所以一般不要这么做,以免发生不可预料的结果;
- 修饰器只在定义完成后立即执行,所以其修饰作用会立刻发生,之后只要没有重新运行修饰器定义,该作用会保持不变。如例子中函数Hello从键盘接收并返回一个输入。当修饰器定义完成后,Python编辑器会立即运行修饰器,并通过修饰函数调用被修饰函数Hello,要求用户提供一个输入。这时如果用户输入大于等于5,这时Hello函数会被修饰为返回2*用户输入的值,之后如果再次运行函数Hello,不管用户输入是否大于等于5,都会返回2*用户输入值了。