函数与名称空间

*与**的作用

  • *与**的各种用法
def func(*lnfo, **data):
    print(lnfo)
    print(data)

func()  # run:()  {}
# 实参时空括号时,*后的形参是空元组,**后形参是空字典

func([1, 2, 3, 4])  # run:([1, 2, 3, 4],)  {}
# 实参是一组数据值时,会当成一个数据值组成元组

a = [1, 2, 3, 4, 5]
func(a[0], a[1], a[2], a[3], a[4])  # run:(1, 2, 3, 4, 5)  {}
# 如果要将一组数据值分开成一个个数据值,会很麻烦
func(*a)  # run:(1, 2, 3, 4, 5)  {}
# 在实参前面加*就省事多了

b = {'name': 'barry', 'age': '22'}
func(*b)  # run:('name', 'age')  {}
# 在实参前面加*只能取出k值
func(**b)  # run:()  {'name': 'barry', 'age': '22'}
# 在实参前面加**就可以将键值对取出组成字典
  • *使用知识补充
def func(a, b, *lnfo):
    print(a, b, lnfo)
func(1, 2, 3, 4, 5)  # run:1 2 (3, 4, 5)
# *前面的实参形参会按顺序自动匹配

def func(a, b, *lnfo, c):
    print(a, b, lnfo, c)
func(1, 2, 3, 4, 5, c=6)  # run:1 2 (3, 4, 5) 6
# *形参后面的形参需要在实参进行赋值,否则就会报错

名称空间

  • 什么是名称空间
名称空间就是储存变量名和赋值关系的空间

age = [1, 2, 3, 4]
del age

将变量名,变量名和数据值的赋值关系储存在内存空间的一块区域叫名称空间
当我们使用变量名时,就到这名称空间,根据变量名和赋值关系取出数据值
删除时也不是删除数据值,而是删除变量名和赋值关系
  • 名称空间的分类
1.内置名称空间
运行python解释器时就会创造内存空间,可以直接使用的名字都在内置名称空间
如: print()   len()   input()   int()

2.全局名称空间
运行代码时,产生的所有名字(函数体代码的名字除外)都在全局名称空间
'''			  普通代码里面我们定义的变量名
           分支结构里面的变量名
        	循环结构里面的变量名
           定义函数的函数名
        	定义类的类名
'''

3.局部名称空间
函数体代码运行时产生的名字都在局部名称空间,局部名称空间之间的名字不能共用
  • 名称空间的创建和销毁
1.内置名称空间
运行python解释器时,解释器会自动创建内置名称空间
关闭python解释器时,内置名称空间会自动销毁
2.全局名称空间
运行代码时,会创造一个储存运行代码中变量名的全局名称空间
当运行结束时,全局名称空间就会销毁
3.局部名称空间
定义函数时,函数体代码不会运行,调用函数时体代码运行,并创造局部名称空间将体代码中的名字储存在其中
当结束运行时,局部名称空间销毁
  • 名字的查找顺序

查找名字时必须按顺序查找,顺序不能颠倒

内置名称空间<<<全局名称空间<<<局部名称空间

  • 名称空间的作用区域
1.内置名称空间
在程序的任何位置都可以运行
2.全局名称空间
在程序的任何位置都可以运行
3.局部名称空间
只能在自己的局部空间里运行

局部名称空间的运用

  • 局部名称空间的特殊运用
def func():
    age = 18
    print(age)  # run:18
def func1():
    age = 20
    print(age)  # run:20
# 局部名称空间之间不能共享名字
    
func()
func1()

def func():
    age = 18
    def func1():
        age = 20
        def func2():
            print(age)  # run:20
        func2()
    func1()
func()
# 局部名称空间其他局部名称空间之内,则可以使用上一层局部名称空间的名字

age = 20
def func():
    print(age)  # run:报错
    age = 18
func()
# 局部名称空间内部的代码运行顺序是在定义时确定的
  • global与nonlocal关键字
age = 18
def func():
    age = 20
func()
print(age)  # run:18
# 局部名称空间的名字会在局部名称空间储存,全局名称空间里没有

