Python之函数2 嵌套,作用域和闭包(Day12)

时间:2021-03-18 22:45:46

一.函数对象

1.函数是第一类对象,即函数可以当做数据传递

  1.1 可以被引用

  1.2 可以当做参数传递

  1.3 返回值可以是函数

  1.4 可以当做容器类型的元素

二.函数的嵌套

1.函数嵌套的调用:

 

def f1():
print('f1')

def f2():
a
= 10
f1()

 

函数的嵌套,为了保护内部函数,确定内部函数只能在外部函数中被调用

def animal():
def tiger():
print('bark')
print('eat')
tiger()
# animal()

2.函数名的本质

Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
def func():
print('func')
print(func)
print(func)
f
= func
print(f)
f()
View Code

2.1 可以作为函数的参数

def func():
print('func')
def func2(f):
print(f)
f()
print('func2')

2.2 可以作为函数的返回值

def func():
print('func')

def func2(f):
print('func2')
return f

fu
= func2(func)

三.命名空间和作用域

3.1.命名空间:存放名字和值的地方

3.2.命名空间可分为三种

  全局命名空间

  局部命名空间

  内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

3.3三种命名空间的加载与取值顺序

   加载

  内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

  取值

  在局部调用:局部命名空间> 全局命名空间 > 内置命名空间

 

Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
x = 1
def f(x):
print(x)

print(10
View Code

 

   在全局调用:全局命名空间 > 内置命名空间

 

Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
x = 1
def f(x):
print(x)

f(
10)
print(x)
View Code

 

作用域

 

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

 

  全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

 

  局部作用域:局部名称空间,只能在局部范围内生效

作用域的说明

*小范围的可以用大范围的
*但是大范围的不能用小范围的
*范围从大到小(图)
*在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
*如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
*如果都没有,报错

 

 

globals 和 locals方法

Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
print(globals())
print(locals())
在全局调用globals和locals
Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
def func():
a
= 12
b
= 20
print(locals())
print(globals())

func()
在局部调用globals和locals

作用域链

x = 1
def heihei():
def inner1():
def inner2():
print(x)
inner2()
inner1()

四.闭包

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数    即内部函数包含了对外部作用域中变量的引用

Python之函数2  嵌套,作用域和闭包(Day12)Python之函数2  嵌套,作用域和闭包(Day12)
def hei():
x
= 20
def inner():
print(x) #局部的
return inner
闭包的常用形式

 

本章小结

命名空间:

  一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间

作用域(包括函数的作用域链):

小范围的可以用大范围的
但是大范围的不能用小范围的
范围从大到小(图)

Python之函数2  嵌套,作用域和闭包(Day12)

 
在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
如果都没有,报错

函数的嵌套:

  嵌套调用

  嵌套定义:定义在内部的函数无法直接在全局被调用

函数名的本质:

  就是一个变量,保存了函数所在的内存地址

闭包:

  内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数