函数的嵌套
定义
函数内部定义的函数,无法在函数外部使用内部定义的函数
def f1():
def f2():
print('from f2')
f2()
f2()
def f1():
def f2():
print('from f2')
f1()
from f2
圆的面积周长
from math import pi
def circle(radius,action='area'):
def area():
return pi*(radius**2)
def perimeter():
return 2*pi*radius
if action=='area':
return area()
else:
return perimeter()
print(f'circle(10):{circle(10)}')
print(f"circle(10,action='perimeter'): {circle(10,action='perimeter')}")
名称空间与作用域
定义
内存中有一块内存存储变量名与变量间绑定关系的空间,称为名称空间
内置名称空间
存放python解释器自带的名字
生命周期:解释器启动时生效,关闭失效
全局名称空间
处内置与局部的名字之外,其余都存放在全局名称空间
局部名称空间
用于存放函数调用期间函数体产生的名字
生命周期:函数调用期间生效,函数执行结束后失效
def f1():
def f2():
print('from f2')
f2()
f1()
加载顺序
内置-全局-局部
查找顺序
当为局部名称空间:局部-全局- 内置
x = 1
y = 2
len = 100
def func():
y = 3
len = 1000
print(f"y: {y}")
print(f"len: {len}")
# print(a) # NameError: name 'a' is not defined
func()
y: 3
len: 1000
x = 1
def func():
print(x)
x = 10
func()
10
作用域
域指的是区域,作用域即作用区域
全局作用域
全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。
x = 1
def bar():
print(x)
bar()
1
局部作用域
局部作用域:局部有小,临时存储,只包含局部名称空间
def f1():
def f2():
def f3():
print(x)
x = 2
f3()
f2()
f1()
2
注意:作用域关系在函数定义阶段就固定死了,与函数的调用无关
# 作用域注意点
x = 1
def f1(): # 定义阶段x=1
print(x)
def f2():
x = 2
f1()
f2()
1
补充:global:修改全局作用域中的变量
nonlocal修该局部作用域中的变量
x = 1
def f1():
x = 2
def f2():
# nonlocal x
x = 3
f2()
print(x)
f1()
2
x = 1
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x)
f1()
3
注意:
在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。