函数之名称空间,作用域,以及函数名称的多种使用方式

1.函数参数重要知识点补充

1.1 实参中 ‘*’号的功能
# 1.实参中'*'的使用
# 当传入的实参是一个具有索引的可迭代对象时,需要将其中的每个元素取出并作为参数传入函数,只需在迭代对象前加上'*'即可实现

def func1(*args, **kwargs):
    print(args)
    print(kwargs)


l = [1, 3, 5, 7, 9]
func1(*l)
# (1, 3, 5, 7, 9)
# {}

1.1 实参中 ‘**’号的功能
# 1.实参中'**'的使用
# 当传入的实参是一个字典时,需要将字典中的键值对以关键字实参的形式传入函数,只需在该字典对象前加上'**'即可实现
def func1(*args, **kwargs):
    print(args)
    print(kwargs)


dic1 = {'name': 'wang', 'age': 18}
func1(**dic1)
# ()
# {'name': 'wang', 'age': 18}

2.命名关键字参数

def func(1,2,3,*args,a=1,**kwargs):
    pass


func()
# 上面函数参数中的a=1就是该函数的命名关键字形参,一定要注意它的位置,必须跟在*args后面,**kwargs的前面

3. 名称空间

  • 3.1概念:用来存放变量名与数据值之间绑定关系的地方
  • del 变量名 删除变量名,就是删除了变量名以及变量名与数据值之间的绑定关系,而并非删除数据值

  • 3.2名称空间的分类
  • 1> 内置名称空间:python解释器运行就立刻会产生的名称空间

    • 内置名称空间的存活周期:python解释器则运行创建,关闭则销毁
    • 作用域:全局有效,在程序的任意位置都能够使用
len()
print()
input()
  • 2> 全局名称空间 py文件运行过程中产生的名称空间,py文件运行过程中,只要是定格定义的变量名都会存入全局名称空间中
    • 全局名称空间的存活周期:py文件运行则创建,关闭则销毁
    • 作用域:全局有效,在程序的任意位置都能够使用
a = 1
b = 'zhang'
  • 3> 局部名称空间 运行函数体代码过程中产生的名称空间,函数体代码运行结束立即销毁
    • 局部名称空间的存活周期:函数体代码运行则创建,运行结束则销毁
    • 作用域:局部有效,只能在自己的局部调用
def func():
    a = 1
    b = "ming"


func()
  • 3.3名称的查找顺序
    • 统一查找顺序:局部名称空间>>>>>>全局名称空间>>>>>>内置名称空间(在哪一层就按这个顺序查找即可)
def func1():
    len = 1

    def func2():
        len = 2

        def func3():
            len = 3
            print(len)
        func3()

    func2()


func1()

4.global关键字和nonlocal关键字

4.1global关键字
  • 情况1:全局不可变类型在局部要被修改,必须在局部使用global关键字(局部修改全局名称空间中不可变类型的数据 需要使用关键字global声明)
a = 1


def func1():
    global a
    a = 100


func1()
print(a)  # 100
  • 情况2:全局可变类型在局部可以直接被修改
l = [1, 2, 3, 4, 5]


def func1():
    l.append(666)
    print(l)  


func1()  # [1, 2, 3, 4, 5, 666]
l.append(777)
print(l)  # [1, 2, 3, 4, 5, 666, 777]
4.2.nonlocal关键字
  • nonlocal关键字在函数嵌套中被使用,可以在一个函数中修改该函数上一层函数中的变量(在内存局部名称空间修改外层局部名称空间中的不可变类型)
def func1():
    a = 111

    def func2():
        nonlocal a
        a = 999
    func2()
    print(a)


func1()  # 999

5.函数名的多种使用方式

5.1 多次赋值
def func1():
    print('fun1')


name = func1
name()  # fun1
5.2 函数名还可以当做函数的实参
def func1():
    pass


def func2(a):
    print(a)


func2(func1)  # <function func1 at 0x00000204765B1EA0>
5.3 函数名还可以当做函数的返回值
def func1():
    pass


def func2():
    return func1


print(func2())  # <function func1 at 0x000001E4D8111EA0>
5.4 函数名还可以当做容器类型里面的数据值
def func1():
    print('from func1')


l1 = [1, 2, 3, 4, 5, func1]
l1[5]()  # from func1

练习

