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()
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('请输入正确的选项')