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()