python - Python - 返回一个函数对象是什么意思?
问题描述
我正在尝试了解 Python 中的装饰器。我已经从 SO 上的各种答案[ex]中了解了它们的用途:在修饰函数之前和/或之后运行代码而不修改函数本身。也就是说,我无法理解返回函数对象的含义。
返回函数的返回值和返回函数对象有什么区别?我知道返回了对函数本身的引用,但是这种行为的用处是什么?
我没有使用@Decorator
下面的语法,因为我还在学习。
例如:
def some_func():
print('returning 1')
return 1
def Decorator(func):
def Wrapper():
print('doing something first')
val = func()
print('doing something after')
return val
return Wrapper
Decorated_func = Decorator(some_func)
Decorated_func()
在 PythonTutor 中逐步执行此操作:调用 Decorated_func() 显示Wrapper
返回值为1
并且Decorator
返回值为Wrapper
。这是否意味着Decorator
实际上有一个1
何时Decorated_func()
被调用的返回值?我原以为该行为的语法是 (within Decorator
) return Wrapper()
。返回函数对象有什么意义?
解决方案
当你返回一个函数时,调用者可以使用不同的参数多次调用它,并且每次都可以计算出不同的结果。
如果你返回调用函数的结果,你只是返回一个值,它永远不会改变。而且由于它不是一个函数,你不能用不同的参数调用它。
这是一个更简单的例子:
def adder(x):
def add_x(y):
return x + y
return add_x
add_1 = adder(1)
add_3 = adder(3)
print(add_1(10)) # prints 11
print(add_1(20)) # prints 21
print(add_3(10)) # prints 13
如果您将其更改为 then 之类的内容,return add_x(5)
则adder(1)
只会返回6
,而不是可以使用不同参数调用的函数。
推荐阅读
- python - 我怎样才能让球移动得更快?
- regex - 从文本文件的特定列中提取正则表达式模式,然后执行减法
- javascript - $.each 中的重复参数值
- npm - 当我对代码进行一些更改时,NestJs 中的 npm run start:dev 不会重建
- typescript - 打字稿重复导入“时刻”
- python - NoneType 对象没有属性“写”
- angular - ExpressionChangedAfterItHasBeenCheckedError: Expr 在检查后已更改。上一个值:'ngIf: false'。当前值:'ngIf: true'
- c# - 如何通过单击访问单例变量而不导致 NullReferenceException
- regex - Perl 删除匹配正则表达式的多行
- swift - 什么相当于 Obj.C 的 NSMutableDictionary
在斯威夫特?