嵌套函数_内部函数_数据隐藏
嵌套函数(内部函数)
在函数内部定义的函数
出了函数就调用不了
# 测试嵌套函数的定义
def outer():
print("outer running...")
def inner01():
print("inner01 running")
inner01()
outer()
inner01() # 此处无法调用
什么时候用嵌套函数
- 封装:数据隐藏(内部函数看不到)
- 贯彻DRY(dont repeat yourself)原则:避免函数内部重复代码
- 闭包❓后面讲
def printChineseName(name, familyName):
print("{0} {1}".format(familyName, name))
def printEnglishName(name, familyName):
print("{0} {1}".format(name, familyName))
# 上面两个可以合并成下面一个
def printName(isChineseName, name, familyName):
if isChineseName:
print("{0}{1}".format(familyName, name))
else:
print("{0} {1}".format(name, familyName))
printName(True, "翠花", "何")
printName(False, "Laura", "Smith")
nonlocal_global
nonlocal 用来声明外层的局部变量
global 用来声明全局变量
操作:
# 测试nonlocal、global 关键字的用法
a = 100
print("a:", a)
def outer():
b = 10
print("outer b:", b)
def inner():
nonlocal b # 声明外部函数的局部变量
print("inner b:", b)
b = 20 # 如果前面不用nonlocal 这里就不能修改
global a # 声明全局变量
a = 1000
inner()
print("outer b after inner:", b)
outer()
print("a after inner:", a)
LEGB规则
Python在查找变量的名字的时候,是按照LEGB的规则查找的:
Local → Enclosed(闭包) → Global → Build-in
Local:函数或类的方法内部
Enclosed:嵌套函数(闭包)
Global:模块中的全局变量
Built in:Python为自己保留的特殊名称
# 测试LEGB
# str = "global str"
def outer():
str = "outer"
def inner():
str = "inner"
print(str)
inner()
outer()
我的小结:就是从自己这个方法内部,逐层向外找变量名,层层向外探索,就好像探索宇宙一样…