zoukankan      html  css  js  c++  java
  • 函数对象与闭包

    1. 函数对象优化多分支if的代码练熟

    def exit():
        print('退出')
    
    
    def login():
        print('登录功能')
    
    
    def transfer():
        print('转账功能个')
    
    
    def check_balance():
        print('余额查询功能')
    
    
    def withdraw():
        print('提现功能')
    
    
    def register():
        print('注册功能')
    
    
    func_dic = {
        '1': ('login',login),
        '2': ('transfer',transfer),
        '3': ('check_balance',check_balance),
        '4': ('withdraw',withdraw),
        '5': ('register',register),
        '0': ('exit',exit),
    }
    
    
    def main():
        for i, j in func_dic.items():
            print('{}:{}'.format(i, j[0]))
        while True:
            operate = input('请输入待选事项序号:')
            if not operate.isdigit():
                print('请重新输入序号')
                continue
            if operate in func_dic:
                func_dic[operate][1]()
            else:
                print('请重新输入正确序号')
    
    
    
    main()

    2. 编写计数器功能,要求调用一次在原有的基础上加一

    def outter_calculate():
        n = 0
    
        def calculate():
            nonlocal n
            n += 1
            return n
        return calculate
    
    
    calculate = outter_calculate()
    print(calculate())
    print(calculate())
    print(calculate())
    print(calculate())
    print(calculate())

    3. ATM程序

    '''
    ATM程序
    # 编写ATM程序实现下述功能,数据来源于文件db.txt
    # 0、注册功能:用户输入账号名、密码、金额,按照固定的格式存入文件db.txt
    # 1、登录功能:用户名不存在,要求必须先注册,用户名存在&输错三次锁定,登录成功后记录下登录状态(提示:可以使用全局变量来记录)
    
    # 下述操作,要求登录后才能操作
    # 1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
    # 2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱
    # 3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
    # 4、查询余额功能:输入账号查询余额
    '''
    import os
    
    login_user = None
    
    
    #  注册功能
    def register():
        while True:
            account_input = input('请输入注册账号:').strip()
            password_input = input('请输入密码:').strip()
            money_input = input('请输入存款额:').strip()
            with open(r'db.txt', 'rt', encoding='utf-8') as f1, 
                    open(r'db.txt', 'at', encoding='utf-8') as f2:
                for line in f1:
                    account, password, money = line.strip().split(':')
                    if account_input == account:
                        print('账号已存在,请重新输入!')
                        break
                else:
                    f2.write('
    {}:{}:{}'.format(account_input, password_input, money_input))
                    global login_user
                    login_user = account_input
                    print('账号注册成功')
                    break
    
    
    #  登录功能
    # login_user = None
    
    
    def login():
        amount = True
        n = 0
        while amount:
            account_input = input('请输入账号:').strip()
            password_input = input('请输入密码:').strip()
            with open(r'db.txt', 'rt', encoding='utf-8') as f1, 
                    open(r'blacklist.txt', 'rt', encoding='utf-8') as f2:
                for line1 in f2:
                    account_black, *_ = line1.strip().split(':')
                    if account_black == account_input:
                        print('对不起,该账号已被锁定,程序即将退出!')
                        exit()
                else:
                    for line2 in f1:
                        account, password, *_ = line2.strip().split(':')
                        if account_input == account:
                            if password_input == password:
                                global login_user
                                login_user = account_input
                                # print('登陆成功')
                                print(login_user)
                                amount = False
                                break
                            elif n == 2:
                                with open(r'blacklist.txt', 'at', encoding='utf-8') as f3:
                                    f3.write('{}:{}
    '.format(account_input, password_input))
                                amount = False
                                print('非常抱歉,您已输错三次密码')
                                print('您的账号已被锁定')
                                break
                            elif password_input != password:
                                n += 1
                                print('密码错误,请重新输入!')
                                print(n)
                                break
                    else:
                        print('用户不存在,请先注册')
                        register()
                        amount = False
    
    
    # 登录后操作
    # 充值功能
    def recharge():
        account = login_user
        money_input = input('请输入充值金额:').strip()
        money_input = int(money_input)
        with open(r'db.txt', 'rt', encoding='utf-8') as f1, 
                open(r'db.txt.swap', 'wt', encoding='utf-8') as f2:
            for line in f1:
                acc, *_, money = line.strip().split(':')
                money = int(money)
                if acc == account:
                    line = line.replace(str(money), str(money + money_input))
                    f2.write(line)
                    print('充值金额为{},余额为{}'.format(money_input, money + money_input))
                else:
                    f2.write(line)
        os.remove(r'db.txt')
        os.rename(r'db.txt.swap', r'db.txt')
    
    
    #  转账功能
    def transfer():
        account = login_user
        account_receive = input('请输入接收账户:')
        money_input = input('请输入转账金额:')
        money_input = int(money_input)
        with open(r'db.txt', 'rt', encoding='utf-8') as f1, 
                open(r'db.txt.swap', 'wt', encoding='utf-8') as f2:
            for line in f1:
                acc, *_, money = line.strip().split(':')
                money = int(money)
                if acc == account:
                    line = line.replace(str(money), str(money - money_input))
                    f2.write(line)
                    print('{}向{}转账{}元,{}余额为{}'.format(account, account_receive, money_input, account, money - money_input))
                elif acc == account_receive:
                    line = line.replace(str(money), str(money + money_input))
                    f2.write(line)
                    print('{}余额为{}'.format(account_receive, money + money_input))
                else:
                    f2.write(line)
    
        os.remove(r'db.txt')
        os.rename(r'db.txt.swap', r'db.txt')
    
    
    # 提现功能
    def withdraw():
        account = login_user
        money_input = input('请输入提现金额:')
        money_input = int(money_input)
        with open(r'db.txt', 'rt', encoding='utf-8') as f1, 
                open(r'db.txt.swap', 'wt', encoding='utf-8') as f2:
            for line in f1:
                acc, *_, money = line.strip().split(':')
                money = int(money)
                if acc == account:
                    line = line.replace(str(money), str(money - money_input))
                    print(money - money_input)
                    f2.write(line)
                    print('提现金额为{},余额为{}'.format(money_input, money - money_input))
                else:
                    f2.write(line)
    
        os.remove(r'db.txt')
        os.rename(r'db.txt.swap', r'db.txt')
    
    
    # 余额查询
    
    def remainder():
        account = login_user
        with open(r'db.txt', 'rt', encoding='utf-8') as f1:
            for line in f1:
                acc, *_, money = line.strip().split(':')
                if acc == account:
                    print('余额为{}元'.format(money))
    
    
    # 主程序
    dic_outer = {
        '1': ('注册', register),
        '2': ('登录', login),
        '0': ('退出', None)
    }
    
    dic_inner = {
        '1': ('充值', recharge),
        '2': ('转账', transfer),
        '3': ('提现', withdraw),
        '4': ('查询余额', remainder),
        '0': ('退出', None)
    }
    
    while True:
        for i, j in dic_outer.items():
            print('{}:{}'.format(i, j[0]))
        choice_out = input('请选择操作项目').strip()
        if not choice_out.isdigit():
            print('请重新输入正确数字')
        if choice_out in dic_outer:
            if choice_out == '0':
                exit()
            else:
                dic_outer[choice_out][1]()
                if login_user == None:
                    print('程序即将退出')
                    break
                # print(login_user)
                while True:
                    for i, j in dic_inner.items():
                        # print(login_user)
                        print('{}:{}'.format(i, j[0]))
                    choice_in = input('请选择操作项目').strip()
                    if not choice_in.isdigit():
                        print('请重新输入正确数字')
                    if choice_in in dic_inner:
                        if choice_in == '0':
                            exit()
                        else:
                            dic_inner[choice_in][1]()
    
        else:
            print('数字超限,请重新输入')
  • 相关阅读:
    快速构建ceph可视化监控系统
    Codeforces Round #277.5 解题报告
    【MapReduce】经常使用计算模型具体解释
    Unity3D教程:静态调用C#的dll
    【Oracle错误集锦】:PLSQL无法直连64位Oracle11g数据库
    关于ios下字体描边的一个细节
    未来社交站点:15秒内让你闻名全球 虚拟现实与社交网络融合
    iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
    Java String对象的经典问题
    jsp+tomcat+ 创建project 配置project
  • 原文地址:https://www.cnblogs.com/avery-w/p/14193077.html
Copyright © 2011-2022 走看看