python的函数是对象
要理解装饰器,首先,你必须明白,在python中,函数是对象. 这很重要.
简单例子来理解为什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
def shout(word="yes"): return word.capitalize()+"!" print shout() # outputs : 'Yes!' # 作为一个对象,你可以讲函数赋值给另一个对象 scream = shout # 注意到这里我们并没有使用括号:我们不是调用函数,而是将函数'shout'赋给变量'scream' # 这意味着,你可以通过'scream'调用'shout' print scream() # outputs : 'Yes!' # 不仅如此,你可以删除老的名称'shout',但是通过'scream'依旧可以访问原有函数 del shout try: print shout() except NameError, e: print e #outputs: "name 'shout' is not defined" print scream() # outputs: 'Yes!' |
好了,记住这点,我们将会很快用到它.
Python函数另一个有趣的特性是,函数可以被定义在另一个函数里面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def talk(): # 你可以定义一个函数 def whisper(word="yes"): return word.lower()+"..." # ... 并且立刻调用 print whisper() # 每次当你调用"talk", 都会定义"whisper" # 并且在"talk"中被调用 talk() # outputs: # "yes..." #但是在"talk"外部,函数"whisper"不存在! try: print whisper() except NameError, e: print e #outputs : "name 'whisper' is not defined"* |
函数引用
好了,到这里了,接下来是有意思的部分,我们刚才看到 函数是对象,然后:
1.函数可以赋值给一个变量
2.函数可以定义在另一个函数内部
即,这也意味着一个函数可以返回另一个函数:-),让我们来看另一段代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
def getTalk(type="shout"): # 定义函数 def shout(word="yes"): return word.capitalize()+"!" def whisper(word="yes") : return word.lower()+"..."; # 返回函数 if type == "shout": # 没有使用"()", 并不是要调用函数,而是要返回函数对象 return shout else: return whisper # 如何使用? # 将函数返回值赋值给一个变量 talk = getTalk() # 我们可以打印下这个函数对象 print talk #outputs : function shout at 0xb7ea817c> # 这个对象是函数的返回值 print talk() #outputs : Yes! # 不仅如此,你还可以直接使用之 print getTalk("whisper")() #outputs : yes... |
但是稍等,如果你可以返回一个函数,那么你也可以将函数作为参数传递
1 2 3 4 5 6 7 8 |
.
简单例子来理解为什么
好了,记住这点,我们将会很快用到它. Python函数另一个有趣的特性是,函数可以被定义在另一个函数里面
函数引用好了,到这里了,接下来是有意思的部分,我们刚才看到 函数是对象,然后: 1.函数可以赋值给一个变量 2.函数可以定义在另一个函数内部 即,这也意味着一个函数可以返回另一个函数:-),让我们来看另一段代码
但是稍等,如果你可以返回一个函数,那么你也可以将函数作为参数传递
|