名称空间与作用域

名称空间

名称空间是存储变量名和变量值绑定关系的地方
#名称空间的分类
1.名称内置空间
python解释器提前定义好的
len() count() 等
2.全局名称空间
在py文件中编写的代码运行产生绑定关系都会存进全局名称空间
neme = 'jason'  # name
for i in rang(10):  # i
    pass
while True:  # a
    a = 1
def func():  # func
    pass
3.局部名称空间
函数体代码运行后产生的关系都是在局部名称空间
def func():
	b = 78  # b
# 存活周期
1内置名称空间
python解释器运行产生
python解释器关闭 销毁
2.全局名称空间
py文件开始运行 产生
py文件运行结束 销毁
3.局部名称空间
函数体代码运行 产生
函数体代码运行结束 销毁

名字的产找顺序

'''
名称空间使是了存放变量名与值绑定关系的地方,如果查找一个变量名,而改变量名在不同观点命名空间都存在,查找的值是那一个
'''
# 查找名字的时候一定要搞清楚,名字在那个空间
1.如果在局部名称空间
	那么就查找局部空间的名字,如果局部空间没有,可以一次查找全局名称空间和内置名称空间
2.如果在全局名称空间
	就在全局名称空间查找,找不到,只能去内置名称空间查找,不能去局部名称空间内进行查找
x = 2
def func():
    x = 1
    def func2()
    	x = 3
     func2()
print(x)  # 2
因为print()是写在全局变量里面的,所以找x只能去全家名称空间和内置名称空间去找。不能去局部名称空间去找
x = 2
def func():
    x = 1
    def func2()
    print(x) # 1
	func2()
print()是写在局部名称空间的,所有会优先在局部空间中去寻找,找不到再去全局和内置空间去找

def func():
    name = 'jason'
def func2();
	age = 15
	print(name)  # 报错
func()
func2()
# 局部名称空间之间的关系如果不是嵌套,那么互不干涉,根本原因是,func()函数,局部名称空间中的关系,在函数调用结束后就销毁



作用域

#作用域就是名称空间能够作用的范围
内置名称空间
	程序的任意阶段都可用(全局有效)
全局名称空间
	程序任意阶段都可用(全局有效)
局部名称空间
	通常只在各种局部空间有效(局部有效)
#也可以通过特定的方法打破规则

global与nonlocal关键字

#global关键字,可以在局部名称空间修改全局不可变类型
 x = 1
def func():
    global x
    x = 2
func()
print(x)  # 2
# 在局部名称空间修改可变类型不需要加关键字
l = [1,2]
def func():
    l.append(3)
func()
print(l)  # [1, 2, 3]

# 局部名称空间嵌套的情况下,可以使用nonlocal关键字,在内内层修改外层空间不可变类型,可变类型可以直接修改
def func():
    x = 1
    l = [1]
    def func2()
    	nonlocal x
        x = 2
        l.append(2)
    func2()
    print(x)
    print(l)
func()  
>>>2
>>>[1, 2]

函数名的多种用法

def func():
    print('func')
# 用法1:函数名可以当变量名赋值
print(func)
>>> <function func at 0x0000028AF4D84B70>
# 可以让func中的地址在绑定一个新的变量名,并且新的变量名也可以调用该函数
res = func
res()  等价于  func()

# 用法2:函数名可以当成函数的实参
def func2(a):
	print(a)
func2(func)
>>> <function func at 0x0000016CEA2F4B70>

# 用法3:函数名可以当函数的返回值
def func3(a):
    print('func3')
	return func
print(func3)
>>><function func3 at 0x000002D2422CCC80>

# 用法4:函数名可以作为容器的元素
def func3(a):
    print('func3')
	return func
l = [1,2,func3]
print(l)
>>>[1, 2, <function func3 at 0x000002B73A7CCC80>]

函数的嵌套

# 嵌套调用
获取两个数中的较大数
a = 1
b = 2
def index(a,b):
    if a>b:
    	return a
    return b
print(index(a,b))  # 2
# 返回四个值中的较大值
def many_max(a,b,c,d)
	res = index(a,b)
    res2 = index(c,d)
    res3 = index(res,res2)

作业

点击展开

import os
def add_employee():
    id_input = input('请输入新增员工id:').strip()
    with open(r'a.txt', 'r', encoding='utf8') as f1:
        for info in f1:
            if info.split('|')[0] == id_input:
                print('员工已存在')
            else:
                name_input = input('请输入员工姓名:').strip()
                age_input = input('请输入员工年龄:').strip()
                salary_input = input('请输入员工薪资:').strip()
                with open(r'a.txt', 'a', encoding='utf8') as f2:
                    f2.write(f'{id_input}|{name_input}|{age_input}|{salary_input}\n')
                    print('员工添加成功')
                    break
def select_employee():
    id_input = input('请输入员工编号:').strip()
    with open(r'a.txt') as f1:
        for info in f1:
            if id_input in info:
                res = info.strip('\n')
                print(f"编号:{res.split('|')[0]}")
                print(f"姓名:{res.split('|')[1]}")
                print(f"年龄:{res.split('|')[2]}")
                print(f"薪资:{res.split('|')[3]}")
            else:
                print('未找到该员工')
def revise_salary():
    id_input = input('请输入员工编号:')
    with open(r'a.txt', 'r', encoding='utf8') as f1:
        for info in f1:
            salary = info.strip('\n')
            if id_input in salary:
                salary_now = input('请输入当前薪资')
                salary_input = input('请输入修改后的薪资:')
                with open('a.txt') as f2:
                    data = f2.read()
                with open('a.txt', 'w', encoding='utf8') as f3:
                    f3.write(data.replace(salary_now, salary_input))
def select_all():
    with open(r'a.txt') as f:
        for info in f:
            res = info.strip('\n')
            print(f"编号:{res.split('|')[0]}")
            print(f"姓名:{res.split('|')[1]}")
            print(f"年龄:{res.split('|')[2]}")
            print(f"薪资:{res.split('|')[3]}")
            print('**************')
def delete_employee():
    id_input = input('请输入删除的员工编号:')
    with open(r'a.txt') as f1:
        for info in f1:
            res = info.split('|')
            if id_input not in res:
                with open(r'b.txt', 'a', encoding='utf8') as f2:
                    f2.write(f'{res[0]}|{res[1]}|{res[2]}|{res[3]}')
    os.remove('a.txt')
    os.rename('b.txt.swap', 'a.txt')
dict_info = {'1': add_employee, '2': select_employee, '3': revise_salary, '4': select_all,
             '5': delete_employee}
while True:
    print('1.添加员工信息\n2.查询特定员工\n3.修改员工薪资\n4.查询所有员工\n5.删除特定员工')
    choice = input('请输入您的选择:')
    if choice in dict_info:
        res = dict_info[choice]
        res()
posted @   名字只需六字  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示