函数的学习2
内容概要
- 名称空间
- 名称查找顺序
- 作用域
- global与nonlocal
- 函数的多种用法
- 函数的嵌套
内容详情
名称空间
# 名称空间
名称空间就是变量名和变量值绑定关系的地方
# 名称空间的分类
内置名称空间
python解释器提前定义好的 存放内置函数名
全局名称空间
在py文件编写的代码运行产生的名字都会存到全局名称空间
局部名称空间
函数体代码运行产生的都是局部名称空间 函数的形参、函数内定义的名字
# 存活周期
1.内置名称空间
python解释器运行 产生
python解释器关闭 销毁
2.全局名称空间
py文件开始运行 产生
py文件运行结束 销毁
3.局部名称空间
函数体代码开始运行 产生
函数体代码运行结束 销毁
名称查找顺序
名称空间的加载顺序:内置名称空间->全局名称空间->局部名称空间
名称查找顺序:局部名称空间->全局名称空间->内置名称空间
# 在查找名字的时候 一定要先搞清楚自己在哪个空间
1.如果在局部名称空间
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2.如果在全局名称空间
全局名称空间 >>> 内置名称空间
"""如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过"""
'''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''
作用域
# 作用域就是名称空间能够作用的范围
内置名称空间
程序任意阶段任意位置均可使用(全局有效)
全局名称空间
程序任意阶段任意位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称空间中有效(局部有效)
'''也可以通过一些手段打破规则'''
global与nonlocal
# global关键字:局部修改全局不可变类型
在函数代码体中给全局名称空间的变量名重新赋值只作用于局部名称空间并不能改变全局名称空间的变量 如果想要在局部名称空间中修改全局名称空间中的变量 那么需要使用关键字global申明 global 变量名
'''变量名要在global全局申明后重新赋值 否则报错'''
"""
如果想要在局部修改全局的不可变类型
需要提前加关键字global申明
如果想要在局部修改全局的可变类型
不需要加关键字global申明
"""
nonlocal
"""
局部名称空间嵌套的情况下 内层如果想要修改外层
情况1数据是不可变类型
需要使用关键字nonlocal
情况2数据是可变类型
不需要使用关键字nonlocal
"""
# nonlocal 变量名会从当前函数的外层函数开始一层层去查找变量名,若是一直到最外层函数都找不到,则会报错
函数的多种用法
用法1:函数名可以当做变量名赋值
用法2:函数名还可以当成函数的实参
用法3:函数名还可以当做函数的返回值
用法4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型:列表、元组、字典'''
用法5:定义功能存放区
函数的嵌套
#函数的嵌套调用
def index():
func()
print('from index')
def func():
index()
print('from func')
func()
"""在学习函数的时候 前期一定要细心 死咬概念 定义调用"""
def my_max(a,b):
'''返回两个数中的较大值'''
if a > b:
return a
return b
# print(my_max(100,999))
def many_max(a,b,c,d):
'''返回四个数中的最大值'''
res = my_max(a,b) # 两两先比
res1 = my_max(res,c) # ...
res2 = my_max(res1,d) # ...
...
# 函数的定义
def all_func(cmd):
def register():
print('注册功能')
def login():
print('登录功能')
def transfer():
print('转账功能')
if cmd == '1':
register()
elif cmd == '2':
login()
elif cmd == '3':
transfer()
else:
print('哈哈哈 偷懒了 没有用刚刚的功能字典')
all_func('1')
all_func('2')
"""函数的学习会让我们的代码逻辑更加清晰 更加便于维护"""
![]()