age = 18
def func():
    global age
    age = 20
func()
print(age)  # run:20
# global会用该局部名称空间的名字可以修改全局名称空间的名字

age = [1, 2, 3, 4]
def func():
    age.append(5)
func()
print(age)  # run:[1, 2, 3, 4, 5]
# 如果是可变类型,则不需要global关键字

age = 1
def func():
    age = 18
    def func1():
        global age
        age = 20
    func1()
    print(age)  # run:18
func()
print(age)  # run:20
# global关键字只会用该局部名称空间的名字可以修改全局名称空间的名字

age = 1
def func():
    age = 18
    def func1():
        nonlocal age
        age = 20
    func1()
    print(age)  # run:20
func()
print(age)  # run:1
# nonlocal关键字会用该局部名称空间该改外层局部名称空间

函数名的多种使用

def func():
    print('barry')
name = func
name()  # run:barry
name1 = name
name1()  # run:barry
# 函数名可以向变量名一样用来多次赋值

def func():
    print('barry')
def info(a):
    print(a)
info(110)  # run:110
name = 'barry'
info(name)  # run:barry
info(func)  # run:<function func at 0x0000029B3C7A61F0>
# 函数名可以做其他函数的实参,会将函数的内存地址传给形参

def func():
    print('barry')
def info():
    return func
res = info()
res()  # run:barry
# 函数名可以当做返回值,返回值是函数体代码运行结果

def func():
    print('barry')
a = [1, 2, 3, func]
a[-1]()  # run:barry
# 函数名可以当做数据值储存进容器类型

作业

info = {}  # 设置一个空字典
def register():
    id = input('编号>>>:')
    if id not in info:  # 判断id是否已存在
        name = input('姓名>>>:')
        age = input('年龄>>>:')
        Post = input('岗位>>>:')
        set = input('薪资>>>:')  # 输入员工数据
        info[id] = {'id': id, 'name': name, 'age': age, 'post': Post, 'set': set}  # 不存在则将新员工数据加入字典
    else:
        print('id已存在')  # id已存在则重新输入


def modify():
    id = input('编号>>>:')
    if id in info:  # 判断id是否存在
        a1 = info.pop(id)  # 存在则取出id对应的员工
        set = input('要将薪资该为多少>>>:')  # 输入修改后的薪资
        a1['set'] = set  # 修改薪资
        info[id] = a1  # 将修改后的员工数据放回字典
    else:
        print('id不存在')  # id不存在则重新输入


def read():
    id = input('编号>>>:')
    if id in info:  # 判断id是否存在
        print(info[id])  # 存在则打印id对应的用户数据
    else:
        print('id不存在')  # id不存在则重新输入


def see():
    data = info.values()  # 将员工信息取出
    for i in data:  # 循环输出每位员工的信息
        print(f"""
            --------------------emp of info------------------
            编号:{i.get('id')}
            姓名:{i.get('name')}
            年龄:{i.get('age')}
            岗位:{i.get('post')}
            薪资:{i.get('set')}
            -------------------------------------------------
            """)  # 格式化输出所有员工信息


def delete():
    id = input('要删除谁啊>>>:')
    if id in info:  # 判断id是否存在
        del info[id]  # 存在删除指定员工
    else:
        print('id不存在')  # id不存在则重新输入


func_dict = {
    '1': register,
    '2': modify,
    '3': read,
    '4': see,
    '5': delete
}  # 指令对应的函数名字典

while True:
    print('''
         1添加员工信息
         2修改员工薪资
         3查看指定员工
         4查看所有员工
         5删除员工数据''')  # 告诉用户功能指令
    func_id = input('输入指令>>>:')  # 输入功能指令
    if func_id in func_dict:  # 判断是否有这个指令
        func_name = func_dict.get(func_id)  # 将指令对应的函数名取出
        func_name()  # 调用函数
    else:
        print('指令错误')  # 提示指令错误
posted @ 2022-07-04 21:28  无言以对啊  阅读(47)  评论(0)    收藏  举报