Welcome!!!

F

伞兵一号,申请出战

函数(二)

函数(二)

名称空间

# 名称空间的概念
	名称空间其实就是存放变量名与变量值绑定关系的地方
# 名称空间的分类
	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')
# >>>执行登录功能
# >>>执行注册功能
"""
函数的学习会让我们的代码逻辑更加清晰 更加便于维护
"""

posted @   程序猿伞兵一号  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示