sailan
- 一、函数对象
- 1、函数对象简单解析
- 二、闭包函数
- 1、什么是闭包函数
- 2、为何要有闭包函数
一、函数对象
1、函数对象简单解析
指的是函数可以被当做’数据’来处理,在python中定义个最简单的函数如下:
def func():
print('我真帅')
func()
当代码执行遇到def以后,会现在内存中生成一个函数对象,这个函数对象被定义为这个函数的名字。当我们调用函数时就要指定函数的名字,通过函数名才能找到这个函数地址。 函数的代码段在定义时是不会执行的,只有当这个函数被调用时,函数内部的代码段才会被执行。 函数调用结束时,这个函数内部生成的所有数据都会被销毁。
函数可以作为对象可以赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的返回值被引用,具体可以分为四个方面的使用,如下;
# 1.1 函数可以被引用
>>> def add(x,y):
... return x+y
...
>>> func=add
>>> func(1,2)
3
# 1.2 函数可以作为容器类型的元素
>>> dic={'add':add,'max':max}
>>> dic
{'add': <function add at 0x100661e18>, 'max': <built-in function max>}
>>> dic['add'](1,2)
3
# 1.3 函数可以作为参数传入另外一个函数>>> def foo(x,y,func):
... return func(x,y)
...
>>> foo(1,2,add)
3
# 1.4 函数的返回值可以是一个函数def bar():
return add
func=bar()
func(1,2)
3
二、闭包函数
闭包函数是名称空间+作用域+函数嵌套以及函数对象的综合应用。
核心: 名字的查找关系以函数定义阶段为准。
1、什么是闭包函数
"闭"函数指的该函数是内嵌函数;
"包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)。
基于函数对象的概念,可以将函数返回到任意位置去调用,但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。
x=1
def f1():
def f2():
print(x)
return f2 # 可以通过此功能将内嵌函数地址返回,可以拿到全局作用域去用,只是打破了调用位置的限制,作# 用域关系无论从哪调用都回到定义时为准。
def f3():
x=3
f2=f1() #调用f1()返回函数f2
f2() #需要按照函数定义时的作用关系去执行,与调用位置无关
f3() #结果为1
也就是说函数被当做数据处理时,始终以自带的作用域为准。若内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用,那么该’内嵌函数’就是闭包函数,简称闭包(Closures)
x=1
def outer():
x=2
def inner():
print(x)
return inner
func=outer()
func() # 结果为2
2、为何要有闭包函数
闭包函数的应用
# 两种为函数体传参的方式
# 方式一:直接把函数体需要的参数定义成形参
# 方式二、
```python
def f1(x): # x=3
x=3
def f2():
print(x)
return f2
x=f1(3)
print(x)
x()