#     1、函数对象优化多分支if的代码练熟
def login():
    print('登录')
def transfer():
    print('转账')
def withdraw():
    print('提现')
def check():
    print('查询')
msg = {
    '0': ('退出', None),
    '1': ('充值', login),
    '2': ('转账', transfer),
    '3': ('提现', withdraw),
    '4': ('查询', check)
}
while True:
    for k,v in msg.items():
        print('{} {}'.format(k,v[0]))
    cmd = input('请输入命令编号:').strip()
    if not cmd.isdigit():
        print('请输入数字')
    if cmd == '0':
        break
    if cmd in msg:
        msg[cmd][1]()
    else:
        print('命令不存在')
#     2、编写计数器功能,要求调用一次在原有的基础上加一
#         温馨提示:
#             I:需要用到的知识点:闭包函数+nonlocal
#             II:核心功能如下:
#                 def counter():
#                     x+=1
#                     return x
#         要求最终效果类似
#             print(couter()) # 1
#             print(couter()) # 2
#             print(couter()) # 3
#             print(couter()) # 4
#             print(couter()) # 5


def counter1():
    x = 0
    def counter():
        nonlocal x
        x += 1
        return x
    return counter
counter = counter1()

print(counter())
print(counter())
print(counter())
print(counter())
print(counter())


# ====================周末作业====================
# 编写ATM程序实现下述功能,数据来源于文件db.txt
# 0、注册功能:用户输入账号名、密码、金额,按照固定的格式存入文件db.txt
# 1、登录功能:用户名不存在,要求必须先注册,用户名存在&输错三次锁定,登录成功后记录下登录状态(提示:可以使用全局变量来记录)

#下述操作,要求登录后才能操作
# 1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
# 2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱
# 3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
# 4、查询余额功能:输入账号查询余额
user_info = {}
user_flag = {}
with open("db.txt", mode='rt', encoding='utf8') as f:
    for line in f:
        name, pwd,balance,count = line.strip().split(":")
        user_info[name] = [pwd,int(balance),int(count)]
        user_flag[name] = False
def login():
        while True:
            username = input("请输入账号:").strip()
            user_pwd = input("请输入密码:").strip()
            if username not in user_info:
                print("用户不存在")
            elif username in user_info and user_info[username][2] >= 3:
                print("你的账号已被锁定")
                continue
            elif (user_info[username][0] != user_pwd):
                user_info[username][2] += 1
                print("密码错误")
                if user_info.get(username)[2] >= 3:
                    print("你的账号已被锁定")
                    with open("db.txt", mode='w', encoding='utf-8') as f2:
                        for k,v in user_info.items():
                            f2.write('{}:{}:{}:{}\n'.format(k,v[0],v[1],v[2]))
                    continue
            else:
                print("登陆成功")
                user_flag[username] = True
                msg = {
                    '0': ('退出', None),
                    '1': ('提现', withdraw),
                    '2': ('转账', transfer),
                    '3': ('充值', pay),
                    '4': ('查询余额', check)
                }
                while True:
                    for k in msg:
                        print(k, msg[k][0])
                    cmd = input('请输入命令编号').strip()
                    if cmd not in msg:
                        print('请输入正确编号')
                        continue
                    elif cmd == '0':
                        user_flag[username] = 0
                        break
                    else:
                        msg[cmd][1]()
                break
def register ():
    while True:
        username = input('请输入注册账号:')
        if username in user_info:
                print('账号已存在')
                continue
        else:
            userpwd = input('请输入密码:').strip()
            userpwd1 = input('请确认密码:').strip()
            if userpwd == userpwd1:
                print('两次密码一致,注册成功')
                f.write('{}:{}:{}:{}\n'.format(username,userpwd,0,0))
                break
            else:
                print('两次密码不一致')
                continue
def transfer():
    for i in user_flag:
        if user_flag[i] == True:
            name = i
    while True:
        B_user = input('请输入转入账号:')
        transfer_money = int(input('请输入转出金额:'))
        if B_user not in user_info:
            print('转入账户不存在')
            return
        if user_info[name][1] >= transfer_money:
            user_info[name][1] -= transfer_money
            with open('db.txt', mode='w', encoding='utf-8') as f:
                for k, v in user_info.items():
                    f.write('{}:{}:{}:{}\n'.format(k, v[0], v[1], v[2]))
                print("转账成功,您的余额为:{}".format(user_info[name][1]))
                break
        else:
            print('余额不足')
def withdraw():
    for i in user_flag:
        if user_flag[i] == True:
            name = i
    while True:
        withdraw_money = int(input('请输入提现金额:'))
        if user_info[name][1] >= withdraw_money:
            user_info[name][1] -= withdraw_money
            with open('db.txt', mode='w', encoding='utf-8') as f:
                for k, v in user_info.items():
                    f.write('{}:{}:{}:{}\n'.format(k, v[0], v[1], v[2]))
                print("提现成功,您的余额为:{}".format(user_info[name][1]))
                break
        else:
            print('余额不足')
def check():
    for i in user_flag:
        if user_flag[i] == True:
            name = i
    print('您的余额是:{}'.format(user_info[name][1]))
def pay():
    while True:
        for i in user_flag:
            if user_flag[i] == True:
                name = i
        num = int(input("请输入您充值金额:").strip())
        user_info[name][1] += num
        with open('db.txt', mode='w', encoding='utf-8') as f:
            for k, v in user_info.items():
                f.write('{}:{}:{}:{}\n'.format(k, v[0], v[1], v[2]))
        print("充值成功,您的余额为:{}".format(user_info[name][1]))
        cmd = input('是否继续充值?1:是,任意其他字符:否').strip()
        if cmd == '1':
            continue
        else:
            break
msg = {
    '0':('退出',None),
    '1':('登陆',login),
    '2':('注册',register),
}
while True:
    for k in msg:
        print(k,msg[k][0])
    cmd = input('请输入命令编号:')
    if cmd not in msg:
        print('请输入正确编号')
        continue
    elif cmd == '0':
        break
    else:
        msg[cmd][1]()