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
浙公网安备 33010602011771号