1.函数嵌套
一个函数包含另一个函数
嵌套调用
在函数执行中调用另一个函数
def max(a,b):
if a> b:
return a
return b
def max2(a,b,c):
tmp=max(a,b)
tmp2=max(tmp,c)
return tmp2
print(max2(1,2,3))
嵌套定义
在函数体中定义另一个函数
def func1():
print("1 run")
def func2():
print("2 run")
func2()
func1()
需要注意内部定义的函数只能在内部使用
名称空间
存储名字和内存地址捆绑关系的内存区域
内置名称空间 存解释器自带名称,解释器启动后生效
全局名称空间 顶头写的没有缩进的 就在全局名称空间 在所有位置都能访问
注意 在if中 if是顶头写的 if里的名字也是全局 while for一样
if 1==1:
age =1
print(age)
局部名称空间 函数内定义的名字 只在调用时生效 函数调用结束而失效
def func1():
a=100
print(a)
func1()
print(a)
名称的查找顺序:局部>全局>内部
名称的加载顺序:内部,全局,局部
作用域:
作用区域,作用范围,名称的作用范围
globa 但需要在函数中修改全局名字时 需要使用
a=100
def fun():
global a
a=1
fun()
print(a)
nonlocal 函数嵌套定义中更改外层名称
def aq():
a=1
def f2():
nonlocal a
a=2
f2()
print(a)
aq()
a=False
def login(c,d):
global a
if c == "apple" and d =="123":
print("success")
a=True
login("apple","123")
print(a)
函数不加括号时可以被当作参数 元素 加上括号是调用
def f3():
def inner():
print("inner")
return inner
res=f3()
print(res)
res()
闭包函数
一个函数将另一个函数关闭在内部
函数对象可以将一个函数作为返回值 使内部函数也可以被外部使用
需要注意名字所在的作用域在函数定义时已被固定 与位置无关
特点:1.该函数时定义在另一个函数中的
2.该函数包含了外层函数的名字引用
def outer():
name="apple"
def inner():
a=100
print("inner",a)
print("inner",name)
return inner
res=outer()
res()