1.实参为(*args)时名称空间def num(*args,**kwargs): print(args) print(kwargs) num([1,2,3,4,5]) # ([1,2,3,4,5],) {} '''如果想将列表、字典、字符串中的数据分成单个单个参数''' a1 = [1,2,3,4,5] num(*a1) # (1,2,3,4,5) {} b1 = 'hello' num(*b1) # ('h','e','l','l','o') c1 = {'name':'aaa','age':18} num(*c1) # ('name', 'age') '''*的用法类似于用for循环把数据类型中的数据一个一个单独取出'''ps:如果实参中没有加*则直接把数据类型中的数据以元组的形式输出,加*则将数据一个一个分开。
2.实参为(*kwargs)时def num(*args,**kwargs): print(args) print(kwargs) a1 = {'name':'aaa','age':20} num(**a1) # () {'name': 'aaa', 'age': 20}ps:**很局限只能用这字典上。
3.关键字参数(冷门知识点)形参的顺序必须按照(a,b,*args,**kwargs)或(a,*args,b,**kwargs)
def func(a,b,*args,**kwargs): print(a,b,args,kwargs) func(1,2,3,4,age =18) # 1 2 (3, 4) {'age': 18}当形参*args后面还有除**kwargs外的参数时就报错
def func(a,b,*args,c,**kwargs): print(a,b,args,c,kwargs) func(1,2,3,4,5,age =18) '''报错:func() missing 1 required keyword-only argument: 'c''''
名字的查找循序ps:名称空间可以理解为将程序中的变量名和数据间的绑定关系存放的地方
1.内置名称空间
在python解释器运行的时候立马会创建一个空间存放内置名称,在写程序代码时用户可以直接使用名字调用。
2.全局名称空间
py文件运行过程中产生的名字都会存入该空间(变量名和类名)
3.局部名称空间
函数体代码在运行过程中产生的名字都会存到该空间
ps:内置名称空间和全局名称空间都可以在程序任意位置使用
局部名称空间复杂情况1.在全局名称空间下
先查找全局名称空间如果没有再找内置名称空间还是没有则报错
全局名称 >>> 内置名称空间
2.在局部名称空间下
先在当前所在的局部名称空间下查找没有再全局名称空间查找还没有则在内置名称空间查找,内置名称空间也没有则报错。
局部名称空间 >>> 全局名称空间 >>>内置名称空间
ps:名称查找顺序默认情况下不能颠倒只能是以上顺序。
global与nonlocal关键字1.各自局部名称空间默认情况下不能彼此共享名字,也有特殊情况如下:
x = 1 def func1(): x = 2 def func2(): x = 3 def func3(): x = 4 print(x) print(x) func3() func2() func1() # 打印结果 3 4
函数名的多种使用方式1.global关键字
global关键字用来在函数或其他局部作用域中使用全局变量。
digit = [1,2,3,4] def num(): digit.append(666) num() print(digit) # 打印结果 [1, 2, 3, 4, 666] digit = 222 def num(): global digit '''局部名称空间中的digit操作全局digit''' digit = 111 print(digit) num() print(digit) #打印结果 111 111ps:局部修改全局名称空间中不可变类型的数据,需要关键字global声明;如果不是可变类
型则无需关键字声明。
2.nonlocal关键字
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
l1 = [1,2,3,4] def num(): x = 1 l1 = [1,2] def num2(): # nonlocal x x = 999 l1.append(666) num2() print(x) print(l1) num() '''打印结果 1 [1, 2, 666] '''ps:在内存局部名称空间修改外层局部名称空间中的不可变类型
1.函数名可以被多次赋值
def Example(): print('hello') name = Example name() Example() '''打印结果 hello hello '''2.函数名可以当做函数的实参
def index(a): print(a) index(123) name = 'aabb' index(name) '''打印结果 123 aabb '''3.函数名还可以当做函数的返回值
def Example(): print('hello') def index(): return Example res = index() print(res) res() ''' 打印结果hello ''' 4.函数名可以当做容器类型里面的数据值
def Example(): print('hello') l1 = [1,2,3,4,Example] print(l1) l1[-1]() '''打印结果 [1, 2, 3, 4,] hello ‘’‘
'''将员工管理系统用函数进行优化'''
data_dict = {} # 建立空字典
def judgment_user():
# 获取用户数据
id = input('请输入员工编号>>>:').strip()
# 检测员工重复
if id in data_dict:
print('该员工编号已经存在')
return
name = input('请输入员工姓名>>>:').strip()
age = input('请输入员工年龄>>>:').strip()
job = input('请输入员工岗位>>>:').strip()
salary = input('请输入员工薪资>>>:').strip()
# 构造存储用户数据的小字典
temp_dict = {}
# 将员工数据全部录入该小字典
temp_dict['id'] = id
temp_dict['name'] = name
temp_dict['age'] = age
temp_dict['job'] = job
temp_dict['salary'] = salary
# 将员工数据小字典当做大字典的值添加
data_dict[id] = temp_dict # {'1':{}}
def revise():
target_id = input('请输入想要修改的员工编号>>>:').strip()
# 2.判断当前员工编号是否存在
if target_id not in data_dict:
print('当前员工编号不存在 无法修改!!!')
return
# 3.根据员工编号获取该员工的详细数据(小字典)
emp_data = data_dict.get(target_id) # {}
# 4.获取新的员工薪资
new_salary = input('请输入该员工新的薪资>>>:').strip()
# 5.修改员工小字典中薪资对应的值
emp_data['salary'] = new_salary
# 6.将修改之后的小字典重新赋值到大字典中
data_dict[target_id] = emp_data
# 7.人性化提示(也可以不写)
print(f'员工编号:{target_id} 员工姓名:{emp_data.get("name")}薪资修改成功')
def View_user():
target_id = input('请输入想要查询的员工编号>>>:').strip()
# 2.判断当前编号是否存在
if target_id not in data_dict:
print('当前员工编号不存在')
return
# 3.根据员工编号获取员工数据字典
emp_data = data_dict.get(target_id)
# 4.格式化输出员工数据
print(f"""
--------------------emp of info------------------
编号:{emp_data.get('id')}
姓名:{emp_data.get('name')}
年龄:{emp_data.get('age')}
岗位:{emp_data.get('job')}
薪资:{emp_data.get('salary')}
-------------------------------------------------
""")
def View_all():
# 获取所有员工数据小字典
all_emp_data = data_dict.values() # [{},{},{}]
# 循环获取每一个员工数据字典
for emp_data in all_emp_data: # {}
# 格式化输出员工数据
print(f"""
--------------------emp of info------------------
编号:{emp_data.get('id')}
姓名:{emp_data.get('name')}
年龄:{emp_data.get('age')}
岗位:{emp_data.get('job')}
薪资:{emp_data.get('salary')}
-------------------------------------------------
""")
def del_user():
target_delete_id = input("请输入想要删除的员工编号>>>:").strip()
# 判断员工编号是否存在
if target_delete_id not in data_dict:
print('员工编号不存在')
return
# 根据员工编号删除键值对
data_dict.pop(target_delete_id)
print(f'员工编号{target_delete_id}数据删除成功')
func_dict = {'1':judgment_user,'2':revise,'3':View_user,'4':View_all,'5':del_user}
while True:
print("""
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
""")
# 获取用户输入的功能编号
func_id = input('请输入功能的编号>>>:').strip()
if func_id in func_dict:
func_name = func_dict.get(func_id)
func_name()
else:
print('请好好输')