# 添加员工信息
def add_data():
    # 5.获取用户数据
    while True:
        emp_id = input('请输入员工编号>>>:').strip()
        # 9.针对员工编号应该做不重复校验
        if emp_id in data_dict:
            print('该员工编号已经存在')
            continue
        emp_name = input('请输入员工姓名>>>:').strip()
        emp_age = input('请输入员工年龄>>>:').strip()
        emp_job = input('请输入员工岗位>>>:').strip()
        emp_salary = input('请输入员工薪资>>>:').strip()
        # 6.构造存储用户数据的小字典
        temp_dict = {}
        # 7.将员工数据全部录入该小字典
        temp_dict['emp_id'] = emp_id
        temp_dict['emp_name'] = emp_name
        temp_dict['emp_age'] = emp_age
        temp_dict['emp_job'] = emp_job
        temp_dict['emp_salary'] = emp_salary
        # 8.将员工数据小字典当做大字典的值添加
        data_dict[emp_id] = temp_dict  # {'1':{}}
        break

# 修改员工薪资
def update_data():
    # 1.获取员工编号
    target_emp_id = input('请输入想要修改的员工编号>>>:').strip()
    # 2.判断当前员工编号是否存在
    if target_emp_id not in data_dict:
        print('当前员工编号不存在 无法修改!!!')

    # 3.根据员工编号获取该员工的详细数据(小字典)
    emp_data = data_dict.get(target_emp_id)  # {}
    # 4.获取新的员工薪资
    new_salary = input('请输入该员工新的薪资>>>:').strip()
    # 5.修改员工小字典中薪资对应的值
    emp_data['emp_salary'] = new_salary
    # 6.将修改之后的小字典重新赋值到大字典中
    data_dict[target_emp_id] = emp_data
    # 7.人性化提示(也可以不写)
    print(f'员工编号:{target_emp_id} 员工姓名:{emp_data.get("emp_name")}薪资修改成功')

# 查看指定员工
def check_data():
    while True:
        # 1.获取员工编号
        target_emp_id = input('请输入想要查询的员工编号>>>:').strip()
        # 2.判断当前编号是否存在
        if target_emp_id not in data_dict:
            print('当前员工编号不存在')
            continue
        # 3.根据员工编号获取员工数据字典
        emp_data = data_dict.get(target_emp_id)
        # 4.格式化输出员工数据
        print(f"""
               --------------------emp of info------------------
               编号:{emp_data.get('emp_id')}
               姓名:{emp_data.get('emp_name')}
               年龄:{emp_data.get('emp_age')}
               岗位:{emp_data.get('emp_job')}
               薪资:{emp_data.get('emp_salary')}
               -------------------------------------------------
               """)
        break

# 查看所有员工
def check_all():
    # 1.获取所有员工数据小字典
    all_emp_data = data_dict.values()  # [{},{},{}]
    # 2.循环获取每一个员工数据字典
    for emp_data in all_emp_data:  # {}
        # 4.格式化输出员工数据
        print(f"""
                        --------------------emp of info------------------
                        编号:{emp_data.get('emp_id')}
                        姓名:{emp_data.get('emp_name')}
                        年龄:{emp_data.get('emp_age')}
                        岗位:{emp_data.get('emp_job')}
                        薪资:{emp_data.get('emp_salary')}
                        -------------------------------------------------
                        """)

# 删除员工数据
def del_one():
    while True:
        # 1.获取想要删除的员工编号
        target_delete_id = input("请输入想要删除的员工编号>>>:").strip()
        # 2.判断员工编号是否存在
        if target_delete_id not in data_dict:
            print('员工编号不存在')
            continue
        # 3.根据员工编号删除键值对
        data_dict.pop(target_delete_id)
        # 4.小提示
        print(f'员工编号{target_delete_id}数据删除成功')
        break


# 4.定义存储用户数据的字典
data_dict = {}  # {'1':{}, '2':{}, '3':{} }
# 1.先搭建功能框架
data_dic = {
    '1': add_data,
    '2': update_data,
    '3': check_data,
    '4': check_all,
    '5': del_one,
}

while True:
    print("""
        1.添加员工信息
        2.修改员工薪资
        3.查看指定员工
        4.查看所有员工
        5.删除员工数据
        6.退出整个程序
    """)

    choice_num = input('请输入你选择的编号').strip()
    if choice_num in data_dic:
        data_dic[choice_num]()
    elif choice_num == '6':
        break
    else:
        print('请输入正确的选项')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值