Python函数赋值给变量的两种形式:引用与执行的区别
本文深入解析Python中将函数赋值给变量的两种常见形式:直接赋值与调用后赋值。通过对比a=f与a=f(),阐明前者是将函数对象作为引用传递给变量,后者则是执行函数并将返回值赋给变量。结合闭包与装饰器实例,揭示赋值过程中函数执行的副作用,帮助开发者避免常见误区。
前言
本文主要介绍在Python中将函数赋值给变量时需要注意的关键问题,分享相关经验供参考学习。下面直接切入主题,详细解析具体细节。
常见将函数赋值给变量的形式主要有两种,一种是
a=f
另一种是
a=f()
这两种形式在语义和行为上存在显著区别,下面分别进行总结。
1. a=f型:将变量指向函数对象
通过代码验证如下:
>>> f = abs >>> f(-10) 10
这表明变量f现在指向了abs函数本身。直接调用abs()函数与调用变量f()的效果完全相同。这是廖雪峰老师Python教程中的经典案例,此时调用f()和调用abs()在行为上是一致的。
再举一个工厂函数的例子:
def maker(N): def action(X): return X**N return action
这个嵌套函数的外层返回值为内层函数的函数名,注意这里没有括号,有无括号有着本质区别。此时调用外部函数:
f=maker(2)
如上所述,f便指向了action函数,且其限制条件为N=2,可以理解为f是当N等于2时的action函数实例。我们来调用它:
>>> f(3) 9
这证明了f和action函数在功能上是等价的。
2. a=f()型:将f()的返回值赋值给a
这里的a仅仅接收f()的返回值,如果f()没有显式返回值,那么a即被赋值为None。这里值得注意的一点是,在a=f()的执行过程中,f()会实际运行一次,这也是容易忽略的细节,例如:
>>> def add(x,y): z=x+y print(z) >>>a=add(3,4) 7
这里虽然只执行了一条赋值语句,但却输出了结果7,说明在赋值过程中函数add已经被执行了。然而a的值为None,且只能通过print语句才能显示出来。不只是赋值过程函数会执行,写在return语句中也会触发同样的行为。
>>>def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
>>>@log
>>>def now():
print('2015-3-25')
这是廖雪峰老师Python教程装饰器章节的例程。刚开始我以为return func(*args,**kw)这个语句是返回了now()函数(即func函数)的返回值,后来发现now函数没有返回值,即为None,所以其实是这个语句在赋值过程中,
func(*args,**kw)执行了,即函数now的print语句被执行了。
在下面的习题中,一个变形要求是在函数调用的前后打印出'begin call'和'end call'。下面一位网友的程序是这样写的:
def wrapper(*args,**kw): print(t+'begin call') result=func(*args,**kw) print(t+'end call') return result
开始不太理解为什么使用result=func(*args,**kw)这句,后来理解后才明白其实赋值本身并没有实际意义,只是这句话同时使得func函数运行了,所以写成
def wrapper(*args,**kw): print(t+'begin call') func(*args,**kw) print(t+'end call')
结果也是一样的。
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助。如果有疑问大家可以留言交流,谢谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









