函数与名称空间
*与**的作用
- *与**的各种用法
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('指令错误') # 提示指令错误

浙公网安备 33010602011771号