1. LEGB规则
L: local 是局部作用域
E: Enclosed 是嵌套函数的外层函数作用域
G: Global 全局作用域
B:Build-In 内置作用域
变量的使用权重:局部变量 > 外层作用域变量 > 全局变量 > 内置变量
下面代码执行后,x变量的值分别为多少?
def outter():
def innerA():
x = 100
def innerB():
nonlocal x
x = 250
def innerC():
global x
x = 520
x = 880
innerA()
print(f"调用完 innerA() 函数之后,x = {x}")
innerB()
print(f"调用完 innerB() 函数之后,x = {x}")
innerC()
print(f"调用完 innerC() 函数之后,x = {x}")
outter()
print(f"此时此刻,全局变量 x = {x}")
答 :
调用完 innerA() 函数之后,x = 880
调用完 innerB() 函数之后,x = 250
调用完 innerC() 函数之后,x = 250
此时此刻,全局变量 x = 520
2. 设计一个函数,每次调用传入一个参数,并返回所有参数的平均值。
解法1 : 用两个变量 count / value
def make_average():
total = 0
count = 0
def average(value):
# 需要改变外层作用域的变量
nonlocal total,count
total += value
count += 1
res = total / count
print(f"第{count}次调用,平均值等于:{res}")
return average
ave = make_average()
ave(5)
ave(6)
解法2 :把传入的参数存入一个数组中
def make_average():
values = []
def average(value):
values.append(value)
total = sum(values)
res = total / len(values)
print(f"平均值是:{res}")
return average
ave = make_average()
ave(5)
ave(8)
3 设计一个闭包函数,功能是每次调用返回一个斐波那契数列 (当前项的数值 为 前两项数值的和 0,1,1,2,3,5,8,13 .....)
def fib():
# 初始前两位的值
back1 = 0
back2 = 1
count = 0
def func():
nonlocal back1 ,back2 ,count
count += 1
temp = back1
back1 , back2 = back2 , back1 + back2
print(f"调用第{count}次的值{temp}")
return func
f =fib()
f()
f()
f()
f()
f()
f()
输出的值: