python基础(15)函数之函数的作用域以及闭包

3,函数的作用域

1,全局变量

python代码是从上到下,从左到右一行行执行

那么写在函数上面的全局变量也是可以用的

>>> data = "hello world"
>>> def func():
print(data)

>>> func()
hello world
# 注意print一个没有的变量会报错,等同于

>>> def func():
print(data)

>>> data = "hello world"
>>> func()
hello world

# 两段代码在这里没有什么区别,
# 同样的先执行函数func,不存在变量data,会报错

这里的data是全局变量,可以使用不可修改

>>> data = "hello world"
>>> def func():
print(data)
data = 1111
print(data)

>>> func()
Traceback (most recent call last):
 File "<pyshell#24>", line 1, in <module>
   func()
 File "<pyshell#23>", line 2, in func
   print(data)
UnboundLocalError: local variable 'data' referenced before assignment
   
>>> def func():
data = 1111
print(data)

>>> func()
1111
# 在这里没有使用全局变量data,而是在函数内部给data赋值,优先使用函数内部的data。
# 函数结束后,data依旧等于原来值
>>> data
'hello world'

为了区别全局变量与函数内部变量,全局变量应该大写

DATA = "hello world"

2,global

理论上无法修改的全局变量,但在写代码时会有不得不修改的时候,这就要用到global

>>> def func():
global data
print(data)
data = 1111
print(data)

>>> func()
hello world
1111
# 记得在使用全局变量之前声明一下

3,函数的嵌套

>>> def outer():
print("hello")

>>> def inner():
outer()
print("world")

>>> inner()
hello
world
# 1. 在全局作用域定义了函数func
>>> def func():
      print("hello")

# 2. 在全局作用域找到func函数并执行。
>>> func()


# 3.在全局作用域定义了execute函数
>>> def execute():
       print("start")
       # 优先在当前函数作用域找func函数,没有则向上级作用域中寻找。
       func()
       print("end")

# 4.在全局作用域执行execute函数
>>> execute()
start
hello
end
>>> data = "hello world"
>>> def outer():
data = "111222"
def inner():
print(data)
return inner

>>> v1 = outer()
>>> v1()
111222
>>> v2 = outer()
>>> v2()
111222
>>> data = "hello world"
>>> def outer():
data = "111222"
def inner():
print(data)
return [inner,inner,inner]

>>> func_list = outer()
>>> func_list[2]()
111222
>>> func_list[1]()
111222
  • 优先在自己的作用域找,自己没有就去上级作用域。

  • 在作用域中寻找值时,要确保此次此刻值是什么。

  • 分析函数的执行,并确定函数作用域链。(函数嵌套)

4,闭包

闭包,简而言之就是将数据封装在一个包(区域)中,使用时再去里面取。(本质上 闭包是基于函数嵌套搞出来一个中特殊嵌套)

  • 封装数据防止污染全局

>>> data = "hello world"
>>> def f1():
print(data)
>>> def f2():
print(data)
>>> def f3():
print(data)
  • 封装数据封到一个包里,使用时在取。

>>> def task(arg):
def inner():
print(arg)
return inner

>>> v1 = task(11)
>>> v2 = task(22)
>>> v3 = task(33)
>>> v1
<function task.<locals>.inner at 0x02CFB2F8>
>>> v2
<function task.<locals>.inner at 0x02CE9FA0>
>>> v3
<function task.<locals>.inner at 0x02CFB0B8>
>>> v1()
11
>>> v2()
22
>>> v3()
33
>>> def task(arg):
def inner():
print(arg)
return inner

>>> inner_func_list = []
>>> for val in [11,22,33]:
inner_func_list.append(task(val))

>>> inner_func_list[0]
<function task.<locals>.inner at 0x02CFB028>
>>> inner_func_list[0]()
11
>>> inner_func_list[1]
<function task.<locals>.inner at 0x02CFB340>
>>> inner_func_list[1]()
22
>>> inner_func_list[2]
<function task.<locals>.inner at 0x02CFB388>
>>> inner_func_list[2]()
33

 

posted @ 2021-10-31 20:42  下个ID见  阅读(10)  评论(0)    收藏  举报