名称与作用域

名称空间

1.名称空间
	其实就是存放变量名与变量绑定关系的地方 类似于民政局、警察局
2.名称空间的分类
	内置名称空间
    1.python解释器提前给我们定义好的
    	len() print() open()
    2.全局空间
    	在py文件中编写的代码运行产生的名字都会存到全局称空间name = 'jason' # 变量名name存入全局名称空间
def index(): # 函数名index存入全局名称空间
    pass
if True:
    a = 111  # 变量名a存入全局名称空间
    3.局部名称空间
    函数体代码运行产生的都是局部名称空间
    def index():
        name = 'jason'  # name存入局名称空间
2.存活周期
	1.内置名称空间
    python解释器运行 产生
    python解释器关闭 销毁
    2.全局名称空间
    py文件开始运行 产生
    py文件运行结束 销毁
    3.局部名称空间
    函数体代码开始运行 产生
    函数体代码运行结束 销毁

名字的查找顺序

"""
名称空间是用来存放名字与值绑定关系的地方
查询方法 先后顺序
"""
1.如果在局部名称空间
	局部名称空间>>全局名称空间>>内置名称空间
2.如果在全局空间
	全局名称空间>>内置名称空间
len = '全局空间的len'
def index():
    len = '局部空间'
    print(len)
index()
print(len)
"""如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过"""
def f1():
    x = 1
    def f2():
        x = 2
        def f3():
        	x = 3
            print(x)
         f3()
    f2()
f1()
'''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''
def index1():
    name = 'jason'
def index2():
    age = 18
    print(name)  # 报错
index1()
index2()

作用域

1.作用域就是名称空间能够作用范围
内置名称空间
	程序任意阶段任意位置均可使用(全局有效)
全局名称空间
	程序任意阶段任意位置均可使用(全局有效)
局部名称空间
	一般情况下只在各自局部名称空间中有效(局部有效)

global与nonlocal关键字

'''global关键字:局部修改全局不可变类型'''
# x = 111
# def index():
#     # x = 222  # 并不是在修改全局的x 而是在局部名称空间中创建了一个新的x
#     # 如果想要在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字申明
#     global x  # 申明 修改的是全局x而不是产生新的x
#     x = 666
# index()
# print(x)

l1 = [111, 222, 333]
def index():
    l1.append(444)
index()
print(l1)
"""
如果想要在局部修改全局的不可变类型
    需要提前加关键字global申明
如果想要在局部修改全局的可变类型
    不需要加关键字global申明
"""

def index():
    x = 111  # 在index的局部产生一个x=111
    l1 = [11, 22, 33]
    def f1():
        # x = 222  # 在f1的局部产生一个x=222
        # print(x)
        # 局部名称空间嵌套 内层修改外层
        # nonlocal x
        # x = 333
        l1.append(44)
    f1()
    print(x)
    print(l1)
index()
"""
局部名称空间嵌套的情况下 内层如果想要修改外层
    情况1数据是不可变类型
        需要使用关键字nonlocal
    情况2数据是可变类型
        不需要使用关键字nonlocal
"""

函数名的多种用法

def index():
    print('from funtion index')
1:函数名可以当做变量名赋值
print(index)
res = index  # 让res也指向函数体代码
print(res)
res()  # index()

2:函数名还可以当成函数的实参
def index():
    print('from index')
def func(a):
    print('from func')
    print(a)
    a()
func(index)
3:函数名还可以当做函数的返回值
# def func():
#     print('from func')
#     return index  # 将函数名当做返回值
# def index():
#     print('from index')
# res = func()  # res接收函数名
# print(res)  # 指向的是index函数的内存地址
# res()  # index()
4:函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>:列表、元组、字典'''
# def index():
#     print('from index')
# l1 = [11, 22, 33, 44, index]
# print(l1)
# l1[-1]()  #  index()

def register():
    print('注册功能')
def login():
    print('登录功能')
def transfer():
    print('转账功能')
def withdraw():
    print('提现功能')
def check_order():
    print('查看账单')
def shopping():
    print('购物功能')
def check_account():
    print('查看余额')
# 定义一个功能存放区
func_dict = {
    '1':register,
    '2':login,
    '3':transfer,
    '4':withdraw,
    '5':check_order,
    '6':shopping,
    '7':check_account
}
while True:
    print("""
    1.注册功能
    2.登录功能
    3.转账功能
    4.提现功能
    5.查看账单
    6.购物功能
    7.查看余额
    """)
    choice = input('请输入您想要执行的功能编号>>>:').strip()
    if choice in func_dict:
        # 获取键对应的值(函数名)
        func_name = func_dict.get(choice)
        # 执行函数
        func_name()
    else:
        print('功能编号不存在')

函数的嵌套

def index():
    func()
def func():
    index()
func()  # 死循环,报错很多行
"""在学习函数的时候 前期一定要细心 死咬概念  定义调用"""
# 比较大小函数定义
def my_max(a,b):
    if a > b:
        return a
    return b
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')
"""
函数的学习会让我们的代码逻辑更加清晰 更加便于维护
"""

posted @   末笙  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示