函数(二)
函数(二)
名称空间
# 名称空间的概念
名称空间其实就是存放变量名与变量值绑定关系的地方
# 名称空间的分类
1. 内置名称空间
python解释器提前给我们定义好的,用来存储python内置函数等内置的东西
eg:len(),print(),input()
2. 全局名称空间
在py文件中编写的代码运行产生的名字都会存储到全局名称空间
name = 'petter' # 变量存储到全局名称空间
def func(): # 函数名存储到全局名称空间
pass
for i in range(10): # 变量名i存入全局名称空间
pass
while True:
b = 222 # 变量名b存入全局名称空间
3. 局部名称空间
函数体代码运行产生的都是局部名称空间
def func():
a = 666 # a存入局部名称空间
# 名称空间的存活周期
1. 内置名称空间
python解释器运行--->产生
python解释器关闭--->销毁
2. 全局名称空间
py文件开始运行--->产生
py文件结束运行--->销毁
3. 局部名称空间
函数体代码开始运行--->产生
函数体代码结束运行--->销毁
名字的查找顺序
"""
名称空间是用来存放名字与值绑定关系的地方
那么问题来了 如果我要查找一个名字 到底去哪个名称空间 是否有先后顺序
"""
# 在查找名字的时候,一定要先搞清楚自己在那一层空间
1. 如果在局部名称空间
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2. 如果在全局名称空间
全局名称空间 >>> 内置名称空间
eg:
len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print('函数体输出:'+len)
index() # 调用函数 函数体就会执行 就会产生局部名称空间
print('函数体外输出:'+len)
# 此时,三个名称空间都有len这个名字
运行结果:
函数体输出:我是局部名称空间中的len
函数体外输出:我是全局名称空间中的len
'''
当我们在寻找名字的时候,会优先找本空间的名字,如果本空间没有,则会向上一空间寻找,最上层空间没有则会报错
'''
'''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''
def index1():
name = 'jason'
def index2():
age = 18
print(name) # 报错
index1()
index2()
作用域
# 作用域就是名称空间能作用的范围
内置名称空间
程序任意阶段任意位置均可使用(全局有效)
全局名称空间
程序任意阶段任意位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称空间中有效(局部有效)
'''也可以通过一些手段打破规则'''
global与nonlocal关键字
'''gloabl关键字:局部修改全局不可变类型'''
eg:
# # global关键字
# num = 1
# s = [1,2,3]
# def func1():
# num = 2
# s.append(4)
# func1()
# print(num)
# print(s)
# def func2():
# global num
# num = 2
# s.append(4)
# func2()
# print(num)
# print(s)
运行结果:
1
[1, 2, 3, 4]
2
[1, 2, 3, 4, 4]
"""
如果想要在局部名称空间修改全局名称空间的不可变类型
需要提前对变量使用关键字global申明
如果想要在局部名称空间修改全局名称空间的可变类型
不需要申明,直接改就OK
"""
eg:
# # nonlocal使用
# def func1():
# x = 1
# y = 1
# s1 = [1,2,3]
# def func2():
# x = 2
# nonlocal y
# y = 2
# s1.append(4)
# func2()
# print(x,y,s1)
# func1()
运行结果:
1 2 [1, 2, 3, 4]
"""
在局部名称空间嵌套的情况下 内层修改外层不可变类型
必须要要先用关键字nonlocal申明
如果是可变类型
不需要申明
"""
局部改全局 | 局部内层改外层 | |
---|---|---|
不可变类型 | global申明 | nonlocal申明 |
可变类型 | 无需申明 | 无需申明 |
函数名的多种用法
# # 用法一:函数名给变量名赋值
# def func():
# return 1
# num = func() # 把func函数的返回值赋值给num
# print(num)
# >>>1
==========================================================
# # 用法二:函数名当做函数的实参
# def func(a):
# print(a)
# def func1():
# return 1
# func(func1()) # 把func1函数当做实参传给func,传递的实际是func1的返回值
# >>>1
==========================================================
# # 用法三:函数名当返回值
# def func():
# return func1() # 实际就是把func1的返回值当做func的返回值
# def func1():
# return 1
# print(func())
# >>>1
==========================================================
# # 用法四:函数名可以作为容器类型的元素
# def login():
# print('执行登录功能')
# def register():
# print('执行注册功能')
# function_dict = {'1':login,'2':register}
# function_dict.get('1')()
# function_dict.get('2')()
# >>>执行登录功能
# >>>执行注册功能
"""此方法可以在功能比较多的地方使用,能大大简化判断逻辑"""
函数的嵌套
# # 函数的嵌套调用
# # 比较多个数的大小
# def my_max(a,b):
# if a > b:
# return a
# else:
# return b
# def my_max_plus(*args):
# max = 0
# for i in args:
# max = my_max(max,i) # 调用my_max函数进行max和参数比较,把大的给max
# return max
# print(my_max_plus(1, 5, 9, 2, 87, 25, 5, 14, 5, 47))
# >>>87
# # 函数的定义
# def all_func(chiose):
# def login():
# print('执行登录功能')
# def register():
# print('执行注册功能')
# if chiose == '1':
# login()
# elif chiose == '2':
# register()
# all_func('1')
# all_func('2')
# >>>执行登录功能
# >>>执行注册功能
"""
函数的学习会让我们的代码逻辑更加清晰 更加便于维护
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人