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
[<function at 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
# 已成功退出!
posted @ 2021-04-16 20:54  缘兮Fate  阅读(399)  评论(0)    收藏  举报