本文对Python中的函数做了一个系统的总结。但涉及到的有一些概念并不会具体展开。
前段时间我在学习闭包,而后又接触了装饰器。我在学习装饰器时经常被函数的嵌套搞的晕头转向——不都说Python好学,可这装饰器为啥这么难懂/(ㄒoㄒ)/~~。后来通过了解,我认识到了问题出在函数身上,对于它的某些特性我还是非常陌生。痛定思痛之后我系统的学习了函数,也就有了下面的这篇文章。
plus:如果你还不了解闭包或者装饰器,那么这篇文章也能为你了解它们做个铺垫。
1.第一类对象
说到函数不得不先引出这个概念。
维基百科上的定义是这样的:第一类对象(英语:First-class object)在计算机科学中指可以在执行期创造并作为参数传递给其他函数或存入一个变数的实体。将一个实体变为第一类对象的过程叫做“物件化”(Reification)
定义归定义,看不懂就算了(逃~),下面给出第一类对象的性质,并分别作介绍(介绍完你就清楚了):
第一类对象
- 可以被存入变量或其他结构
- 可以被作为参数传递给其他函数
- 可以被作为函数的返回值
- 可以在执行期创造,而无需完全在设计期全部写出
- 即使没有被系结至某一名称,也可以存在
1.1.可以被存入变量或其他结构
Python中的函数可以被赋值给变量。你可以像使用其他变量一样使用函数。
def f1():
pass
a = f1 # 建立了a对函数f1的一个引用
a()
被引用的函数也可以是内建函数:
b = abs()
函数可以被存放于容器之中,在python中这类容器变量有list,tuple,set,dict。
def f1():
pass
def f2():
pass
a,b = [f1, f2] # 函数f1,f2存在在列表中,并分别被变量a,b引用
1.2.可以被作为参数传递给其他函数
def foo(func):
print("Hello")
func()
def func():
print("world")
foo(func)
Hello
world
1.3.可以被作为函数的返回值
def foo(func):
print("Hello")
return func
def func():
print("world")
foo(func)
Hello
<function __main__.func>
1.4.可以在执行期创造,而无需完全在设计期全部写出
def f1():
x = 1
def f2():
print(x)
return f2
a = f1()
a() # 1
# 函数f1内嵌套了函数f2,当执行f1时,f2才被定义。
1.5.即使没有被系结至某一名称,也可以存在
最典型的例子莫过于lambda函数了。
>>>lambda x:x*x
<function __main__.<lambda>>
a = lambda x:x*x
a(2) # 4
2.函数是第一类对象
你可以发现,上面我举的例子中都是以函数作为例子,没错,在Python中,函数是第一类对象。
如果你接触过C或其他编程语言,你就会发现,Python中的函数拥有这些编程语言所不具有的可作为参数,可作为返回值,可以嵌套等特性。这也解释了为什么Python能够支持像装饰器这样的强大功能。
知道了这些,你再去了解闭包,装饰器,相信就会轻松的多了。