python习题,关于匿名函数专场的练习
习题1
看代码分析结果:
func_list = []
for i in range(10):
func_list.append(lambda: i)
v1 = func_list[0]()
v2 = func_list[5]()
print(v1, v2)
首先for循环中加入了2个匿名函数
在执行v1执行第一个匿名函数的时候返回的是i,
因为匿名函数i 在临时空间名称找不到,
所以在全局名称空间查找,找到了i = 9
所以结果是9
v2同上
运行结果:
9 9
习题2
看代码分析结果:
func_list = []
for i in range(10):
func_list.append(lambda x: x + i)
v1 = func_list[0](2)
v2 = func_list[5](1)
print(v1, v2)
首先列表添加了10个匿名函数,
然后在执行v1的时候是找到列表的第一个元素
也即匿名函数然后传入2的值,
这时候i也是通过全局名称空间找到了i = 9
所以v1 = x + i = 11
v2也同上
v2 = 10
运行结果:
11 10
习题3
看代码分析结果:
func_list = []
for i in range(10):
func_list.append(lambda x: x + i)
for i in range(2, 12):
result = func_list[i-2](i)
print(result)
首先列表加入了10个匿名函数
然后在执行第二个循环的时候传入值i,
然后匿名函数返回是:2+i,
i通过全局命名空间找到2
所以答案是:2+2=4
然后后面的同上依次循环最后的值是
6
8
...
22运行结果:
4
6
8
10
12
14
16
18
20
22
习题4
看代码写结果(面试题):
def func(name):
v = lambda x: x + name
return v
v1 = func('太白')
v2 = func('alex')
v3 = v1('银角')
v4 = v2('金角')
print(v1, v2, v3, v4)
运行结果:地址xxxx代表十六进制地址
<function func.. at 0x0000000000xxxxxx> <function func. . at 0x0000000000xxxxxx> '银角太白' '金角alex'
习题5
看代码写结果(面试题):
result = []
for i in range(10):
func = lambda: i
result.append(func)
print(i)
print(result)
v1 = result[0]()
v2 = result[9]()
print(v1, v2)
运行结果:
9
[<functionat 0x0000000000xxxxxx>,...]*10 # 合计10个不同的匿名函数地址
9 9
习题6
看代码写结果(面试题):
def func(num):
def inner():
print(num)
return inner
result = []
for i in range(10):
f = func(i)
result.append(f)
print(i)
print(result)
v1 = result[0]()
v2 = result[9]()
print(v1, v2)
运行结果:
9
[<fuction func..inner at 0x0000000000xxxxxx>]*10 # 10个不同的地址
0 9
None None
习题7
看代码写结果(新浪微博面试题)
def func():
for num in range(10):
pass
v4 = [lambda: num + 10, lambda: num + 100, lambda: num + 100]
result1 = v4[1]()
result2 = v4[2]()
print(result1, result2)
func()
运行结果:
9 9
习题8
请编写一个函数实现IP地址转换成一个整数(面试题)。
例如:
10.3.9.12 转换规则为:
| 十进制 | 二进制 |
|---|---|
| 10 | 00001010 |
| 3 | 00000011 |
| 9 | 00001001 |
| 12 | 00001100 |
在将以上二进制拼接起来计算十进制结果:
00001010 00000011 00001001 00001100 = ?
def fun_bin(ip='192.168.1.1'):
def inner():
nonlocal ip
# 获取列表 元素:对应的十进制
ip_list = [int(i) for i in ip.split('.')]
# zfill(width) width字符不足前面会补充0,并且原字符串右对齐
# lstrip() 默认清空左侧空格,加参数会删除填写的字符
result = [bin(i).lstrip('0b').zfill(8) for i in ip_list]
ip_bin = ''
for i in result:
ip_bin += i
return int(f'{ip_bin}', 2), ip_bin # 二进制的拼接->十进制
return inner
if __name__ == '__main__':
ip = '192.168.1.1'
y = fun_bin(ip)()
print(f'IP:{ip}\nIP对应拼接后的二进制:{y[1]}\nIP对应二进制拼接后的对应的十进制是:{y[0]}')
# 运行结果
# IP:192.168.1.1
# IP对应拼接后的二进制:11000000101010000000000100000001
# IP对应二进制拼接后的对应的十进制是:3232235777
习题9
用内置函数或者匿名函数结合完成以下习题
9.1 用map来处理字符列表,把列表中所有人都变成sb,比方alex_sb
name = ['oldboy', 'alex', 'wusir']
name = ['oldboy', 'alex', 'wusir']
new_name = list(map(lambda n: n + '_sb', name))
print(new_name) # ['oldboy_sb', 'alex_sb', 'wusir_sb']
9.2 用map来处理下述l,然后用list得到一个新的列表,列表中的每个人的名字都是sb结尾
l = [{'name': 'alex'}, {'name': 'y'}]
l = [{'name': 'alex'}, {'name': 'y'}]
new_l = list(map(lambda x: {'name': x['name'] + '_sb'}, l))
print(new_l) # [{'name': 'alex_sb'}, {'name': 'y_sb'}]
9.3 用filter来处理,得到股票价格大于20的股票名字
shares = {'IBM': 36.6, 'Lenovo': 23.2, 'oldboy': 21.2, 'ocean': 10.2}
shares = {'IBM': 36.6, 'Lenovo': 23.2, 'oldboy': 21.2, 'ocean': 10.2}
new_shares = list(filter(lambda x: shares[x] > 20, shares))
print(new_shares) # ['IBM', 'Lenovo', 'oldboy']
9.4 有下面字典,得到购买每只股票的总价格,并放在一个迭代器中结果:list一下[9110.0,27161.0,..]
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}]
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}]
new_portfolio = map(lambda i: i.get('shares') * i.get('price'), portfolio)
print(list(new_portfolio)) # [9110.0, 27161.0, 4218.0, 1111.25, 735.7500000000001, 8673.75]
9.5继续题9.4的字典,过滤出单价大于100的股票.
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}]
new_portfolio = filter(lambda x: x.get('price') > 100, portfolio)
print(list(new_portfolio))
# [{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}]
9.6有下列三种数据类型;
l1 = [1, 2, 3, 4, 5, 6]
l2 = ['oldboy', 'alex', 'wusir', '太白', '日天']
l3 = ('**', '***', '****', '*******')
写代码,最终得到的是(每个元组第一个元组>2,第三*至少是4个)
类似:
[(3, 'wusir', '****'), (4, '太白', '******')
l1 = [1, 2, 3, 4, 5, 6]
l2 = ['oldboy', 'alex', 'wusir', '太白', '日天']
l3 = ('**', '***', '****', '*******')
lst = filter(lambda x: x[0] > 2 and len(x[2]) >= 4, zip(l1, l2, l3))
print(list(lst)) # [(3, 'wusir', '****'), (4, '太白', '*******')]
9.7有如下数据类型
l1 = [{'sales_volumn': 0},
{'sales_volumn': 108},
{'sales_volumn': 337},
{'sales_volumn': 475},
{'sales_volumn': 396},
{'sales_volumn': 172},
{'sales_volumn': 9},
{'sales_volumn': 58},
{'sales_volumn': 272},
{'sales_volumn': 456},
{'sales_volumn': 440},
{'sales_volumn': 239}]
将l1按照列表中的每个字典的values大小进行排序,形成一个新的列表.
new_l1 = sorted(l1, key=lambda x: x['sales_volumn'])
print(new_l1)
# [{'sales_volumn': 0}, {'sales_volumn': 9}, {'sales_volumn': 58}, {'sales_volumn': 108}, {'sales_volumn': 172}, {'sales_volumn': 239}, {'sales_volumn': 272}, {'sales_volumn': 337}, {'sales_volumn': 396}, {'sales_volumn': 440}, {'sales_volumn': 456}, {'sales_volumn': 475}]
习题10
求结果(面试题).
v = [lambda: x for x in range(10)]
print(v)
print(v[0])
print(v[0]())
结果:
[<function. at 0x000000000xxxxxxx>]*10 # 10个不同内存地址的匿名函数
<function. at 0x000000000xxxxxxx> # 列表中第一个匿名函数的地址
9
习题11
求结果(面试题).
v = (lambda: x for x in range(10))
print(v)
print(v[0])
print(v[0]())
print(next(v))
print(next(v)())
for i in v:
print(i)
结果:
<generator object
at 0x000000000xxxxxxx> # 生成器地址
报错TypeError:'generator' object is not subscriptable
习题12
map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])输出的是什么?(面试题)
结果:<map object at 0x000000000xxxxxxx>
习题13
求结果:(面试题)
def num():
return [lambda x: i * x for i in range(4)]
print([m(2) for m in num()])
"""
首先执行num()
[lambda x:i*x for i in range(4)]
4个匿名函数<function <listcomp>.<lambda> at 0x000000000xxxxxxx>
其次[m(2) for m in [4个匿名函数]]
lambda x:i*x = lambda 2:2*i = lambda2:2*3 = 6
4个匿名函数取4次得到4个相同结果
"""
结果:
[6, 6, 6, 6]
习题14
有一个数组[34, 1, 2, 5, 6, 6, 5, 4, 3, 3]请写一个函数,找出该数组中没有重复的数的总和(上面数据的没有重复的总和:1+2=3)(面试题)
def fun(args: list):
s = [str(i) for i in args] # 字符串组成的列表
temp = ''.join(s) # 所有元素组成的字符串
s1 = [] # 不重复的字符串列表
result = [] # 不重复的数组列表
# 不重复数字
for i in temp:
if temp.count(i) == 1:
s1.append(i)
for i in s:
for j in i:
if j not in s1:
break
else:
result.append(int(i))
return result, sum(result)
if __name__ == '__main__':
lst = [34, 1, 2, 5, 6, 6, 5, 4, 3, 3]
print(f'排重后的列表:{fun(lst)[0]}\n列表内元素的和为:{fun(lst)[1]}')
#运行结果:
# 排重后的列表:[1, 2]
# 列表内元素的和为:3
习题15
用户模拟登录管理系统:
用函数完成下列功能:
- 用户输入用户名密码注册
- 注册是要验证文件(register)用户名是否存在,如果存在则让其重新输入,如果不存在,则注册成功
- 注册成功后,将注册成功的用户名,密码写入register文件,并以|隔开
- 注册成功后,返回True,否则返回False
完成三次登录功能:
- 用户的用户名密码从一个文件register中取出
- register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行
- 完成三次验证,三次验证不成功则登录失败,登录失败则返回
- 登录成功返回True
其他功能:
- 增加了管理员登录界面,用户登录界面
- 增加了管理界面的删、改用户信息
- 增加了用户登录界面的查看歌词信息
import re
# 注册
def register(file_list: list):
while True:
name = input('注册的用户名:')
if not re.match(r'[_a-zA-Z][0-9a-zA-Z_]{3,17}$', name):
print('注册格式出错!')
continue
for i in file_list:
if i.get('name') == name:
print('该用户已存在!')
break
else:
break
while True:
password = input('用户密码:')
if not re.match(r'[~!@#$%^&*_a-zA-Z0-9]{6,20}$', password):
print('密码为:特殊字符[~!@#$%^&*_]、数字与字母的组合!至少6位及以上!')
continue
print('恭喜你注册成功!')
username = {'name': name, 'password': password}
file_list.append(username)
safe_file(username)
break
# 检测是匹配
def search(login):
def inner(file_list: list):
username = login(file_list)
for name in file_list:
if username == name:
return True, username
else:
return False, None
return inner
# 登录界面
@search
def login(file_list: list):
name = get_name()
while True:
password = input('用户密码:')
if not re.match(r'[~!@#$%^&*_a-zA-Z0-9]{6,20}$', password):
print('密码为:特殊字符[~!@#$%^&*_]、数字与字母的组合!至少6位及以上!')
continue
break
return {'name': name, 'password': password}
# 登录3次验证
def while_longin(n, login, file_list: list):
i = 0
while i < 3:
print(f'第{i + 1}次登录')
result = login(file_list)
if result[0]:
print('登录成功!')
if result[1].get('name') == 'admin':
management(file_list)
else:
users_management()
return True
i += 1
else:
print(f'登录失败达到{n}次!')
return False
# 查看本地存在的用户信息
def local_info(file_list: list):
print('***************用户信息***************')
for username in enumerate(file_list, start=1):
print(f"序号:{username[0]}\t用户名:{username[1].get('name')}\t密码:{username[1].get('password')}")
# 存入本地文件
def safe_file(info):
if isinstance(info, dict):
with open('register', encoding='utf-8', mode='a+') as f1:
f1.write(f"{info.get('name')}|{info.get('password')}\n")
if isinstance(info, list):
with open('register', encoding='utf-8', mode='w') as f1:
for username in info:
f1.write(f"{username.get('name')}|{username.get('password')}\n")
# 删除本地账户
def del_info(name, file_list: list):
for username in file_list:
if name == username.get('name'):
file_list.remove(username)
# 写入文件
safe_file(file_list)
print('删除成功!')
return True
else:
print('该用户不存在!')
return False
# 读取本地文件
def load_file():
lst = []
try:
with open('register', encoding='utf-8') as f1:
for line in f1:
name, password = line.strip('\n').split('|')
lst.append({'name': name, 'password': password})
except FileNotFoundError as e:
with open('register', encoding='utf-8', mode='w') as f2:
pass
finally:
return lst
# 获取用户名
def get_name():
while True:
name = input('用户名:')
if not re.match(r'[_a-zA-Z][0-9a-zA-Z_]{3,17}$', name):
print('注册格式出错!')
continue
return name
# 修改用户信息
def modification_info(file_list: list):
# 展示用户列表
local_info(file_list)
nums = list(range(1, len(file_list) + 1))
while True:
# 指定要修改的序号信息
num = input('要修改的序号信息:')
if not re.match(r'[\d]*$', num):
print('序号错误!')
continue
else:
if int(num) not in nums:
print('序号错误!')
continue
# 修改新用户名并验证是否在信息中
while True:
print('新的', end='')
name = get_name()
for username in file_list:
if username.get('name') == name:
print('该用户名已存在!')
break
else:
break
while True:
password = input('用户密码:')
if not re.match(r'[~!@#$%^&*_a-zA-Z0-9]{6,20}$', password):
print('密码为:特殊字符[~!@#$%^&*_]、数字与字母的组合!至少6位及以上!')
continue
break
# 删除要修改的序号信息
index = int(num) - 1
del file_list[index]
# 新用户信息插入删除位置
username = {'name': name, 'password': password}
file_list.insert(index, username)
# 保持信息并更新列表以及本地文件
safe_file(file_list)
print('恭喜你修改成功!')
break
# 管理界面 默认amin作为用户名
def management(file_list: list):
while True:
print('***************管理界面***************')
print('1.本地账户')
print('2.修改账户')
print('3.删除账户')
print('4.退出管理员模式')
num = input('选择操作[1-4]:')
if not re.match(r'[1-4]$', num):
print('输入错误!')
continue
if num == '1':
local_info(file_list)
elif num == '2':
modification_info(file_list)
elif num == '3':
name = get_name()
del_info(name, file_list)
else:
break
# 用户登录界面
def users_management():
while True:
print('***************用户界面***************')
print('1.查看信息')
print('2.退出账户')
num = input('选择操作[1-2]:')
if not re.match(r'[1-2]$', num):
print('输入错误!')
continue
if num == '1':
txt = \
"""\t\t\t\t\t\t\t两只老虎
两只老虎爱跳舞,小兔子乖乖拔萝卜,
我和小鸭子学走路,童年是最美的礼物。
小螺号呀嘀嘀地吹,我学海鸥展翅飞,
不怕风雨不怕累,快快把本领都学会。
宝贝,星星为你指路,哦?
宝贝,月亮为你祝福,哦!
哦
成长是快乐的旅途,
勇敢迈开你的脚步。
宝贝,妈妈怀里安睡,妈妈。
宝贝,爸爸是你椅背,爸爸。
你是我们的心肝宝贝,
爸爸妈妈的爱永相随。
两只老虎爱跳舞,小兔子乖乖拔萝卜,
我和小鸭子学走路,童年是最美的礼物。
小螺号呀嘀嘀地吹,我学海鸥展翅飞,
不怕风雨不怕累,快快把本领都学会。
宝贝,星星为你指路,哦?
宝贝,月亮为你祝福,哦!
哦!
成长是快乐的旅途,
勇敢迈开你的脚步。
宝贝,妈妈怀里安睡,妈妈。
宝贝,爸爸是你椅背,爸爸。
你是我们的心肝宝贝,
爸爸妈妈的爱永相随。
宝贝,星星为你指路,哦?
宝贝,月亮为你祝福,哦!
哦!
成长是快乐的旅途,
勇敢迈开你的脚步。
宝贝,妈妈怀里安睡,妈妈。
宝贝,爸爸是你椅背,爸爸。
你是我们的心肝宝贝,
爸爸妈妈的爱永相随。
你是我们的心肝宝贝,
爸妈的爱永相随。"""
print(txt)
else:
break
def main():
# 读取本地文件
file_list = load_file()
while True:
print('***************系统界面***************')
print('1.注册用户')
print('2.登录账户')
print('3.退出系统')
num = input('选择操作[1-3]:')
if not re.match(r'[1-3]$', num):
print('输入错误!')
continue
if num == '1':
register(file_list)
elif num == '2':
while_longin(3, login, file_list)
else:
print('已成功退出系统!')
break
if __name__ == '__main__':
main()
#运行结果:
# ***************系统界面***************
# 1.注册用户
# 2.登录账户
# 3.退出系统
# 选择操作[1-3]:1
# 注册的用户名:linda
# 用户密码:123456
# 恭喜你注册成功!
# ***************系统界面***************
# 1.注册用户
# 2.登录账户
# 3.退出系统
# 选择操作[1-3]:2
# 第1次登录
# 用户名:linda
# 用户密码:123456
# 登录成功!
# ***************用户界面***************
# 1.查看信息
# 2.退出账户
# 选择操作[1-2]:1
# 两只老虎
# 两只老虎爱跳舞,小兔子乖乖拔萝卜,
# 我和小鸭子学走路,童年是最美的礼物。
# 小螺号呀嘀嘀地吹,我学海鸥展翅飞,
# 不怕风雨不怕累,快快把本领都学会。
# 宝贝,星星为你指路,哦?
# 宝贝,月亮为你祝福,哦!
# 哦
# 成长是快乐的旅途,
# 勇敢迈开你的脚步。
# 宝贝,妈妈怀里安睡,妈妈。
# 宝贝,爸爸是你椅背,爸爸。
# 你是我们的心肝宝贝,
# 爸爸妈妈的爱永相随。
# 两只老虎爱跳舞,小兔子乖乖拔萝卜,
# 我和小鸭子学走路,童年是最美的礼物。
# 小螺号呀嘀嘀地吹,我学海鸥展翅飞,
# 不怕风雨不怕累,快快把本领都学会。
# 宝贝,星星为你指路,哦?
# 宝贝,月亮为你祝福,哦!
# 哦!
# 成长是快乐的旅途,
# 勇敢迈开你的脚步。
# 宝贝,妈妈怀里安睡,妈妈。
# 宝贝,爸爸是你椅背,爸爸。
# 你是我们的心肝宝贝,
# 爸爸妈妈的爱永相随。
# 宝贝,星星为你指路,哦?
# 宝贝,月亮为你祝福,哦!
# 哦!
# 成长是快乐的旅途,
# 勇敢迈开你的脚步。
# 宝贝,妈妈怀里安睡,妈妈。
# 宝贝,爸爸是你椅背,爸爸。
# 你是我们的心肝宝贝,
# 爸爸妈妈的爱永相随。
# 你是我们的心肝宝贝,
# 爸妈的爱永相随。
# ***************用户界面***************
# 1.查看信息
# 2.退出账户
# 选择操作[1-2]:2
# ***************系统界面***************
# 1.注册用户
# 2.登录账户
# 3.退出系统
# 选择操作[1-3]:2
# 第1次登录
# 用户名:admin
# 用户密码:123456
# 登录成功!
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:1
# ***************用户信息***************
# 序号:1 用户名:Lili 密码:123456
# 序号:2 用户名:Marry 密码:123456
# 序号:3 用户名:alex 密码:987654
# 序号:4 用户名:xiaobai 密码:66666444
# 序号:5 用户名:admin 密码:123456
# 序号:6 用户名:TianTian 密码:454545
# 序号:7 用户名:MaNao 密码:444555
# 序号:8 用户名:linda 密码:123456
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:2
# ***************用户信息***************
# 序号:1 用户名:Lili 密码:123456
# 序号:2 用户名:Marry 密码:123456
# 序号:3 用户名:alex 密码:987654
# 序号:4 用户名:xiaobai 密码:66666444
# 序号:5 用户名:admin 密码:123456
# 序号:6 用户名:TianTian 密码:454545
# 序号:7 用户名:MaNao 密码:444555
# 序号:8 用户名:linda 密码:123456
# 要修改的序号信息:7
# 新的用户名:NaNa
# 用户密码:666666
# 恭喜你修改成功!
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:1
# ***************用户信息***************
# 序号:1 用户名:Lili 密码:123456
# 序号:2 用户名:Marry 密码:123456
# 序号:3 用户名:alex 密码:987654
# 序号:4 用户名:xiaobai 密码:66666444
# 序号:5 用户名:admin 密码:123456
# 序号:6 用户名:TianTian 密码:454545
# 序号:7 用户名:NaNa 密码:666666
# 序号:8 用户名:linda 密码:123456
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:3
# 用户名:Lili
# 删除成功!
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:1
# ***************用户信息***************
# 序号:1 用户名:Marry 密码:123456
# 序号:2 用户名:alex 密码:987654
# 序号:3 用户名:xiaobai 密码:66666444
# 序号:4 用户名:admin 密码:123456
# 序号:5 用户名:TianTian 密码:454545
# 序号:6 用户名:NaNa 密码:666666
# 序号:7 用户名:linda 密码:123456
# ***************管理界面***************
# 1.本地账户
# 2.修改账户
# 3.删除账户
# 4.退出管理员模式
# 选择操作[1-4]:4
# ***************系统界面***************
# 1.注册用户
# 2.登录账户
# 3.退出系统
# 选择操作[1-3]:3
# 已成功退出系统!
习题16
完成一个员工信息表的增删功能
文件格式如下:
id,name,age,phone,job
1,Alex,22,13651054608,IT
2,太白,23,13304320533,Tearcher
3,nezha,25,1333235322,IT
现在要让你实现两个功能:
第一个功能是实现给文件增加数据,用户通过输入姓名,年龄,电话,工作,给源文件增加数据(增加的数据默认追加到元数据最后一行的下一行),但id要实现自增(id自增是有些难度,id是不需要用户输入的但是必须按照顺序增加)
第二个功能是实现给源文件删除数据,用户只需输入id,则将原文件对应的这一条数据删除(删除后下面的id不变,比如此时你输入1,则将第一条数据删除,但是下面的所有数据的id值不变及太白,nezha的id不变).
import re
lst = []
# 追加员工信息到文件
def file():
with open('info', encoding='utf-8', mode='a+') as f1:
num = str(int(lst[-1][0]) + 1)
info = [*add_info()]
info.insert(0, num)
lst.append(info)
new_info = ','.join(info)
f1.write(new_info + '\n')
print('添加完成')
return num
# 本地数据
def load_local_info():
try:
with open('info', encoding='utf-8') as f1:
for line in f1:
line = line.strip('\n').split(',')
lst.append(line)
return line[0]
except FileNotFoundError:
with open('info', encoding='utf-8', mode='w') as f2:
pass
# 员工信息
def add_info():
while True:
name = input('姓名:')
if not re.match(r'[\w]{2,12}$', name):
print('输入错误!')
continue
break
while True:
age = input('年龄:')
# 18-129
if not re.match(r'[1][8-9]$|[2-9][0-9]$|1[0-2][0-9]$', age):
print('输入错误!')
continue
break
while True:
tel = input('手机:')
if not re.match(r'1[0-9]{10}$', tel):
print('输入错误!')
continue
break
while True:
job = input('职业:')
if not re.match(r'[\w]{1,10}$', job):
print('输入错误!')
continue
break
return name, age, tel, job
# 获取要删除的员工序列号
def get_num(max_num):
while True:
num = input('要删除的序号:')
if not re.match(r'', num):
print('序号有误!')
continue
if not 0 <= int(num) <= int(max_num):
print('序号有误!')
continue
return num
# 删除员工信息
def del_info(num: str):
for info in lst:
if info[0] == num:
lst.remove(info)
break
with open('info', encoding='utf-8', mode='w') as f1:
for info in lst:
new_info = ','.join(info)
f1.write(new_info + '\n')
print('删除完成!')
# 显示员工信息
def show_info():
for info in lst:
print(info)
def main():
# 加载数据
max_num = load_local_info()
while True:
print('***操作选项***')
print('1.追加员工信息')
print('2.删除员工信息')
print('3.显示员工信息')
print('4.退出编辑!')
n = input('选择操作[1-4]:')
if not re.match(r'[1-4]$', n):
print('输入有误!')
continue
if n == '1':
file()
elif n == '2':
show_info()
num = get_num(max_num)
del_info(num)
elif n == '3':
show_info()
else:
print('已成功退出!')
break
if __name__ == '__main__':
main()
# 运行结果:
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:3
# ['id', 'name', 'age', 'phone', 'job']
# ['1', 'Alex', '22', '13651054608', 'IT']
# ['2', '太白', '23', '13304320533', 'Tearcher']
# ['3', 'nezha', '25', '1333235322', 'IT']
# ['4', 'nana', '18', '13800138000', '监工']
# ['5', 'lili', '20', '13800138000', '水土不服']
# ['6', 'Mary', '26', '13545678912', '滴滴司机']
# ['7', '娜丽', '65', '13800138000', '科员']
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:2
# ['id', 'name', 'age', 'phone', 'job']
# ['1', 'Alex', '22', '13651054608', 'IT']
# ['2', '太白', '23', '13304320533', 'Tearcher']
# ['3', 'nezha', '25', '1333235322', 'IT']
# ['4', 'nana', '18', '13800138000', '监工']
# ['5', 'lili', '20', '13800138000', '水土不服']
# ['6', 'Mary', '26', '13545678912', '滴滴司机']
# ['7', '娜丽', '65', '13800138000', '科员']
# 要删除的序号:5
# 删除完成!
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:3
# ['id', 'name', 'age', 'phone', 'job']
# ['1', 'Alex', '22', '13651054608', 'IT']
# ['2', '太白', '23', '13304320533', 'Tearcher']
# ['3', 'nezha', '25', '1333235322', 'IT']
# ['4', 'nana', '18', '13800138000', '监工']
# ['6', 'Mary', '26', '13545678912', '滴滴司机']
# ['7', '娜丽', '65', '13800138000', '科员']
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:1
# 姓名:小甜甜
# 年龄:30
# 手机:13616164545
# 职业:歌手
# 添加完成
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:3
# ['id', 'name', 'age', 'phone', 'job']
# ['1', 'Alex', '22', '13651054608', 'IT']
# ['2', '太白', '23', '13304320533', 'Tearcher']
# ['3', 'nezha', '25', '1333235322', 'IT']
# ['4', 'nana', '18', '13800138000', '监工']
# ['6', 'Mary', '26', '13545678912', '滴滴司机']
# ['7', '娜丽', '65', '13800138000', '科员']
# ['8', '小甜甜', '30', '13616164545', '歌手']
# ***操作选项***
# 1.追加员工信息
# 2.删除员工信息
# 3.显示员工信息
# 4.退出编辑!
# 选择操作[1-4]:4
# 已成功退出!

浙公网安备 33010602011771号